Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    rb95fe40 r5c4d27f  
    124124
    125125        /// Associates forward declarations of aggregates with their definitions
    126         struct LinkReferenceToTypes final : public WithIndexer, public WithGuards {
     126        struct LinkReferenceToTypes final : public WithIndexer {
    127127                LinkReferenceToTypes( const Indexer *indexer );
    128128                void postvisit( TypeInstType *typeInst );
     
    137137                void postvisit( UnionDecl *unionDecl );
    138138                void postvisit( TraitDecl * traitDecl );
    139 
    140                 void previsit( StructDecl *structDecl );
    141                 void previsit( UnionDecl *unionDecl );
    142 
    143                 void renameGenericParams( std::list< TypeDecl * > & params );
    144139
    145140          private:
     
    152147                ForwardStructsType forwardStructs;
    153148                ForwardUnionsType forwardUnions;
    154                 /// true if currently in a generic type body, so that type parameter instances can be renamed appropriately
    155                 bool inGeneric = false;
    156149        };
    157150
     
    568561        }
    569562
    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 
    596563        void LinkReferenceToTypes::postvisit( StructDecl *structDecl ) {
    597564                // visit struct members first so that the types of self-referencing members are updated properly
     
    621588
    622589        void LinkReferenceToTypes::postvisit( TypeInstType *typeInst ) {
    623                 // ensure generic parameter instances are renamed like the base type
    624                 if ( inGeneric && typeInst->baseType ) typeInst->name = typeInst->baseType->name;
    625590                if ( NamedTypeDecl *namedTypeDecl = local_indexer->lookupType( typeInst->get_name() ) ) {
    626591                        if ( TypeDecl *typeDecl = dynamic_cast< TypeDecl * >( namedTypeDecl ) ) {
Note: See TracChangeset for help on using the changeset viewer.