Changes in src/SymTab/Validate.cc [b95fe40:5c4d27f]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Validate.cc
rb95fe40 r5c4d27f 124 124 125 125 /// Associates forward declarations of aggregates with their definitions 126 struct LinkReferenceToTypes final : public WithIndexer , public WithGuards{126 struct LinkReferenceToTypes final : public WithIndexer { 127 127 LinkReferenceToTypes( const Indexer *indexer ); 128 128 void postvisit( TypeInstType *typeInst ); … … 137 137 void postvisit( UnionDecl *unionDecl ); 138 138 void postvisit( TraitDecl * traitDecl ); 139 140 void previsit( StructDecl *structDecl );141 void previsit( UnionDecl *unionDecl );142 143 void renameGenericParams( std::list< TypeDecl * > & params );144 139 145 140 private: … … 152 147 ForwardStructsType forwardStructs; 153 148 ForwardUnionsType forwardUnions; 154 /// true if currently in a generic type body, so that type parameter instances can be renamed appropriately155 bool inGeneric = false;156 149 }; 157 150 … … 568 561 } 569 562 570 void LinkReferenceToTypes::renameGenericParams( std::list< TypeDecl * > & params ) {571 // rename generic type parameters uniquely so that they do not conflict with user-defined function forall parameters, e.g.572 // forall(otype T)573 // struct Box {574 // T x;575 // };576 // forall(otype T)577 // void f(Box(T) b) {578 // ...579 // }580 // The T in Box and the T in f are different, so internally the naming must reflect that.581 GuardValue( inGeneric );582 inGeneric = ! params.empty();583 for ( TypeDecl * td : params ) {584 td->name = "__" + td->name + "_generic_";585 }586 }587 588 void LinkReferenceToTypes::previsit( StructDecl * structDecl ) {589 renameGenericParams( structDecl->parameters );590 }591 592 void LinkReferenceToTypes::previsit( UnionDecl * unionDecl ) {593 renameGenericParams( unionDecl->parameters );594 }595 596 563 void LinkReferenceToTypes::postvisit( StructDecl *structDecl ) { 597 564 // visit struct members first so that the types of self-referencing members are updated properly … … 621 588 622 589 void LinkReferenceToTypes::postvisit( TypeInstType *typeInst ) { 623 // ensure generic parameter instances are renamed like the base type624 if ( inGeneric && typeInst->baseType ) typeInst->name = typeInst->baseType->name;625 590 if ( NamedTypeDecl *namedTypeDecl = local_indexer->lookupType( typeInst->get_name() ) ) { 626 591 if ( TypeDecl *typeDecl = dynamic_cast< TypeDecl * >( namedTypeDecl ) ) {
Note: See TracChangeset
for help on using the changeset viewer.