Changeset 30bf6bf


Ignore:
Timestamp:
Mar 26, 2025, 3:29:50 PM (3 weeks ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
master
Children:
10c1770
Parents:
379b6ea
Message:

Change to instantiateGeneric, removing some unneeded output. It isn't much more complex but it is and could be reverted need be. Fixes #199.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/InstantiateGeneric.cpp

    r379b6ea r30bf6bf  
    4242
    4343using type_vector = ast::vector< ast::TypeExpr >;
     44
     45template<typename C, typename V>
     46bool contains( C const & container, V const & value ) {
     47        return std::any_of( container.begin(), container.end(),
     48                        [value]( auto& element ){ return element == value; } );
     49}
    4450
    4551/// Abstracts type equality for a list of parameter types.
     
    423429}
    424430
    425 struct GenericInstantiator final :
     431class GenericInstantiator final :
    426432                public ast::WithCodeLocation,
    427433                public ast::WithConstTypeSubstitution,
     
    444450        /// member from an instantiation.
    445451        int memberIndex = -1;
     452        /// The polymorphic types we are currently instantiating.
     453        ast::vector<ast::Decl> instantiating;
     454public:
    446455
    447456        GenericInstantiator() :
     
    597606                        );
    598607
    599                         // Forward declare before recursion. (TODO: Only when needed, #199.)
     608                        // Insert the declaration so it doesn't create it again,
    600609                        insert( inst, typeSubs, newDecl );
    601                         if ( AggrDecl const * forwardDecl = ast::asForward( newDecl ) ) {
    602                                 declsToAddBefore.push_back( forwardDecl );
    603                         }
     610                        // ... but mark this declaration as one we are working on.
     611                        auto guard = makeFuncGuard(
     612                                [this, newDecl](){ instantiating.push_back( newDecl ); },
     613                                [this](){ instantiating.pop_back(); } );
    604614                        // Recursively instantiate members:
    605615                        concDecl = strict_dynamic_cast<AggrDecl const *>(
    606616                                newDecl->accept( *visitor ) );
    607                         // Must occur before declaration is added so
    608                         // that member instantiation appear first.
     617
     618                        // Produce the declaration after its members are instantiated.
    609619                        declsToAddBefore.push_back( concDecl );
     620                } else if ( contains( instantiating, concDecl ) ) {
     621                        if ( AggrDecl const * forwardDecl = ast::asForward( concDecl ) ) {
     622                                declsToAddBefore.push_back( forwardDecl );
     623                        }
    610624                }
    611625                return new ast::SueInstType<AggrDecl>( concDecl, inst->qualifiers );
  • tests/.expect/functions.arm64.txt

    r379b6ea r30bf6bf  
    139139
    140140}
    141 struct _conc__tuple2_0;
    142141struct _conc__tuple2_0 {
    143142    signed int field_0;
     
    182181
    183182}
    184 struct _conc__tuple3_1;
    185183struct _conc__tuple3_1 {
    186184    signed int field_0;
     
    202200    __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
    203201}
    204 struct _conc__tuple3_2;
    205202struct _conc__tuple3_2 {
    206203    signed int field_0;
     
    294291    __attribute__ ((unused)) signed int *const _X10_retval_f3KPi_1;
    295292}
    296 struct _conc__tuple2_3;
    297293struct _conc__tuple2_3 {
    298294    signed int *field_0;
  • tests/.expect/functions.x64.txt

    r379b6ea r30bf6bf  
    139139
    140140}
    141 struct _conc__tuple2_0;
    142141struct _conc__tuple2_0 {
    143142    signed int field_0;
     
    182181
    183182}
    184 struct _conc__tuple3_1;
    185183struct _conc__tuple3_1 {
    186184    signed int field_0;
     
    202200    __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
    203201}
    204 struct _conc__tuple3_2;
    205202struct _conc__tuple3_2 {
    206203    signed int field_0;
     
    294291    __attribute__ ((unused)) signed int *const _X10_retval_f3KPi_1;
    295292}
    296 struct _conc__tuple2_3;
    297293struct _conc__tuple2_3 {
    298294    signed int *field_0;
  • tests/.expect/functions.x86.txt

    r379b6ea r30bf6bf  
    139139
    140140}
    141 struct _conc__tuple2_0;
    142141struct _conc__tuple2_0 {
    143142    signed int field_0;
     
    182181
    183182}
    184 struct _conc__tuple3_1;
    185183struct _conc__tuple3_1 {
    186184    signed int field_0;
     
    202200    __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
    203201}
    204 struct _conc__tuple3_2;
    205202struct _conc__tuple3_2 {
    206203    signed int field_0;
     
    294291    __attribute__ ((unused)) signed int *const _X10_retval_f3KPi_1;
    295292}
    296 struct _conc__tuple2_3;
    297293struct _conc__tuple2_3 {
    298294    signed int *field_0;
Note: See TracChangeset for help on using the changeset viewer.