Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    rb95fe40 r8e0147a  
    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
     
    430423        }
    431424
    432         void checkGenericParameters( ReferenceToType * inst ) {
    433                 for ( Expression * param : inst->parameters ) {
    434                         if ( ! dynamic_cast< TypeExpr * >( param ) ) {
    435                                 throw SemanticError( "Expression parameters for generic types are currently unsupported: ", inst );
    436                         }
    437                 }
    438         }
    439 
    440425        void LinkReferenceToTypes::postvisit( StructInstType *structInst ) {
    441426                StructDecl *st = local_indexer->lookupStruct( structInst->get_name() );
     
    449434                        forwardStructs[ structInst->get_name() ].push_back( structInst );
    450435                } // if
    451                 checkGenericParameters( structInst );
    452436        }
    453437
     
    462446                        forwardUnions[ unionInst->get_name() ].push_back( unionInst );
    463447                } // if
    464                 checkGenericParameters( unionInst );
    465448        }
    466449
     
    542525                // need to carry over the 'sized' status of each decl in the instance
    543526                for ( auto p : group_iterate( traitDecl->get_parameters(), traitInst->get_parameters() ) ) {
    544                         TypeExpr * expr = dynamic_cast< TypeExpr * >( std::get<1>(p) );
    545                         if ( ! expr ) {
    546                                 throw SemanticError( "Expression parameters for trait instances are currently unsupported: ", std::get<1>(p) );
    547                         }
     527                        TypeExpr * expr = strict_dynamic_cast< TypeExpr * >( std::get<1>(p) );
    548528                        if ( TypeInstType * inst = dynamic_cast< TypeInstType * >( expr->get_type() ) ) {
    549529                                TypeDecl * formalDecl = std::get<0>(p);
     
    566546                        } // if
    567547                } // if
    568         }
    569 
    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 );
    594548        }
    595549
     
    621575
    622576        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;
    625577                if ( NamedTypeDecl *namedTypeDecl = local_indexer->lookupType( typeInst->get_name() ) ) {
    626578                        if ( TypeDecl *typeDecl = dynamic_cast< TypeDecl * >( namedTypeDecl ) ) {
Note: See TracChangeset for help on using the changeset viewer.