Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    r5809461 r2bf9c37  
    244244        };
    245245
    246         struct LabelAddressFixer final : public WithGuards {
    247                 std::set< Label > labels;
    248 
    249                 void premutate( FunctionDecl * funcDecl );
    250                 Expression * postmutate( AddressExpr * addrExpr );
    251         };
    252246
    253247        FunctionDecl * dereferenceOperator = nullptr;
     
    263257                PassVisitor<ValidateGenericParameters> genericParams;
    264258                PassVisitor<FindSpecialDeclarations> finder;
    265                 PassVisitor<LabelAddressFixer> labelAddrFixer;
    266259
    267260                EliminateTypedef::eliminateTypedef( translationUnit );
     
    281274                ArrayLength::computeLength( translationUnit );
    282275                acceptAll( translationUnit, finder );
    283                 mutateAll( translationUnit, labelAddrFixer );
    284276        }
    285277
     
    985977        }
    986978
    987         struct LabelFinder {
    988                 std::set< Label > & labels;
    989                 LabelFinder( std::set< Label > & labels ) : labels( labels ) {}
    990                 void previsit( Statement * stmt ) {
    991                         for ( Label & l : stmt->labels ) {
    992                                 labels.insert( l );
    993                         }
    994                 }
    995         };
    996 
    997         void LabelAddressFixer::premutate( FunctionDecl * funcDecl ) {
    998                 GuardValue( labels );
    999                 PassVisitor<LabelFinder> finder( labels );
    1000                 funcDecl->accept( finder );
    1001         }
    1002 
    1003         Expression * LabelAddressFixer::postmutate( AddressExpr * addrExpr ) {
    1004                 // convert &&label into label address
    1005                 if ( AddressExpr * inner = dynamic_cast< AddressExpr * >( addrExpr->arg ) ) {
    1006                         if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( inner->arg ) ) {
    1007                                 if ( labels.count( nameExpr->name ) ) {
    1008                                         Label name = nameExpr->name;
    1009                                         delete addrExpr;
    1010                                         return new LabelAddressExpr( name );
    1011                                 }
    1012                         }
    1013                 }
    1014                 return addrExpr;
    1015         }
    1016 
    1017979        void FindSpecialDeclarations::previsit( FunctionDecl * funcDecl ) {
    1018980                if ( ! dereferenceOperator ) {
Note: See TracChangeset for help on using the changeset viewer.