Changes in src/SymTab/Validate.cc [5809461:2bf9c37]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Validate.cc
r5809461 r2bf9c37 244 244 }; 245 245 246 struct LabelAddressFixer final : public WithGuards {247 std::set< Label > labels;248 249 void premutate( FunctionDecl * funcDecl );250 Expression * postmutate( AddressExpr * addrExpr );251 };252 246 253 247 FunctionDecl * dereferenceOperator = nullptr; … … 263 257 PassVisitor<ValidateGenericParameters> genericParams; 264 258 PassVisitor<FindSpecialDeclarations> finder; 265 PassVisitor<LabelAddressFixer> labelAddrFixer;266 259 267 260 EliminateTypedef::eliminateTypedef( translationUnit ); … … 281 274 ArrayLength::computeLength( translationUnit ); 282 275 acceptAll( translationUnit, finder ); 283 mutateAll( translationUnit, labelAddrFixer );284 276 } 285 277 … … 985 977 } 986 978 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 address1005 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 1017 979 void FindSpecialDeclarations::previsit( FunctionDecl * funcDecl ) { 1018 980 if ( ! dereferenceOperator ) {
Note: See TracChangeset
for help on using the changeset viewer.