Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    r7c919559 r298fe57  
    1010// Created On       : Sun May 17 21:50:04 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Nov 12 11:00:00 2021
    13 // Update Count     : 364
     12// Last Modified On : Fri Apr 29  9:45:00 2022
     13// Update Count     : 365
    1414//
    1515
     
    143143        struct LinkReferenceToTypes_old final : public WithIndexer, public WithGuards, public WithVisitorRef<LinkReferenceToTypes_old>, public WithShortCircuiting {
    144144                LinkReferenceToTypes_old( const Indexer * indexer );
     145
    145146                void postvisit( TypeInstType * typeInst );
    146147
     
    370371        }
    371372
     373        void linkReferenceToTypes( std::list< Declaration * > & translationUnit ) {
     374                PassVisitor<LinkReferenceToTypes_old> lrt( nullptr );
     375                acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
     376        }
     377
    372378        void validate_B( std::list< Declaration * > & translationUnit ) {
    373                 PassVisitor<LinkReferenceToTypes_old> lrt( nullptr );
    374379                PassVisitor<FixQualifiedTypes> fixQual;
    375380                {
    376381                        Stats::Heap::newPass("validate-B");
    377382                        Stats::Time::BlockGuard guard("validate-B");
    378                         acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
     383                        //linkReferenceToTypes( translationUnit );
    379384                        mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes_old, because aggregate members are accessed
    380385                        HoistStruct::hoistStruct( translationUnit );
     
    974979                                        // need to resolve enumerator initializers early so that other passes that determine if an expression is constexpr have the appropriate information.
    975980                                        SingleInit * init = strict_dynamic_cast<SingleInit *>( field->init );
    976                                         ResolvExpr::findSingleExpression( init->value, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), indexer );
     981                                        if ( !enumDecl->base || dynamic_cast<BasicType *>(enumDecl->base))
     982                                                ResolvExpr::findSingleExpression( init->value, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), indexer );
     983                                        else {
     984                                                if (dynamic_cast<PointerType *>(enumDecl->base)) {
     985                                                        auto typePtr = dynamic_cast<PointerType *>(enumDecl->base);
     986                                                        ResolvExpr::findSingleExpression( init->value,
     987                                                         new PointerType( Type::Qualifiers(), typePtr->base ), indexer );
     988                                                } else {
     989                                                        ResolvExpr::findSingleExpression( init->value, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), indexer );
     990                                                }
     991                                        }
     992                                       
    977993                                }
    978994                        }
     995
    979996                } // if
    980997        }
     
    12401257                        declsToAddBefore.push_back( new UnionDecl( aggDecl->name, noAttributes, tyDecl->linkage ) );
    12411258                } else if ( EnumInstType * enumDecl = dynamic_cast< EnumInstType * >( designatorType ) ) {
    1242                         declsToAddBefore.push_back( new EnumDecl( enumDecl->name, noAttributes, tyDecl->linkage ) );
     1259                        // declsToAddBefore.push_back( new EnumDecl( enumDecl->name, noAttributes, tyDecl->linkage, enumDecl->baseEnum->base ) );
     1260                        if (enumDecl->baseEnum) {
     1261                                declsToAddBefore.push_back( new EnumDecl( enumDecl->name, noAttributes, tyDecl->linkage, enumDecl->baseEnum->base ) );
     1262                        } else {
     1263                                declsToAddBefore.push_back( new EnumDecl( enumDecl->name, noAttributes, tyDecl->linkage ) );
     1264                        }
    12431265                } // if
    12441266                return tyDecl->clone();
Note: See TracChangeset for help on using the changeset viewer.