Changeset 185cd94
- Timestamp:
- Mar 27, 2025, 3:48:34 PM (4 days ago)
- Branches:
- master
- Children:
- 52931c5
- Parents:
- b1c220a (diff), 10c1770 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/GenPoly/InstantiateGeneric.cpp ¶
rb1c220a r185cd94 42 42 43 43 using type_vector = ast::vector< ast::TypeExpr >; 44 45 template<typename C, typename V> 46 bool contains( C const & container, V const & value ) { 47 return std::any_of( container.begin(), container.end(), 48 [value]( auto& element ){ return element == value; } ); 49 } 44 50 45 51 /// Abstracts type equality for a list of parameter types. … … 423 429 } 424 430 425 structGenericInstantiator final :431 class GenericInstantiator final : 426 432 public ast::WithCodeLocation, 427 433 public ast::WithConstTypeSubstitution, … … 444 450 /// member from an instantiation. 445 451 int memberIndex = -1; 452 /// The polymorphic types we are currently instantiating. 453 ast::vector<ast::Decl> instantiating; 454 public: 446 455 447 456 GenericInstantiator() : … … 597 606 ); 598 607 599 // Forward declare before recursion. (TODO: Only when needed, #199.)608 // Insert the declaration so it doesn't create it again, 600 609 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(); } ); 604 614 // Recursively instantiate members: 605 615 concDecl = strict_dynamic_cast<AggrDecl const *>( 606 616 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. 609 619 declsToAddBefore.push_back( concDecl ); 620 } else if ( contains( instantiating, concDecl ) ) { 621 if ( AggrDecl const * forwardDecl = ast::asForward( concDecl ) ) { 622 declsToAddBefore.push_back( forwardDecl ); 623 } 610 624 } 611 625 return new ast::SueInstType<AggrDecl>( concDecl, inst->qualifiers ); -
TabularUnified src/ResolvExpr/Resolver.cpp ¶
rb1c220a r185cd94 703 703 } else { 704 704 if ( !objectDecl->isTypeFixed ) { 705 auto newDecl = fixObjectType(objectDecl, context); 706 auto mutDecl = mutate(newDecl); 705 objectDecl = fixObjectType(objectDecl, context); 707 706 708 707 // generate CtorInit wrapper when necessary. … … 710 709 // this object in visitor pass, thus disabling CtorInit codegen. 711 710 // this happens on aggregate members and function parameters. 712 if ( shouldGenCtorInit( mutDecl ) ) {711 if ( shouldGenCtorInit( objectDecl ) ) { 713 712 // constructed objects cannot be designated 714 if ( InitTweak::isDesignated( mutDecl->init ) ) { 715 ast::Pass<ResolveDesignators> res( context ); 716 maybe_accept( mutDecl->init.get(), res ); 717 if ( !res.core.result ) { 718 SemanticError( mutDecl, "Cannot include designations in the initializer for a managed Object.\n" 719 "If this is really what you want, initialize with @=." ); 720 } 713 if ( InitTweak::isDesignated( objectDecl->init ) 714 && !ast::Pass<ResolveDesignators>::read( 715 objectDecl->init.get(), context ) ) { 716 SemanticError( objectDecl, "Cannot include designations in the initializer for a managed Object.\n" 717 "If this is really what you want, initialize with @=." ); 721 718 } 722 719 // constructed objects should not have initializers nested too deeply 723 if ( ! InitTweak::checkInitDepth( mutDecl ) ) SemanticError( mutDecl, "Managed object's initializer is too deep " ); 724 725 mutDecl->init = InitTweak::genCtorInit( mutDecl->location, mutDecl ); 720 if ( !InitTweak::checkInitDepth( objectDecl ) ) SemanticError( objectDecl, "Managed object's initializer is too deep " ); 721 722 objectDecl = ast::mutate_field( objectDecl, &ast::ObjectDecl::init, 723 InitTweak::genCtorInit( objectDecl->location, objectDecl ) ); 726 724 } 727 728 objectDecl = mutDecl;729 725 } 730 726 currentObject = ast::CurrentObject{ objectDecl->location, objectDecl->get_type() }; -
TabularUnified tests/.expect/functions.arm64.txt ¶
rb1c220a r185cd94 139 139 140 140 } 141 struct _conc__tuple2_0;142 141 struct _conc__tuple2_0 { 143 142 signed int field_0; … … 182 181 183 182 } 184 struct _conc__tuple3_1;185 183 struct _conc__tuple3_1 { 186 184 signed int field_0; … … 202 200 __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = { }; 203 201 } 204 struct _conc__tuple3_2;205 202 struct _conc__tuple3_2 { 206 203 signed int field_0; … … 294 291 __attribute__ ((unused)) signed int *const _X10_retval_f3KPi_1; 295 292 } 296 struct _conc__tuple2_3;297 293 struct _conc__tuple2_3 { 298 294 signed int *field_0; -
TabularUnified tests/.expect/functions.x64.txt ¶
rb1c220a r185cd94 139 139 140 140 } 141 struct _conc__tuple2_0;142 141 struct _conc__tuple2_0 { 143 142 signed int field_0; … … 182 181 183 182 } 184 struct _conc__tuple3_1;185 183 struct _conc__tuple3_1 { 186 184 signed int field_0; … … 202 200 __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = { }; 203 201 } 204 struct _conc__tuple3_2;205 202 struct _conc__tuple3_2 { 206 203 signed int field_0; … … 294 291 __attribute__ ((unused)) signed int *const _X10_retval_f3KPi_1; 295 292 } 296 struct _conc__tuple2_3;297 293 struct _conc__tuple2_3 { 298 294 signed int *field_0; -
TabularUnified tests/.expect/functions.x86.txt ¶
rb1c220a r185cd94 139 139 140 140 } 141 struct _conc__tuple2_0;142 141 struct _conc__tuple2_0 { 143 142 signed int field_0; … … 182 181 183 182 } 184 struct _conc__tuple3_1;185 183 struct _conc__tuple3_1 { 186 184 signed int field_0; … … 202 200 __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = { }; 203 201 } 204 struct _conc__tuple3_2;205 202 struct _conc__tuple3_2 { 206 203 signed int field_0; … … 294 291 __attribute__ ((unused)) signed int *const _X10_retval_f3KPi_1; 295 292 } 296 struct _conc__tuple2_3;297 293 struct _conc__tuple2_3 { 298 294 signed int *field_0;
Note: See TracChangeset
for help on using the changeset viewer.