Changeset 7870799 for src/Common
- Timestamp:
- Jul 12, 2019, 10:49:02 AM (6 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- ef5b828
- Parents:
- ee6dbae
- Location:
- src/Common
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/PassVisitor.h
ree6dbae r7870799 60 60 61 61 virtual void visit( ObjectDecl * objectDecl ) override final; 62 virtual void visit( const ObjectDecl * objectDecl ) override final; 62 63 virtual void visit( FunctionDecl * functionDecl ) override final; 64 virtual void visit( const FunctionDecl * functionDecl ) override final; 63 65 virtual void visit( StructDecl * aggregateDecl ) override final; 66 virtual void visit( const StructDecl * aggregateDecl ) override final; 64 67 virtual void visit( UnionDecl * aggregateDecl ) override final; 68 virtual void visit( const UnionDecl * aggregateDecl ) override final; 65 69 virtual void visit( EnumDecl * aggregateDecl ) override final; 70 virtual void visit( const EnumDecl * aggregateDecl ) override final; 66 71 virtual void visit( TraitDecl * aggregateDecl ) override final; 72 virtual void visit( const TraitDecl * aggregateDecl ) override final; 67 73 virtual void visit( TypeDecl * typeDecl ) override final; 74 virtual void visit( const TypeDecl * typeDecl ) override final; 68 75 virtual void visit( TypedefDecl * typeDecl ) override final; 76 virtual void visit( const TypedefDecl * typeDecl ) override final; 69 77 virtual void visit( AsmDecl * asmDecl ) override final; 78 virtual void visit( const AsmDecl * asmDecl ) override final; 70 79 virtual void visit( StaticAssertDecl * assertDecl ) override final; 80 virtual void visit( const StaticAssertDecl * assertDecl ) override final; 71 81 72 82 virtual void visit( CompoundStmt * compoundStmt ) override final; 83 virtual void visit( const CompoundStmt * compoundStmt ) override final; 73 84 virtual void visit( ExprStmt * exprStmt ) override final; 85 virtual void visit( const ExprStmt * exprStmt ) override final; 74 86 virtual void visit( AsmStmt * asmStmt ) override final; 87 virtual void visit( const AsmStmt * asmStmt ) override final; 75 88 virtual void visit( DirectiveStmt * dirStmt ) override final; 89 virtual void visit( const DirectiveStmt * dirStmt ) override final; 76 90 virtual void visit( IfStmt * ifStmt ) override final; 91 virtual void visit( const IfStmt * ifStmt ) override final; 77 92 virtual void visit( WhileStmt * whileStmt ) override final; 93 virtual void visit( const WhileStmt * whileStmt ) override final; 78 94 virtual void visit( ForStmt * forStmt ) override final; 95 virtual void visit( const ForStmt * forStmt ) override final; 79 96 virtual void visit( SwitchStmt * switchStmt ) override final; 97 virtual void visit( const SwitchStmt * switchStmt ) override final; 80 98 virtual void visit( CaseStmt * caseStmt ) override final; 99 virtual void visit( const CaseStmt * caseStmt ) override final; 81 100 virtual void visit( BranchStmt * branchStmt ) override final; 101 virtual void visit( const BranchStmt * branchStmt ) override final; 82 102 virtual void visit( ReturnStmt * returnStmt ) override final; 103 virtual void visit( const ReturnStmt * returnStmt ) override final; 83 104 virtual void visit( ThrowStmt * throwStmt ) override final; 105 virtual void visit( const ThrowStmt * throwStmt ) override final; 84 106 virtual void visit( TryStmt * tryStmt ) override final; 107 virtual void visit( const TryStmt * tryStmt ) override final; 85 108 virtual void visit( CatchStmt * catchStmt ) override final; 109 virtual void visit( const CatchStmt * catchStmt ) override final; 86 110 virtual void visit( FinallyStmt * finallyStmt ) override final; 111 virtual void visit( const FinallyStmt * finallyStmt ) override final; 87 112 virtual void visit( WaitForStmt * waitforStmt ) override final; 113 virtual void visit( const WaitForStmt * waitforStmt ) override final; 88 114 virtual void visit( WithStmt * withStmt ) override final; 115 virtual void visit( const WithStmt * withStmt ) override final; 89 116 virtual void visit( NullStmt * nullStmt ) override final; 117 virtual void visit( const NullStmt * nullStmt ) override final; 90 118 virtual void visit( DeclStmt * declStmt ) override final; 119 virtual void visit( const DeclStmt * declStmt ) override final; 91 120 virtual void visit( ImplicitCtorDtorStmt * impCtorDtorStmt ) override final; 121 virtual void visit( const ImplicitCtorDtorStmt * impCtorDtorStmt ) override final; 92 122 93 123 virtual void visit( ApplicationExpr * applicationExpr ) override final; 124 virtual void visit( const ApplicationExpr * applicationExpr ) override final; 94 125 virtual void visit( UntypedExpr * untypedExpr ) override final; 126 virtual void visit( const UntypedExpr * untypedExpr ) override final; 95 127 virtual void visit( NameExpr * nameExpr ) override final; 128 virtual void visit( const NameExpr * nameExpr ) override final; 96 129 virtual void visit( CastExpr * castExpr ) override final; 130 virtual void visit( const CastExpr * castExpr ) override final; 97 131 virtual void visit( KeywordCastExpr * castExpr ) override final; 132 virtual void visit( const KeywordCastExpr * castExpr ) override final; 98 133 virtual void visit( VirtualCastExpr * castExpr ) override final; 134 virtual void visit( const VirtualCastExpr * castExpr ) override final; 99 135 virtual void visit( AddressExpr * addressExpr ) override final; 136 virtual void visit( const AddressExpr * addressExpr ) override final; 100 137 virtual void visit( LabelAddressExpr * labAddressExpr ) override final; 138 virtual void visit( const LabelAddressExpr * labAddressExpr ) override final; 101 139 virtual void visit( UntypedMemberExpr * memberExpr ) override final; 140 virtual void visit( const UntypedMemberExpr * memberExpr ) override final; 102 141 virtual void visit( MemberExpr * memberExpr ) override final; 142 virtual void visit( const MemberExpr * memberExpr ) override final; 103 143 virtual void visit( VariableExpr * variableExpr ) override final; 144 virtual void visit( const VariableExpr * variableExpr ) override final; 104 145 virtual void visit( ConstantExpr * constantExpr ) override final; 146 virtual void visit( const ConstantExpr * constantExpr ) override final; 105 147 virtual void visit( SizeofExpr * sizeofExpr ) override final; 148 virtual void visit( const SizeofExpr * sizeofExpr ) override final; 106 149 virtual void visit( AlignofExpr * alignofExpr ) override final; 150 virtual void visit( const AlignofExpr * alignofExpr ) override final; 107 151 virtual void visit( UntypedOffsetofExpr * offsetofExpr ) override final; 152 virtual void visit( const UntypedOffsetofExpr * offsetofExpr ) override final; 108 153 virtual void visit( OffsetofExpr * offsetofExpr ) override final; 154 virtual void visit( const OffsetofExpr * offsetofExpr ) override final; 109 155 virtual void visit( OffsetPackExpr * offsetPackExpr ) override final; 156 virtual void visit( const OffsetPackExpr * offsetPackExpr ) override final; 110 157 virtual void visit( AttrExpr * attrExpr ) override final; 158 virtual void visit( const AttrExpr * attrExpr ) override final; 111 159 virtual void visit( LogicalExpr * logicalExpr ) override final; 160 virtual void visit( const LogicalExpr * logicalExpr ) override final; 112 161 virtual void visit( ConditionalExpr * conditionalExpr ) override final; 162 virtual void visit( const ConditionalExpr * conditionalExpr ) override final; 113 163 virtual void visit( CommaExpr * commaExpr ) override final; 164 virtual void visit( const CommaExpr * commaExpr ) override final; 114 165 virtual void visit( TypeExpr * typeExpr ) override final; 166 virtual void visit( const TypeExpr * typeExpr ) override final; 115 167 virtual void visit( AsmExpr * asmExpr ) override final; 168 virtual void visit( const AsmExpr * asmExpr ) override final; 116 169 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) override final; 170 virtual void visit( const ImplicitCopyCtorExpr * impCpCtorExpr ) override final; 117 171 virtual void visit( ConstructorExpr * ctorExpr ) override final; 172 virtual void visit( const ConstructorExpr * ctorExpr ) override final; 118 173 virtual void visit( CompoundLiteralExpr * compLitExpr ) override final; 174 virtual void visit( const CompoundLiteralExpr * compLitExpr ) override final; 119 175 virtual void visit( RangeExpr * rangeExpr ) override final; 176 virtual void visit( const RangeExpr * rangeExpr ) override final; 120 177 virtual void visit( UntypedTupleExpr * tupleExpr ) override final; 178 virtual void visit( const UntypedTupleExpr * tupleExpr ) override final; 121 179 virtual void visit( TupleExpr * tupleExpr ) override final; 180 virtual void visit( const TupleExpr * tupleExpr ) override final; 122 181 virtual void visit( TupleIndexExpr * tupleExpr ) override final; 182 virtual void visit( const TupleIndexExpr * tupleExpr ) override final; 123 183 virtual void visit( TupleAssignExpr * assignExpr ) override final; 184 virtual void visit( const TupleAssignExpr * assignExpr ) override final; 124 185 virtual void visit( StmtExpr * stmtExpr ) override final; 186 virtual void visit( const StmtExpr * stmtExpr ) override final; 125 187 virtual void visit( UniqueExpr * uniqueExpr ) override final; 188 virtual void visit( const UniqueExpr * uniqueExpr ) override final; 126 189 virtual void visit( UntypedInitExpr * initExpr ) override final; 190 virtual void visit( const UntypedInitExpr * initExpr ) override final; 127 191 virtual void visit( InitExpr * initExpr ) override final; 192 virtual void visit( const InitExpr * initExpr ) override final; 128 193 virtual void visit( DeletedExpr * delExpr ) override final; 194 virtual void visit( const DeletedExpr * delExpr ) override final; 129 195 virtual void visit( DefaultArgExpr * argExpr ) override final; 196 virtual void visit( const DefaultArgExpr * argExpr ) override final; 130 197 virtual void visit( GenericExpr * genExpr ) override final; 198 virtual void visit( const GenericExpr * genExpr ) override final; 131 199 132 200 virtual void visit( VoidType * basicType ) override final; 201 virtual void visit( const VoidType * basicType ) override final; 133 202 virtual void visit( BasicType * basicType ) override final; 203 virtual void visit( const BasicType * basicType ) override final; 134 204 virtual void visit( PointerType * pointerType ) override final; 205 virtual void visit( const PointerType * pointerType ) override final; 135 206 virtual void visit( ArrayType * arrayType ) override final; 207 virtual void visit( const ArrayType * arrayType ) override final; 136 208 virtual void visit( ReferenceType * referenceType ) override final; 209 virtual void visit( const ReferenceType * referenceType ) override final; 137 210 virtual void visit( QualifiedType * qualType ) override final; 211 virtual void visit( const QualifiedType * qualType ) override final; 138 212 virtual void visit( FunctionType * functionType ) override final; 213 virtual void visit( const FunctionType * functionType ) override final; 139 214 virtual void visit( StructInstType * aggregateUseType ) override final; 215 virtual void visit( const StructInstType * aggregateUseType ) override final; 140 216 virtual void visit( UnionInstType * aggregateUseType ) override final; 217 virtual void visit( const UnionInstType * aggregateUseType ) override final; 141 218 virtual void visit( EnumInstType * aggregateUseType ) override final; 219 virtual void visit( const EnumInstType * aggregateUseType ) override final; 142 220 virtual void visit( TraitInstType * aggregateUseType ) override final; 221 virtual void visit( const TraitInstType * aggregateUseType ) override final; 143 222 virtual void visit( TypeInstType * aggregateUseType ) override final; 223 virtual void visit( const TypeInstType * aggregateUseType ) override final; 144 224 virtual void visit( TupleType * tupleType ) override final; 225 virtual void visit( const TupleType * tupleType ) override final; 145 226 virtual void visit( TypeofType * typeofType ) override final; 227 virtual void visit( const TypeofType * typeofType ) override final; 146 228 virtual void visit( AttrType * attrType ) override final; 229 virtual void visit( const AttrType * attrType ) override final; 147 230 virtual void visit( VarArgsType * varArgsType ) override final; 231 virtual void visit( const VarArgsType * varArgsType ) override final; 148 232 virtual void visit( ZeroType * zeroType ) override final; 233 virtual void visit( const ZeroType * zeroType ) override final; 149 234 virtual void visit( OneType * oneType ) override final; 235 virtual void visit( const OneType * oneType ) override final; 150 236 virtual void visit( GlobalScopeType * globalType ) override final; 237 virtual void visit( const GlobalScopeType * globalType ) override final; 151 238 152 239 virtual void visit( Designation * designation ) override final; 240 virtual void visit( const Designation * designation ) override final; 153 241 virtual void visit( SingleInit * singleInit ) override final; 242 virtual void visit( const SingleInit * singleInit ) override final; 154 243 virtual void visit( ListInit * listInit ) override final; 244 virtual void visit( const ListInit * listInit ) override final; 155 245 virtual void visit( ConstructorInit * ctorInit ) override final; 246 virtual void visit( const ConstructorInit * ctorInit ) override final; 156 247 157 248 virtual void visit( Constant * constant ) override final; 249 virtual void visit( const Constant * constant ) override final; 158 250 159 251 virtual void visit( Attribute * attribute ) override final; 252 virtual void visit( const Attribute * attribute ) override final; 160 253 161 254 virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ) override final; … … 265 358 266 359 template<typename pass_t> friend void acceptAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor ); 360 template<typename pass_t> friend void acceptAll( const std::list< const Declaration * > &decls, PassVisitor< pass_t >& visitor ); 267 361 template<typename pass_t> friend void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor ); 268 362 template< typename TreeType, typename pass_t > friend void maybeAccept_impl( TreeType * tree, PassVisitor< pass_t > & visitor ); 363 template< typename TreeType, typename pass_t > friend void maybeAccept_impl( const TreeType * tree, PassVisitor< pass_t > & visitor ); 269 364 template< typename TreeType, typename pass_t > friend void maybeMutate_impl( TreeType *& tree, PassVisitor< pass_t > & mutator ); 270 365 template< typename Container, typename pass_t > friend void maybeAccept_impl( Container & container, PassVisitor< pass_t > & visitor ); 366 template< typename Container, typename pass_t > friend void maybeAccept_impl( const Container & container, PassVisitor< pass_t > & visitor ); 271 367 template< typename Container, typename pass_t > friend void maybeMutate_impl( Container & container, PassVisitor< pass_t > & mutator ); 272 368 273 369 template<typename node_type> void call_previsit ( node_type * node ) { previsit_impl ( pass, node, 0 ); } 370 template<typename node_type> void call_previsit ( const node_type * node ) { previsit_impl ( pass, node, 0 ); } 274 371 template<typename node_type> void call_postvisit( node_type * node ) { postvisit_impl( pass, node, 0 ); } 372 template<typename node_type> void call_postvisit( const node_type * node ) { postvisit_impl( pass, node, 0 ); } 275 373 276 374 template<typename node_type> void call_premutate ( node_type * node ) { premutate_impl( pass, node, 0 ); } … … 286 384 void visitStatementList ( std::list< Statement* > &statements ); 287 385 void mutateStatementList( std::list< Statement* > &statements ); 386 void visitStatementList ( const std::list< Statement * > & statements ); 288 387 289 388 template< typename func_t > … … 291 390 Statement * visitStatement ( Statement * stmt ); 292 391 Statement * mutateStatement( Statement * stmt ); 392 void visitStatement ( const Statement * stmt ); 293 393 294 394 template< typename func_t > … … 296 396 Expression * visitExpression ( Expression * expr ); 297 397 Expression * mutateExpression( Expression * expr ); 398 void visitExpression ( const Expression * expr ); 298 399 299 400 -
src/Common/PassVisitor.impl.h
ree6dbae r7870799 80 80 81 81 template< typename pass_type > 82 inline void acceptAll( const std::list< const Declaration * > & decls, PassVisitor< pass_type >& visitor ) { 83 SemanticErrorException errors; 84 85 pass_visitor_stats.depth++; 86 pass_visitor_stats.max->push(pass_visitor_stats.depth); 87 pass_visitor_stats.avg->push(pass_visitor_stats.depth); 88 for ( const Declaration * decl : decls ) { 89 try { 90 // run visitor on declaration 91 maybeAccept_impl( decl, visitor ); 92 } 93 catch( SemanticErrorException &e ) { 94 errors.append( e ); 95 } 96 } 97 pass_visitor_stats.depth--; 98 if ( ! errors.isEmpty() ) { 99 throw errors; 100 } 101 } 102 103 template< typename pass_type > 82 104 inline void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& mutator ) { 83 105 DeclList_t* beforeDecls = mutator.get_beforeDecls(); … … 117 139 } 118 140 141 template< typename TreeType, typename pass_type > 142 inline void maybeAccept_impl( const TreeType * tree, PassVisitor< pass_type > & visitor ) { 143 if ( ! visitor.get_visit_children() ) return; 144 if ( tree ) { 145 tree->accept( visitor ); 146 } 147 } 148 119 149 template< typename Container, typename pass_type > 120 150 inline void maybeAccept_impl( Container & container, PassVisitor< pass_type > & visitor ) { … … 129 159 if ( *i ) { 130 160 (*i)->accept( visitor ); 161 } 162 } catch( SemanticErrorException &e ) { 163 errors.append( e ); 164 } 165 } 166 pass_visitor_stats.depth--; 167 if ( ! errors.isEmpty() ) { 168 throw errors; 169 } 170 } 171 172 template< typename Container, typename pass_type > 173 inline void maybeAccept_impl( const Container & container, PassVisitor< pass_type > & visitor ) { 174 if ( ! visitor.get_visit_children() ) return; 175 SemanticErrorException errors; 176 177 pass_visitor_stats.depth++; 178 pass_visitor_stats.max->push(pass_visitor_stats.depth); 179 pass_visitor_stats.avg->push(pass_visitor_stats.depth); 180 for ( const auto & i : container ) { 181 try { 182 if ( i ) { 183 i->accept( visitor ); 131 184 } 132 185 } catch( SemanticErrorException &e ) { … … 227 280 228 281 template< typename pass_type > 282 void PassVisitor< pass_type >::visitStatementList( const std::list< Statement * > & statements ) { 283 if ( ! get_visit_children() ) return; 284 SemanticErrorException errors; 285 286 pass_visitor_stats.depth++; 287 pass_visitor_stats.max->push(pass_visitor_stats.depth); 288 pass_visitor_stats.avg->push(pass_visitor_stats.depth); 289 for ( const Statement * i : statements ) { 290 try { 291 maybeAccept_impl( i, *this ); 292 } catch ( SemanticErrorException &e ) { 293 errors.append( e ); 294 } 295 } 296 pass_visitor_stats.depth--; 297 if ( !errors.isEmpty() ) { throw errors; } 298 } 299 300 template< typename pass_type > 229 301 void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) { 230 302 handleStatementList( statements, [this]( Statement *& stmt) { … … 275 347 276 348 template< typename pass_type > 349 void PassVisitor< pass_type >::visitStatement( const Statement * stmt ) { 350 if ( ! get_visit_children() ) return; 351 352 // don't want statements from outer CompoundStmts to be added to this CompoundStmt 353 ValueGuardPtr< typename std::remove_pointer<decltype(get_env_ptr())>::type > oldEnv( get_env_ptr() ); 354 355 maybeAccept_impl( stmt, *this ); 356 } 357 358 template< typename pass_type > 277 359 Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) { 278 360 return handleStatement( stmt, [this]( Statement * stmt ) { … … 306 388 307 389 template< typename pass_type > 390 void PassVisitor< pass_type >::visitExpression( const Expression * expr ) { 391 if ( ! get_visit_children() ) return; 392 if( !expr ) return; 393 394 auto env_ptr = get_env_ptr(); 395 if ( env_ptr && expr->get_env() ) { 396 *env_ptr = expr->get_env(); 397 } 398 399 maybeAccept_impl( expr, *this ); 400 } 401 402 template< typename pass_type > 308 403 Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) { 309 404 return handleExpression(expr, [this]( Expression * expr ) { … … 315 410 template< typename TreeType, typename VisitorType > 316 411 inline void indexerScopedAccept( TreeType * tree, VisitorType & visitor ) { 412 if ( ! visitor.get_visit_children() ) return; 413 auto guard = makeFuncGuard( 414 [&visitor]() { visitor.indexerScopeEnter(); }, 415 [&visitor]() { visitor.indexerScopeLeave(); } 416 ); 417 maybeAccept_impl( tree, visitor ); 418 } 419 420 template< typename TreeType, typename VisitorType > 421 inline void indexerScopedAccept( const TreeType * tree, VisitorType & visitor ) { 317 422 if ( ! visitor.get_visit_children() ) return; 318 423 auto guard = makeFuncGuard( … … 372 477 373 478 indexerAddId( node ); 479 480 VISIT_END( node ); 481 } 482 483 template< typename pass_type > 484 void PassVisitor< pass_type >::visit( const ObjectDecl * node ) { 485 VISIT_START( node ); 486 487 maybeAccept_impl( node->type , *this ); 488 maybeAccept_impl( node->init , *this ); 489 maybeAccept_impl( node->bitfieldWidth, *this ); 490 maybeAccept_impl( node->attributes , *this ); 374 491 375 492 VISIT_END( node ); … … 428 545 429 546 template< typename pass_type > 547 void PassVisitor< pass_type >::visit( const FunctionDecl * node ) { 548 VISIT_START( node ); 549 550 maybeAccept_impl( node->withExprs, *this ); 551 { 552 // implicit add __func__ identifier as specified in the C manual 6.4.2.2 553 static ObjectDecl func( 554 "__func__", noStorageClasses, LinkageSpec::C, nullptr, 555 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ), 556 nullptr 557 ); 558 maybeAccept_impl( node->type, *this ); 559 // function body needs to have the same scope as parameters - CompoundStmt will not enter 560 // a new scope if inFunction is true 561 ValueGuard< bool > oldInFunction( inFunction ); 562 inFunction = true; 563 maybeAccept_impl( node->statements, *this ); 564 maybeAccept_impl( node->attributes, *this ); 565 } 566 567 VISIT_END( node ); 568 } 569 570 template< typename pass_type > 430 571 DeclarationWithType * PassVisitor< pass_type >::mutate( FunctionDecl * node ) { 431 572 MUTATE_START( node ); … … 484 625 485 626 template< typename pass_type > 627 void PassVisitor< pass_type >::visit( const StructDecl * node ) { 628 VISIT_START( node ); 629 630 maybeAccept_impl( node->parameters, *this ); 631 maybeAccept_impl( node->members , *this ); 632 633 VISIT_END( node ); 634 } 635 636 template< typename pass_type > 486 637 Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) { 487 638 MUTATE_START( node ); … … 522 673 VISIT_END( node ); 523 674 } 675 template< typename pass_type > 676 void PassVisitor< pass_type >::visit( const UnionDecl * node ) { 677 VISIT_START( node ); 678 679 maybeAccept_impl( node->parameters, *this ); 680 maybeAccept_impl( node->members , *this ); 681 682 VISIT_END( node ); 683 } 524 684 525 685 template< typename pass_type > … … 557 717 558 718 template< typename pass_type > 719 void PassVisitor< pass_type >::visit( const EnumDecl * node ) { 720 VISIT_START( node ); 721 722 // unlike structs, traits, and unions, enums inject their members into the global scope 723 maybeAccept_impl( node->parameters, *this ); 724 maybeAccept_impl( node->members , *this ); 725 726 VISIT_END( node ); 727 } 728 729 template< typename pass_type > 559 730 Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) { 560 731 MUTATE_START( node ); … … 587 758 588 759 template< typename pass_type > 760 void PassVisitor< pass_type >::visit( const TraitDecl * node ) { 761 VISIT_START( node ); 762 763 maybeAccept_impl( node->parameters, *this ); 764 maybeAccept_impl( node->members , *this ); 765 766 VISIT_END( node ); 767 } 768 769 template< typename pass_type > 589 770 Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) { 590 771 MUTATE_START( node ); … … 625 806 } 626 807 808 809 template< typename pass_type > 810 void PassVisitor< pass_type >::visit( const TypeDecl * node ) { 811 VISIT_START( node ); 812 813 maybeAccept_impl( node->parameters, *this ); 814 maybeAccept_impl( node->base , *this ); 815 maybeAccept_impl( node->assertions, *this ); 816 817 VISIT_END( node ); 818 } 819 627 820 template< typename pass_type > 628 821 Declaration * PassVisitor< pass_type >::mutate( TypeDecl * node ) { … … 667 860 668 861 template< typename pass_type > 862 void PassVisitor< pass_type >::visit( const TypedefDecl * node ) { 863 VISIT_START( node ); 864 865 maybeAccept_impl( node->parameters, *this ); 866 maybeAccept_impl( node->base , *this ); 867 maybeAccept_impl( node->assertions, *this ); 868 869 VISIT_END( node ); 870 } 871 872 template< typename pass_type > 669 873 Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) { 670 874 MUTATE_START( node ); … … 695 899 696 900 template< typename pass_type > 901 void PassVisitor< pass_type >::visit( const AsmDecl * node ) { 902 VISIT_START( node ); 903 904 maybeAccept_impl( node->stmt, *this ); 905 906 VISIT_END( node ); 907 } 908 909 template< typename pass_type > 697 910 AsmDecl * PassVisitor< pass_type >::mutate( AsmDecl * node ) { 698 911 MUTATE_START( node ); … … 710 923 711 924 node->condition = visitExpression( node->condition ); 925 maybeAccept_impl( node->message, *this ); 926 927 VISIT_END( node ); 928 } 929 930 template< typename pass_type > 931 void PassVisitor< pass_type >::visit( const StaticAssertDecl * node ) { 932 VISIT_START( node ); 933 934 visitExpression( node->condition ); 712 935 maybeAccept_impl( node->message, *this ); 713 936 … … 742 965 743 966 template< typename pass_type > 967 void PassVisitor< pass_type >::visit( const CompoundStmt * node ) { 968 VISIT_START( node ); 969 { 970 // do not enter a new scope if inFunction is true - needs to check old state before the assignment 971 ValueGuard< bool > oldInFunction( inFunction ); 972 auto guard1 = makeFuncGuard( [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeEnter(); }, [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeLeave(); } ); 973 auto guard2 = makeFuncGuard( [this]() { call_beginScope(); }, [this]() { call_endScope(); } ); 974 inFunction = false; 975 visitStatementList( node->kids ); 976 } 977 VISIT_END( node ); 978 } 979 980 template< typename pass_type > 744 981 CompoundStmt * PassVisitor< pass_type >::mutate( CompoundStmt * node ) { 745 982 MUTATE_START( node ); … … 767 1004 768 1005 template< typename pass_type > 1006 void PassVisitor< pass_type >::visit( const ExprStmt * node ) { 1007 VISIT_START( node ); 1008 1009 visitExpression( node->expr ); 1010 1011 VISIT_END( node ); 1012 } 1013 1014 template< typename pass_type > 769 1015 Statement * PassVisitor< pass_type >::mutate( ExprStmt * node ) { 770 1016 MUTATE_START( node ); … … 790 1036 791 1037 template< typename pass_type > 1038 void PassVisitor< pass_type >::visit( const AsmStmt * node ) { 1039 VISIT_START( node ) 1040 1041 maybeAccept_impl( node->instruction, *this ); 1042 maybeAccept_impl( node->output, *this ); 1043 maybeAccept_impl( node->input, *this ); 1044 maybeAccept_impl( node->clobber, *this ); 1045 1046 VISIT_END( node ); 1047 } 1048 1049 template< typename pass_type > 792 1050 Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) { 793 1051 MUTATE_START( node ); … … 811 1069 812 1070 template< typename pass_type > 1071 void PassVisitor< pass_type >::visit( const DirectiveStmt * node ) { 1072 VISIT_START( node ) 1073 1074 VISIT_END( node ); 1075 } 1076 1077 template< typename pass_type > 813 1078 Statement * PassVisitor< pass_type >::mutate( DirectiveStmt * node ) { 814 1079 MUTATE_START( node ); … … 825 1090 // if statements introduce a level of scope (for the initialization) 826 1091 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 827 maybeAccept_impl( node-> get_initialization(), *this );1092 maybeAccept_impl( node->initialization, *this ); 828 1093 visitExpression ( node->condition ); 829 1094 node->thenPart = visitStatement( node->thenPart ); … … 834 1099 835 1100 template< typename pass_type > 1101 void PassVisitor< pass_type >::visit( const IfStmt * node ) { 1102 VISIT_START( node ); 1103 1104 maybeAccept_impl( node->initialization, *this ); 1105 visitExpression ( node->condition ); 1106 visitStatement( node->thenPart ); 1107 visitStatement( node->elsePart ); 1108 1109 VISIT_END( node ); 1110 } 1111 1112 template< typename pass_type > 836 1113 Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) { 837 1114 MUTATE_START( node ); … … 839 1116 // if statements introduce a level of scope (for the initialization) 840 1117 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 841 maybeMutate_impl( node-> get_initialization(), *this );1118 maybeMutate_impl( node->initialization, *this ); 842 1119 node->condition = mutateExpression( node->condition ); 843 1120 node->thenPart = mutateStatement ( node->thenPart ); … … 860 1137 node->body = visitStatement( node->body ); 861 1138 } 1139 1140 VISIT_END( node ); 1141 } 1142 1143 template< typename pass_type > 1144 void PassVisitor< pass_type >::visit( const WhileStmt * node ) { 1145 VISIT_START( node ); 1146 1147 maybeAccept_impl( node->initialization, *this ); 1148 visitExpression ( node->condition ); 1149 visitStatement( node->body ); 862 1150 863 1151 VISIT_END( node ); … … 897 1185 898 1186 template< typename pass_type > 1187 void PassVisitor< pass_type >::visit( const ForStmt * node ) { 1188 VISIT_START( node ); 1189 1190 maybeAccept_impl( node->initialization, *this ); 1191 visitExpression( node->condition ); 1192 visitExpression( node->increment ); 1193 visitStatement( node->body ); 1194 1195 VISIT_END( node ); 1196 } 1197 1198 template< typename pass_type > 899 1199 Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) { 900 1200 MUTATE_START( node ); … … 923 1223 924 1224 template< typename pass_type > 1225 void PassVisitor< pass_type >::visit( const SwitchStmt * node ) { 1226 VISIT_START( node ); 1227 1228 visitExpression ( node->condition ); 1229 visitStatementList( node->statements ); 1230 1231 VISIT_END( node ); 1232 } 1233 1234 template< typename pass_type > 925 1235 Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) { 926 1236 MUTATE_START( node ); … … 945 1255 946 1256 template< typename pass_type > 1257 void PassVisitor< pass_type >::visit( const CaseStmt * node ) { 1258 VISIT_START( node ); 1259 1260 visitExpression ( node->condition ); 1261 visitStatementList( node->stmts ); 1262 1263 VISIT_END( node ); 1264 } 1265 1266 template< typename pass_type > 947 1267 Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) { 948 1268 MUTATE_START( node ); … … 963 1283 964 1284 template< typename pass_type > 1285 void PassVisitor< pass_type >::visit( const BranchStmt * node ) { 1286 VISIT_START( node ); 1287 VISIT_END( node ); 1288 } 1289 1290 template< typename pass_type > 965 1291 Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) { 966 1292 MUTATE_START( node ); … … 980 1306 981 1307 template< typename pass_type > 1308 void PassVisitor< pass_type >::visit( const ReturnStmt * node ) { 1309 VISIT_START( node ); 1310 1311 visitExpression( node->expr ); 1312 1313 VISIT_END( node ); 1314 } 1315 1316 template< typename pass_type > 982 1317 Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) { 983 1318 MUTATE_START( node ); … … 990 1325 //-------------------------------------------------------------------------- 991 1326 // ThrowStmt 992 993 1327 template< typename pass_type > 994 1328 void PassVisitor< pass_type >::visit( ThrowStmt * node ) { … … 1002 1336 1003 1337 template< typename pass_type > 1338 void PassVisitor< pass_type >::visit( const ThrowStmt * node ) { 1339 VISIT_START( node ); 1340 1341 maybeAccept_impl( node->expr, *this ); 1342 maybeAccept_impl( node->target, *this ); 1343 1344 VISIT_END( node ); 1345 } 1346 1347 template< typename pass_type > 1004 1348 Statement * PassVisitor< pass_type >::mutate( ThrowStmt * node ) { 1005 1349 MUTATE_START( node ); … … 1015 1359 template< typename pass_type > 1016 1360 void PassVisitor< pass_type >::visit( TryStmt * node ) { 1361 VISIT_START( node ); 1362 1363 maybeAccept_impl( node->block , *this ); 1364 maybeAccept_impl( node->handlers , *this ); 1365 maybeAccept_impl( node->finallyBlock, *this ); 1366 1367 VISIT_END( node ); 1368 } 1369 1370 template< typename pass_type > 1371 void PassVisitor< pass_type >::visit( const TryStmt * node ) { 1017 1372 VISIT_START( node ); 1018 1373 … … 1051 1406 1052 1407 template< typename pass_type > 1408 void PassVisitor< pass_type >::visit( const CatchStmt * node ) { 1409 VISIT_START( node ); 1410 1411 maybeAccept_impl( node->decl, *this ); 1412 visitExpression( node->cond ); 1413 visitStatement ( node->body ); 1414 1415 VISIT_END( node ); 1416 } 1417 1418 template< typename pass_type > 1053 1419 Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) { 1054 1420 MUTATE_START( node ); … … 1075 1441 1076 1442 template< typename pass_type > 1443 void PassVisitor< pass_type >::visit( const FinallyStmt * node ) { 1444 VISIT_START( node ); 1445 1446 maybeAccept_impl( node->block, *this ); 1447 1448 VISIT_END( node ); 1449 } 1450 1451 template< typename pass_type > 1077 1452 Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) { 1078 1453 MUTATE_START( node ); … … 1107 1482 1108 1483 template< typename pass_type > 1484 void PassVisitor< pass_type >::visit( const WaitForStmt * node ) { 1485 VISIT_START( node ); 1486 1487 for( auto & clause : node->clauses ) { 1488 maybeAccept_impl( clause.target.function, *this ); 1489 maybeAccept_impl( clause.target.arguments, *this ); 1490 1491 maybeAccept_impl( clause.statement, *this ); 1492 maybeAccept_impl( clause.condition, *this ); 1493 } 1494 1495 maybeAccept_impl( node->timeout.time, *this ); 1496 maybeAccept_impl( node->timeout.statement, *this ); 1497 maybeAccept_impl( node->timeout.condition, *this ); 1498 maybeAccept_impl( node->orelse.statement, *this ); 1499 maybeAccept_impl( node->orelse.condition, *this ); 1500 1501 VISIT_END( node ); 1502 } 1503 1504 template< typename pass_type > 1109 1505 Statement * PassVisitor< pass_type >::mutate( WaitForStmt * node ) { 1110 1506 MUTATE_START( node ); … … 1130 1526 1131 1527 //-------------------------------------------------------------------------- 1132 // NullStmt1528 // WithStmt 1133 1529 template< typename pass_type > 1134 1530 void PassVisitor< pass_type >::visit( WithStmt * node ) { … … 1145 1541 1146 1542 template< typename pass_type > 1543 void PassVisitor< pass_type >::visit( const WithStmt * node ) { 1544 VISIT_START( node ); 1545 1546 maybeAccept_impl( node->exprs, *this ); 1547 maybeAccept_impl( node->stmt, *this ); 1548 1549 VISIT_END( node ); 1550 } 1551 1552 template< typename pass_type > 1147 1553 Statement * PassVisitor< pass_type >::mutate( WithStmt * node ) { 1148 1554 MUTATE_START( node ); … … 1166 1572 1167 1573 template< typename pass_type > 1574 void PassVisitor< pass_type >::visit( const NullStmt * node ) { 1575 VISIT_START( node ); 1576 VISIT_END( node ); 1577 } 1578 1579 template< typename pass_type > 1168 1580 NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) { 1169 1581 MUTATE_START( node ); … … 1183 1595 1184 1596 template< typename pass_type > 1597 void PassVisitor< pass_type >::visit( const DeclStmt * node ) { 1598 VISIT_START( node ); 1599 1600 maybeAccept_impl( node->decl, *this ); 1601 1602 VISIT_END( node ); 1603 } 1604 1605 template< typename pass_type > 1185 1606 Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) { 1186 1607 MUTATE_START( node ); … … 1195 1616 template< typename pass_type > 1196 1617 void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) { 1618 VISIT_START( node ); 1619 1620 maybeAccept_impl( node->callStmt, *this ); 1621 1622 VISIT_END( node ); 1623 } 1624 1625 template< typename pass_type > 1626 void PassVisitor< pass_type >::visit( const ImplicitCtorDtorStmt * node ) { 1197 1627 VISIT_START( node ); 1198 1628 … … 1220 1650 maybeAccept_impl ( node->function, *this ); 1221 1651 maybeAccept_impl ( node->args , *this ); 1652 1653 VISIT_END( node ); 1654 } 1655 1656 template< typename pass_type > 1657 void PassVisitor< pass_type >::visit( const ApplicationExpr * node ) { 1658 VISIT_START( node ); 1659 1660 maybeAccept_impl( node->result , *this ); 1661 maybeAccept_impl( node->function, *this ); 1662 maybeAccept_impl( node->args , *this ); 1222 1663 1223 1664 VISIT_END( node ); … … 1253 1694 1254 1695 template< typename pass_type > 1696 void PassVisitor< pass_type >::visit( const UntypedExpr * node ) { 1697 VISIT_START( node ); 1698 1699 maybeAccept_impl( node->result, *this ); 1700 1701 for ( auto expr : node->args ) { 1702 visitExpression( expr ); 1703 } 1704 1705 VISIT_END( node ); 1706 } 1707 1708 template< typename pass_type > 1255 1709 Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) { 1256 1710 MUTATE_START( node ); … … 1278 1732 1279 1733 template< typename pass_type > 1734 void PassVisitor< pass_type >::visit( const NameExpr * node ) { 1735 VISIT_START( node ); 1736 1737 maybeAccept_impl( node->result, *this ); 1738 1739 VISIT_END( node ); 1740 } 1741 1742 template< typename pass_type > 1280 1743 Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) { 1281 1744 MUTATE_START( node ); … … 1295 1758 indexerScopedAccept( node->result, *this ); 1296 1759 maybeAccept_impl ( node->arg , *this ); 1760 1761 VISIT_END( node ); 1762 } 1763 1764 template< typename pass_type > 1765 void PassVisitor< pass_type >::visit( const CastExpr * node ) { 1766 VISIT_START( node ); 1767 1768 maybeAccept_impl( node->result, *this ); 1769 maybeAccept_impl( node->arg , *this ); 1297 1770 1298 1771 VISIT_END( node ); … … 1323 1796 1324 1797 template< typename pass_type > 1798 void PassVisitor< pass_type >::visit( const KeywordCastExpr * node ) { 1799 VISIT_START( node ); 1800 1801 maybeAccept_impl( node->result, *this ); 1802 maybeAccept_impl( node->arg , *this ); 1803 1804 VISIT_END( node ); 1805 } 1806 1807 template< typename pass_type > 1325 1808 Expression * PassVisitor< pass_type >::mutate( KeywordCastExpr * node ) { 1326 1809 MUTATE_START( node ); … … 1346 1829 1347 1830 template< typename pass_type > 1831 void PassVisitor< pass_type >::visit( const VirtualCastExpr * node ) { 1832 VISIT_START( node ); 1833 1834 maybeAccept_impl( node->result, *this ); 1835 maybeAccept_impl( node->arg, *this ); 1836 1837 VISIT_END( node ); 1838 } 1839 1840 template< typename pass_type > 1348 1841 Expression * PassVisitor< pass_type >::mutate( VirtualCastExpr * node ) { 1349 1842 MUTATE_START( node ); … … 1369 1862 1370 1863 template< typename pass_type > 1864 void PassVisitor< pass_type >::visit( const AddressExpr * node ) { 1865 VISIT_START( node ); 1866 1867 maybeAccept_impl( node->result, *this ); 1868 maybeAccept_impl( node->arg , *this ); 1869 1870 VISIT_END( node ); 1871 } 1872 1873 template< typename pass_type > 1371 1874 Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) { 1372 1875 MUTATE_START( node ); … … 1391 1894 1392 1895 template< typename pass_type > 1896 void PassVisitor< pass_type >::visit( const LabelAddressExpr * node ) { 1897 VISIT_START( node ); 1898 1899 maybeAccept_impl( node->result, *this ); 1900 1901 VISIT_END( node ); 1902 } 1903 1904 template< typename pass_type > 1393 1905 Expression * PassVisitor< pass_type >::mutate( LabelAddressExpr * node ) { 1394 1906 MUTATE_START( node ); … … 1409 1921 maybeAccept_impl ( node->aggregate, *this ); 1410 1922 maybeAccept_impl ( node->member , *this ); 1923 1924 VISIT_END( node ); 1925 } 1926 1927 template< typename pass_type > 1928 void PassVisitor< pass_type >::visit( const UntypedMemberExpr * node ) { 1929 VISIT_START( node ); 1930 1931 maybeAccept_impl( node->result , *this ); 1932 maybeAccept_impl( node->aggregate, *this ); 1933 maybeAccept_impl( node->member , *this ); 1411 1934 1412 1935 VISIT_END( node ); … … 1438 1961 1439 1962 template< typename pass_type > 1963 void PassVisitor< pass_type >::visit( const MemberExpr * node ) { 1964 VISIT_START( node ); 1965 1966 maybeAccept_impl( node->result , *this ); 1967 maybeAccept_impl( node->aggregate, *this ); 1968 1969 VISIT_END( node ); 1970 } 1971 1972 template< typename pass_type > 1440 1973 Expression * PassVisitor< pass_type >::mutate( MemberExpr * node ) { 1441 1974 MUTATE_START( node ); … … 1460 1993 1461 1994 template< typename pass_type > 1995 void PassVisitor< pass_type >::visit( const VariableExpr * node ) { 1996 VISIT_START( node ); 1997 1998 maybeAccept_impl( node->result, *this ); 1999 2000 VISIT_END( node ); 2001 } 2002 2003 template< typename pass_type > 1462 2004 Expression * PassVisitor< pass_type >::mutate( VariableExpr * node ) { 1463 2005 MUTATE_START( node ); … … 1477 2019 indexerScopedAccept( node->result , *this ); 1478 2020 maybeAccept_impl ( &node->constant, *this ); 2021 2022 VISIT_END( node ); 2023 } 2024 2025 template< typename pass_type > 2026 void PassVisitor< pass_type >::visit( const ConstantExpr * node ) { 2027 VISIT_START( node ); 2028 2029 maybeAccept_impl( node->result , *this ); 2030 maybeAccept_impl( &node->constant, *this ); 1479 2031 1480 2032 VISIT_END( node ); … … 1501 2053 1502 2054 indexerScopedAccept( node->result, *this ); 2055 if ( node->get_isType() ) { 2056 maybeAccept_impl( node->type, *this ); 2057 } else { 2058 maybeAccept_impl( node->expr, *this ); 2059 } 2060 2061 VISIT_END( node ); 2062 } 2063 2064 template< typename pass_type > 2065 void PassVisitor< pass_type >::visit( const SizeofExpr * node ) { 2066 VISIT_START( node ); 2067 2068 maybeAccept_impl( node->result, *this ); 1503 2069 if ( node->get_isType() ) { 1504 2070 maybeAccept_impl( node->type, *this ); … … 1542 2108 1543 2109 template< typename pass_type > 2110 void PassVisitor< pass_type >::visit( const AlignofExpr * node ) { 2111 VISIT_START( node ); 2112 2113 maybeAccept_impl( node->result, *this ); 2114 if ( node->get_isType() ) { 2115 maybeAccept_impl( node->type, *this ); 2116 } else { 2117 maybeAccept_impl( node->expr, *this ); 2118 } 2119 2120 VISIT_END( node ); 2121 } 2122 2123 template< typename pass_type > 1544 2124 Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) { 1545 2125 MUTATE_START( node ); … … 1569 2149 1570 2150 template< typename pass_type > 2151 void PassVisitor< pass_type >::visit( const UntypedOffsetofExpr * node ) { 2152 VISIT_START( node ); 2153 2154 maybeAccept_impl( node->result, *this ); 2155 maybeAccept_impl( node->type , *this ); 2156 2157 VISIT_END( node ); 2158 } 2159 2160 template< typename pass_type > 1571 2161 Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) { 1572 2162 MUTATE_START( node ); … … 1592 2182 1593 2183 template< typename pass_type > 2184 void PassVisitor< pass_type >::visit( const OffsetofExpr * node ) { 2185 VISIT_START( node ); 2186 2187 maybeAccept_impl( node->result, *this ); 2188 maybeAccept_impl( node->type , *this ); 2189 2190 VISIT_END( node ); 2191 } 2192 2193 template< typename pass_type > 1594 2194 Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) { 1595 2195 MUTATE_START( node ); … … 1615 2215 1616 2216 template< typename pass_type > 2217 void PassVisitor< pass_type >::visit( const OffsetPackExpr * node ) { 2218 VISIT_START( node ); 2219 2220 maybeAccept_impl( node->result, *this ); 2221 maybeAccept_impl( node->type , *this ); 2222 2223 VISIT_END( node ); 2224 } 2225 2226 template< typename pass_type > 1617 2227 Expression * PassVisitor< pass_type >::mutate( OffsetPackExpr * node ) { 1618 2228 MUTATE_START( node ); … … 1632 2242 1633 2243 indexerScopedAccept( node->result, *this ); 2244 if ( node->get_isType() ) { 2245 maybeAccept_impl( node->type, *this ); 2246 } else { 2247 maybeAccept_impl( node->expr, *this ); 2248 } 2249 2250 VISIT_END( node ); 2251 } 2252 2253 template< typename pass_type > 2254 void PassVisitor< pass_type >::visit( const AttrExpr * node ) { 2255 VISIT_START( node ); 2256 2257 maybeAccept_impl( node->result, *this ); 1634 2258 if ( node->get_isType() ) { 1635 2259 maybeAccept_impl( node->type, *this ); … … 1670 2294 1671 2295 template< typename pass_type > 2296 void PassVisitor< pass_type >::visit( const LogicalExpr * node ) { 2297 VISIT_START( node ); 2298 2299 maybeAccept_impl( node->result, *this ); 2300 maybeAccept_impl( node->arg1 , *this ); 2301 maybeAccept_impl( node->arg2 , *this ); 2302 2303 VISIT_END( node ); 2304 } 2305 2306 template< typename pass_type > 1672 2307 Expression * PassVisitor< pass_type >::mutate( LogicalExpr * node ) { 1673 2308 MUTATE_START( node ); … … 1691 2326 maybeAccept_impl ( node->arg2 , *this ); 1692 2327 maybeAccept_impl ( node->arg3 , *this ); 2328 2329 VISIT_END( node ); 2330 } 2331 2332 template< typename pass_type > 2333 void PassVisitor< pass_type >::visit( const ConditionalExpr * node ) { 2334 VISIT_START( node ); 2335 2336 maybeAccept_impl( node->result, *this ); 2337 maybeAccept_impl( node->arg1 , *this ); 2338 maybeAccept_impl( node->arg2 , *this ); 2339 maybeAccept_impl( node->arg3 , *this ); 1693 2340 1694 2341 VISIT_END( node ); … … 1722 2369 1723 2370 template< typename pass_type > 2371 void PassVisitor< pass_type >::visit( const CommaExpr * node ) { 2372 VISIT_START( node ); 2373 2374 maybeAccept_impl( node->result, *this ); 2375 maybeAccept_impl( node->arg1 , *this ); 2376 maybeAccept_impl( node->arg2 , *this ); 2377 2378 VISIT_END( node ); 2379 } 2380 2381 template< typename pass_type > 1724 2382 Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) { 1725 2383 MUTATE_START( node ); … … 1746 2404 1747 2405 template< typename pass_type > 2406 void PassVisitor< pass_type >::visit( const TypeExpr * node ) { 2407 VISIT_START( node ); 2408 2409 maybeAccept_impl( node->result, *this ); 2410 maybeAccept_impl( node->type, *this ); 2411 2412 VISIT_END( node ); 2413 } 2414 2415 template< typename pass_type > 1748 2416 Expression * PassVisitor< pass_type >::mutate( TypeExpr * node ) { 1749 2417 MUTATE_START( node ); … … 1766 2434 maybeAccept_impl ( node->constraint, *this ); 1767 2435 maybeAccept_impl ( node->operand , *this ); 2436 2437 VISIT_END( node ); 2438 } 2439 2440 template< typename pass_type > 2441 void PassVisitor< pass_type >::visit( const AsmExpr * node ) { 2442 VISIT_START( node ); 2443 2444 maybeAccept_impl( node->result , *this ); 2445 maybeAccept_impl( node->inout , *this ); 2446 maybeAccept_impl( node->constraint, *this ); 2447 maybeAccept_impl( node->operand , *this ); 1768 2448 1769 2449 VISIT_END( node ); … … 1796 2476 1797 2477 template< typename pass_type > 2478 void PassVisitor< pass_type >::visit( const ImplicitCopyCtorExpr * node ) { 2479 VISIT_START( node ); 2480 2481 maybeAccept_impl( node->result , *this ); 2482 maybeAccept_impl( node->callExpr , *this ); 2483 2484 VISIT_END( node ); 2485 } 2486 2487 template< typename pass_type > 1798 2488 Expression * PassVisitor< pass_type >::mutate( ImplicitCopyCtorExpr * node ) { 1799 2489 MUTATE_START( node ); … … 1819 2509 1820 2510 template< typename pass_type > 2511 void PassVisitor< pass_type >::visit( const ConstructorExpr * node ) { 2512 VISIT_START( node ); 2513 2514 maybeAccept_impl( node->result , *this ); 2515 maybeAccept_impl( node->callExpr, *this ); 2516 2517 VISIT_END( node ); 2518 } 2519 2520 template< typename pass_type > 1821 2521 Expression * PassVisitor< pass_type >::mutate( ConstructorExpr * node ) { 1822 2522 MUTATE_START( node ); … … 1842 2542 1843 2543 template< typename pass_type > 2544 void PassVisitor< pass_type >::visit( const CompoundLiteralExpr * node ) { 2545 VISIT_START( node ); 2546 2547 maybeAccept_impl( node->result , *this ); 2548 maybeAccept_impl( node->initializer, *this ); 2549 2550 VISIT_END( node ); 2551 } 2552 2553 template< typename pass_type > 1844 2554 Expression * PassVisitor< pass_type >::mutate( CompoundLiteralExpr * node ) { 1845 2555 MUTATE_START( node ); … … 1861 2571 maybeAccept_impl ( node->low , *this ); 1862 2572 maybeAccept_impl ( node->high , *this ); 2573 2574 VISIT_END( node ); 2575 } 2576 2577 template< typename pass_type > 2578 void PassVisitor< pass_type >::visit( const RangeExpr * node ) { 2579 VISIT_START( node ); 2580 2581 maybeAccept_impl( node->result, *this ); 2582 maybeAccept_impl( node->low , *this ); 2583 maybeAccept_impl( node->high , *this ); 1863 2584 1864 2585 VISIT_END( node ); … … 1890 2611 1891 2612 template< typename pass_type > 2613 void PassVisitor< pass_type >::visit( const UntypedTupleExpr * node ) { 2614 VISIT_START( node ); 2615 2616 maybeAccept_impl( node->result, *this ); 2617 maybeAccept_impl( node->exprs , *this ); 2618 2619 VISIT_END( node ); 2620 } 2621 2622 template< typename pass_type > 1892 2623 Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) { 1893 2624 MUTATE_START( node ); … … 1913 2644 1914 2645 template< typename pass_type > 2646 void PassVisitor< pass_type >::visit( const TupleExpr * node ) { 2647 VISIT_START( node ); 2648 2649 maybeAccept_impl( node->result, *this ); 2650 maybeAccept_impl( node->exprs , *this ); 2651 2652 VISIT_END( node ); 2653 } 2654 2655 template< typename pass_type > 1915 2656 Expression * PassVisitor< pass_type >::mutate( TupleExpr * node ) { 1916 2657 MUTATE_START( node ); … … 1936 2677 1937 2678 template< typename pass_type > 2679 void PassVisitor< pass_type >::visit( const TupleIndexExpr * node ) { 2680 VISIT_START( node ); 2681 2682 maybeAccept_impl( node->result, *this ); 2683 maybeAccept_impl( node->tuple , *this ); 2684 2685 VISIT_END( node ); 2686 } 2687 2688 template< typename pass_type > 1938 2689 Expression * PassVisitor< pass_type >::mutate( TupleIndexExpr * node ) { 1939 2690 MUTATE_START( node ); … … 1954 2705 indexerScopedAccept( node->result , *this ); 1955 2706 maybeAccept_impl ( node->stmtExpr, *this ); 2707 2708 VISIT_END( node ); 2709 } 2710 2711 template< typename pass_type > 2712 void PassVisitor< pass_type >::visit( const TupleAssignExpr * node ) { 2713 VISIT_START( node ); 2714 2715 maybeAccept_impl( node->result , *this ); 2716 maybeAccept_impl( node->stmtExpr, *this ); 1956 2717 1957 2718 VISIT_END( node ); … … 1989 2750 1990 2751 template< typename pass_type > 2752 void PassVisitor< pass_type >::visit( const StmtExpr * node ) { 2753 VISIT_START( node ); 2754 2755 maybeAccept_impl( node->result , *this ); 2756 maybeAccept_impl( node->statements , *this ); 2757 maybeAccept_impl( node->returnDecls, *this ); 2758 maybeAccept_impl( node->dtors , *this ); 2759 2760 VISIT_END( node ); 2761 } 2762 2763 template< typename pass_type > 1991 2764 Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) { 1992 2765 MUTATE_START( node ); … … 2018 2791 2019 2792 template< typename pass_type > 2793 void PassVisitor< pass_type >::visit( const UniqueExpr * node ) { 2794 VISIT_START( node ); 2795 2796 maybeAccept_impl( node->result, *this ); 2797 maybeAccept_impl( node->expr , *this ); 2798 2799 VISIT_END( node ); 2800 } 2801 2802 template< typename pass_type > 2020 2803 Expression * PassVisitor< pass_type >::mutate( UniqueExpr * node ) { 2021 2804 MUTATE_START( node ); … … 2036 2819 indexerScopedAccept( node->result, *this ); 2037 2820 maybeAccept_impl ( node->expr , *this ); 2821 // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver. 2822 2823 VISIT_END( node ); 2824 } 2825 2826 template< typename pass_type > 2827 void PassVisitor< pass_type >::visit( const UntypedInitExpr * node ) { 2828 VISIT_START( node ); 2829 2830 maybeAccept_impl( node->result, *this ); 2831 maybeAccept_impl( node->expr , *this ); 2038 2832 // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver. 2039 2833 … … 2067 2861 2068 2862 template< typename pass_type > 2863 void PassVisitor< pass_type >::visit( const InitExpr * node ) { 2864 VISIT_START( node ); 2865 2866 maybeAccept_impl( node->result, *this ); 2867 maybeAccept_impl( node->expr , *this ); 2868 maybeAccept_impl( node->designation, *this ); 2869 2870 VISIT_END( node ); 2871 } 2872 2873 template< typename pass_type > 2069 2874 Expression * PassVisitor< pass_type >::mutate( InitExpr * node ) { 2070 2875 MUTATE_START( node ); … … 2092 2897 2093 2898 template< typename pass_type > 2899 void PassVisitor< pass_type >::visit( const DeletedExpr * node ) { 2900 VISIT_START( node ); 2901 2902 maybeAccept_impl( node->result, *this ); 2903 maybeAccept_impl( node->expr, *this ); 2904 // don't visit deleteStmt, because it is a pointer to somewhere else in the tree. 2905 2906 VISIT_END( node ); 2907 } 2908 2909 template< typename pass_type > 2094 2910 Expression * PassVisitor< pass_type >::mutate( DeletedExpr * node ) { 2095 2911 MUTATE_START( node ); … … 2109 2925 2110 2926 indexerScopedAccept( node->result, *this ); 2927 maybeAccept_impl( node->expr, *this ); 2928 2929 VISIT_END( node ); 2930 } 2931 2932 template< typename pass_type > 2933 void PassVisitor< pass_type >::visit( const DefaultArgExpr * node ) { 2934 VISIT_START( node ); 2935 2936 maybeAccept_impl( node->result, *this ); 2111 2937 maybeAccept_impl( node->expr, *this ); 2112 2938 … … 2135 2961 for ( GenericExpr::Association & assoc : node->associations ) { 2136 2962 indexerScopedAccept( assoc.type, *this ); 2963 maybeAccept_impl( assoc.expr, *this ); 2964 } 2965 2966 VISIT_END( node ); 2967 } 2968 2969 template< typename pass_type > 2970 void PassVisitor< pass_type >::visit( const GenericExpr * node ) { 2971 VISIT_START( node ); 2972 2973 maybeAccept_impl( node->result, *this ); 2974 maybeAccept_impl( node->control, *this ); 2975 for ( const GenericExpr::Association & assoc : node->associations ) { 2976 maybeAccept_impl( assoc.type, *this ); 2137 2977 maybeAccept_impl( assoc.expr, *this ); 2138 2978 } … … 2168 3008 2169 3009 template< typename pass_type > 3010 void PassVisitor< pass_type >::visit( const VoidType * node ) { 3011 VISIT_START( node ); 3012 3013 maybeAccept_impl( node->forall, *this ); 3014 3015 VISIT_END( node ); 3016 } 3017 3018 template< typename pass_type > 2170 3019 Type * PassVisitor< pass_type >::mutate( VoidType * node ) { 2171 3020 MUTATE_START( node ); … … 2180 3029 template< typename pass_type > 2181 3030 void PassVisitor< pass_type >::visit( BasicType * node ) { 3031 VISIT_START( node ); 3032 3033 maybeAccept_impl( node->forall, *this ); 3034 3035 VISIT_END( node ); 3036 } 3037 3038 template< typename pass_type > 3039 void PassVisitor< pass_type >::visit( const BasicType * node ) { 2182 3040 VISIT_START( node ); 2183 3041 … … 2210 3068 2211 3069 template< typename pass_type > 3070 void PassVisitor< pass_type >::visit( const PointerType * node ) { 3071 VISIT_START( node ); 3072 3073 maybeAccept_impl( node->forall, *this ); 3074 // xxx - should PointerType visit/mutate dimension? 3075 maybeAccept_impl( node->base, *this ); 3076 3077 VISIT_END( node ); 3078 } 3079 3080 template< typename pass_type > 2212 3081 Type * PassVisitor< pass_type >::mutate( PointerType * node ) { 2213 3082 MUTATE_START( node ); … … 2234 3103 2235 3104 template< typename pass_type > 3105 void PassVisitor< pass_type >::visit( const ArrayType * node ) { 3106 VISIT_START( node ); 3107 3108 maybeAccept_impl( node->forall, *this ); 3109 maybeAccept_impl( node->dimension, *this ); 3110 maybeAccept_impl( node->base, *this ); 3111 3112 VISIT_END( node ); 3113 } 3114 3115 template< typename pass_type > 2236 3116 Type * PassVisitor< pass_type >::mutate( ArrayType * node ) { 2237 3117 MUTATE_START( node ); … … 2257 3137 2258 3138 template< typename pass_type > 3139 void PassVisitor< pass_type >::visit( const ReferenceType * node ) { 3140 VISIT_START( node ); 3141 3142 maybeAccept_impl( node->forall, *this ); 3143 maybeAccept_impl( node->base, *this ); 3144 3145 VISIT_END( node ); 3146 } 3147 3148 template< typename pass_type > 2259 3149 Type * PassVisitor< pass_type >::mutate( ReferenceType * node ) { 2260 3150 MUTATE_START( node ); … … 2280 3170 2281 3171 template< typename pass_type > 3172 void PassVisitor< pass_type >::visit( const QualifiedType * node ) { 3173 VISIT_START( node ); 3174 3175 maybeAccept_impl( node->forall, *this ); 3176 maybeAccept_impl( node->parent, *this ); 3177 maybeAccept_impl( node->child, *this ); 3178 3179 VISIT_END( node ); 3180 } 3181 3182 template< typename pass_type > 2282 3183 Type * PassVisitor< pass_type >::mutate( QualifiedType * node ) { 2283 3184 MUTATE_START( node ); … … 2294 3195 template< typename pass_type > 2295 3196 void PassVisitor< pass_type >::visit( FunctionType * node ) { 3197 VISIT_START( node ); 3198 3199 maybeAccept_impl( node->forall, *this ); 3200 maybeAccept_impl( node->returnVals, *this ); 3201 maybeAccept_impl( node->parameters, *this ); 3202 3203 VISIT_END( node ); 3204 } 3205 3206 template< typename pass_type > 3207 void PassVisitor< pass_type >::visit( const FunctionType * node ) { 2296 3208 VISIT_START( node ); 2297 3209 … … 2332 3244 2333 3245 template< typename pass_type > 3246 void PassVisitor< pass_type >::visit( const StructInstType * node ) { 3247 VISIT_START( node ); 3248 3249 maybeAccept_impl( node->forall , *this ); 3250 maybeAccept_impl( node->parameters, *this ); 3251 3252 VISIT_END( node ); 3253 } 3254 3255 template< typename pass_type > 2334 3256 Type * PassVisitor< pass_type >::mutate( StructInstType * node ) { 2335 3257 MUTATE_START( node ); … … 2364 3286 2365 3287 template< typename pass_type > 3288 void PassVisitor< pass_type >::visit( const UnionInstType * node ) { 3289 VISIT_START( node ); 3290 3291 maybeAccept_impl( node->forall , *this ); 3292 maybeAccept_impl( node->parameters, *this ); 3293 3294 VISIT_END( node ); 3295 } 3296 3297 template< typename pass_type > 2366 3298 Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) { 2367 3299 MUTATE_START( node ); … … 2391 3323 2392 3324 template< typename pass_type > 3325 void PassVisitor< pass_type >::visit( const EnumInstType * node ) { 3326 VISIT_START( node ); 3327 3328 maybeAccept_impl( node->forall, *this ); 3329 maybeAccept_impl( node->parameters, *this ); 3330 3331 VISIT_END( node ); 3332 } 3333 3334 template< typename pass_type > 2393 3335 Type * PassVisitor< pass_type >::mutate( EnumInstType * node ) { 2394 3336 MUTATE_START( node ); … … 2413 3355 2414 3356 template< typename pass_type > 3357 void PassVisitor< pass_type >::visit( const TraitInstType * node ) { 3358 VISIT_START( node ); 3359 3360 maybeAccept_impl( node->forall , *this ); 3361 maybeAccept_impl( node->parameters, *this ); 3362 3363 VISIT_END( node ); 3364 } 3365 3366 template< typename pass_type > 2415 3367 Type * PassVisitor< pass_type >::mutate( TraitInstType * node ) { 2416 3368 MUTATE_START( node ); … … 2426 3378 template< typename pass_type > 2427 3379 void PassVisitor< pass_type >::visit( TypeInstType * node ) { 3380 VISIT_START( node ); 3381 3382 maybeAccept_impl( node->forall , *this ); 3383 maybeAccept_impl( node->parameters, *this ); 3384 3385 VISIT_END( node ); 3386 } 3387 3388 template< typename pass_type > 3389 void PassVisitor< pass_type >::visit( const TypeInstType * node ) { 2428 3390 VISIT_START( node ); 2429 3391 … … 2458 3420 2459 3421 template< typename pass_type > 3422 void PassVisitor< pass_type >::visit( const TupleType * node ) { 3423 VISIT_START( node ); 3424 3425 maybeAccept_impl( node->forall, *this ); 3426 maybeAccept_impl( node->types, *this ); 3427 maybeAccept_impl( node->members, *this ); 3428 3429 VISIT_END( node ); 3430 } 3431 3432 template< typename pass_type > 2460 3433 Type * PassVisitor< pass_type >::mutate( TupleType * node ) { 2461 3434 MUTATE_START( node ); … … 2472 3445 template< typename pass_type > 2473 3446 void PassVisitor< pass_type >::visit( TypeofType * node ) { 3447 VISIT_START( node ); 3448 3449 assert( node->expr ); 3450 maybeAccept_impl( node->expr, *this ); 3451 3452 VISIT_END( node ); 3453 } 3454 3455 template< typename pass_type > 3456 void PassVisitor< pass_type >::visit( const TypeofType * node ) { 2474 3457 VISIT_START( node ); 2475 3458 … … 2508 3491 2509 3492 template< typename pass_type > 3493 void PassVisitor< pass_type >::visit( const AttrType * node ) { 3494 VISIT_START( node ); 3495 3496 if ( node->isType ) { 3497 assert( node->type ); 3498 maybeAccept_impl( node->type, *this ); 3499 } else { 3500 assert( node->expr ); 3501 maybeAccept_impl( node->expr, *this ); 3502 } // if 3503 3504 VISIT_END( node ); 3505 } 3506 3507 template< typename pass_type > 2510 3508 Type * PassVisitor< pass_type >::mutate( AttrType * node ) { 2511 3509 MUTATE_START( node ); … … 2534 3532 2535 3533 template< typename pass_type > 3534 void PassVisitor< pass_type >::visit( const VarArgsType * node ) { 3535 VISIT_START( node ); 3536 3537 maybeAccept_impl( node->forall, *this ); 3538 3539 VISIT_END( node ); 3540 } 3541 3542 template< typename pass_type > 2536 3543 Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) { 2537 3544 MUTATE_START( node ); … … 2554 3561 2555 3562 template< typename pass_type > 3563 void PassVisitor< pass_type >::visit( const ZeroType * node ) { 3564 VISIT_START( node ); 3565 3566 maybeAccept_impl( node->forall, *this ); 3567 3568 VISIT_END( node ); 3569 } 3570 3571 template< typename pass_type > 2556 3572 Type * PassVisitor< pass_type >::mutate( ZeroType * node ) { 2557 3573 MUTATE_START( node ); … … 2574 3590 2575 3591 template< typename pass_type > 3592 void PassVisitor< pass_type >::visit( const OneType * node ) { 3593 VISIT_START( node ); 3594 3595 maybeAccept_impl( node->forall, *this ); 3596 3597 VISIT_END( node ); 3598 } 3599 3600 template< typename pass_type > 2576 3601 Type * PassVisitor< pass_type >::mutate( OneType * node ) { 2577 3602 MUTATE_START( node ); … … 2594 3619 2595 3620 template< typename pass_type > 3621 void PassVisitor< pass_type >::visit( const GlobalScopeType * node ) { 3622 VISIT_START( node ); 3623 3624 maybeAccept_impl( node->forall, *this ); 3625 3626 VISIT_END( node ); 3627 } 3628 3629 template< typename pass_type > 2596 3630 Type * PassVisitor< pass_type >::mutate( GlobalScopeType * node ) { 2597 3631 MUTATE_START( node ); … … 2614 3648 2615 3649 template< typename pass_type > 3650 void PassVisitor< pass_type >::visit( const Designation * node ) { 3651 VISIT_START( node ); 3652 3653 maybeAccept_impl( node->designators, *this ); 3654 3655 VISIT_END( node ); 3656 } 3657 3658 template< typename pass_type > 2616 3659 Designation * PassVisitor< pass_type >::mutate( Designation * node ) { 2617 3660 MUTATE_START( node ); … … 2634 3677 2635 3678 template< typename pass_type > 3679 void PassVisitor< pass_type >::visit( const SingleInit * node ) { 3680 VISIT_START( node ); 3681 3682 visitExpression( node->value ); 3683 3684 VISIT_END( node ); 3685 } 3686 3687 template< typename pass_type > 2636 3688 Initializer * PassVisitor< pass_type >::mutate( SingleInit * node ) { 2637 3689 MUTATE_START( node ); … … 2646 3698 template< typename pass_type > 2647 3699 void PassVisitor< pass_type >::visit( ListInit * node ) { 3700 VISIT_START( node ); 3701 3702 maybeAccept_impl( node->designations, *this ); 3703 maybeAccept_impl( node->initializers, *this ); 3704 3705 VISIT_END( node ); 3706 } 3707 3708 template< typename pass_type > 3709 void PassVisitor< pass_type >::visit( const ListInit * node ) { 2648 3710 VISIT_START( node ); 2649 3711 … … 2678 3740 2679 3741 template< typename pass_type > 3742 void PassVisitor< pass_type >::visit( const ConstructorInit * node ) { 3743 VISIT_START( node ); 3744 3745 maybeAccept_impl( node->ctor, *this ); 3746 maybeAccept_impl( node->dtor, *this ); 3747 maybeAccept_impl( node->init, *this ); 3748 3749 VISIT_END( node ); 3750 } 3751 3752 template< typename pass_type > 2680 3753 Initializer * PassVisitor< pass_type >::mutate( ConstructorInit * node ) { 2681 3754 MUTATE_START( node ); … … 2698 3771 2699 3772 template< typename pass_type > 3773 void PassVisitor< pass_type >::visit( const Constant * node ) { 3774 VISIT_START( node ); 3775 3776 VISIT_END( node ); 3777 } 3778 3779 template< typename pass_type > 2700 3780 Constant * PassVisitor< pass_type >::mutate( Constant * node ) { 2701 3781 MUTATE_START( node ); … … 2708 3788 template< typename pass_type > 2709 3789 void PassVisitor< pass_type >::visit( Attribute * node ) { 3790 VISIT_START( node ); 3791 3792 maybeAccept_impl( node->parameters, *this ); 3793 3794 VISIT_END( node ); 3795 } 3796 3797 template< typename pass_type > 3798 void PassVisitor< pass_type >::visit( const Attribute * node ) { 2710 3799 VISIT_START( node ); 2711 3800 -
src/Common/PassVisitor.proto.h
ree6dbae r7870799 118 118 static inline void postvisit_impl( __attribute__((unused)) pass_type& pass, __attribute__((unused)) node_type * node, __attribute__((unused)) long unused ) {} 119 119 120 template<typename pass_type, typename node_type> 121 static inline auto previsit_impl( pass_type& pass, const node_type * node, __attribute__((unused)) int unused ) -> decltype( pass.previsit( node ), void() ) { 122 pass.previsit( node ); 123 } 124 125 template<typename pass_type, typename node_type> 126 static inline void previsit_impl( __attribute__((unused)) pass_type& pass, __attribute__((unused)) const node_type * node, __attribute__((unused)) long unused ) {} 127 128 129 template<typename pass_type, typename node_type> 130 static inline auto postvisit_impl( pass_type& pass, const node_type * node, __attribute__((unused)) int unused ) -> decltype( pass.postvisit( node ), void() ) { 131 pass.postvisit( node ); 132 } 133 134 template<typename pass_type, typename node_type> 135 static inline void postvisit_impl( __attribute__((unused)) pass_type& pass, __attribute__((unused)) const node_type * node, __attribute__((unused)) long unused ) {} 136 120 137 //--------------------------------------------------------- 121 138 // Mutate … … 200 217 pass.indexer.func( arg ); \ 201 218 } \ 202 \ 203 template<typename pass_type> \ 204 static inline void indexer_impl_##func ( pass_type &, long, type ) { } \ 219 template<typename pass_type> \ 220 static inline void indexer_impl_##func ( pass_type &, long, type ) { } 205 221 206 222 #define INDEXER_FUNC2( func, type1, type2 ) \ … … 209 225 pass.indexer.func( arg1, arg2 ); \ 210 226 } \ 211 \212 227 template<typename pass_type> \ 213 228 static inline void indexer_impl_##func ( pass_type &, long, type1, type2 ) { } … … 233 248 234 249 template<typename pass_type> 235 static inline auto indexer_impl_addStructFwd( pass_type &, long, StructDecl * ) {}250 static inline auto indexer_impl_addStructFwd( pass_type &, long, const StructDecl * ) {} 236 251 237 252 template<typename pass_type> … … 243 258 244 259 template<typename pass_type> 245 static inline auto indexer_impl_addUnionFwd( pass_type &, long, UnionDecl * ) {}260 static inline auto indexer_impl_addUnionFwd( pass_type &, long, const UnionDecl * ) {} 246 261 247 262 template<typename pass_type>
Note:
See TracChangeset
for help on using the changeset viewer.