Changes in src/Common/PassVisitor.impl.h [e67991f:342146e1]
- File:
-
- 1 edited
-
src/Common/PassVisitor.impl.h (modified) (107 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Common/PassVisitor.impl.h
re67991f r342146e1 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 declaration91 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 >104 82 inline void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& mutator ) { 105 83 DeclList_t* beforeDecls = mutator.get_beforeDecls(); … … 139 117 } 140 118 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 149 119 template< typename Container, typename pass_type > 150 120 inline void maybeAccept_impl( Container & container, PassVisitor< pass_type > & visitor ) { … … 159 129 if ( *i ) { 160 130 (*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 );184 131 } 185 132 } catch( SemanticErrorException &e ) { … … 280 227 281 228 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 >301 229 void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) { 302 230 handleStatementList( statements, [this]( Statement *& stmt) { … … 347 275 348 276 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 CompoundStmt353 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 >359 277 Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) { 360 278 return handleStatement( stmt, [this]( Statement * stmt ) { … … 388 306 389 307 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 >403 308 Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) { 404 309 return handleExpression(expr, [this]( Expression * expr ) { … … 410 315 template< typename TreeType, typename VisitorType > 411 316 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 ) {422 317 if ( ! visitor.get_visit_children() ) return; 423 318 auto guard = makeFuncGuard( … … 477 372 478 373 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 );491 374 492 375 VISIT_END( node ); … … 545 428 546 429 template< typename pass_type > 547 void PassVisitor< pass_type >::visit( const FunctionDecl * node ) {548 VISIT_START( node );549 550 indexerAddId( node );551 552 maybeAccept_impl( node->withExprs, *this );553 {554 // with clause introduces a level of scope (for the with expression members).555 // with clause exprs are added to the indexer before parameters so that parameters556 // shadow with exprs and not the other way around.557 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );558 indexerAddWith( node->withExprs, node );559 {560 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );561 // implicit add __func__ identifier as specified in the C manual 6.4.2.2562 static ObjectDecl func(563 "__func__", noStorageClasses, LinkageSpec::C, nullptr,564 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ),565 nullptr566 );567 indexerAddId( &func );568 maybeAccept_impl( node->type, *this );569 // function body needs to have the same scope as parameters - CompoundStmt will not enter570 // a new scope if inFunction is true571 ValueGuard< bool > oldInFunction( inFunction );572 inFunction = true;573 maybeAccept_impl( node->statements, *this );574 maybeAccept_impl( node->attributes, *this );575 }576 }577 578 VISIT_END( node );579 }580 581 template< typename pass_type >582 430 DeclarationWithType * PassVisitor< pass_type >::mutate( FunctionDecl * node ) { 583 431 MUTATE_START( node ); … … 636 484 637 485 template< typename pass_type > 638 void PassVisitor< pass_type >::visit( constStructDecl * node ) {639 VISIT_START( node );486 Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) { 487 MUTATE_START( node ); 640 488 641 489 // make up a forward declaration and add it before processing the members 642 490 // needs to be on the heap because addStruct saves the pointer 643 491 indexerAddStructFwd( node ); 492 493 { 494 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 495 maybeMutate_impl( node->parameters, *this ); 496 maybeMutate_impl( node->members , *this ); 497 } 498 499 // this addition replaces the forward declaration 500 indexerAddStruct( node ); 501 502 MUTATE_END( Declaration, node ); 503 } 504 505 //-------------------------------------------------------------------------- 506 // UnionDecl 507 template< typename pass_type > 508 void PassVisitor< pass_type >::visit( UnionDecl * node ) { 509 VISIT_START( node ); 510 511 // make up a forward declaration and add it before processing the members 512 indexerAddUnionFwd( node ); 644 513 645 514 { … … 649 518 } 650 519 651 // this addition replaces the forward declaration 652 indexerAddStruct( node ); 653 654 VISIT_END( node ); 655 } 656 657 template< typename pass_type > 658 Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) { 520 indexerAddUnion( node ); 521 522 VISIT_END( node ); 523 } 524 525 template< typename pass_type > 526 Declaration * PassVisitor< pass_type >::mutate( UnionDecl * node ) { 659 527 MUTATE_START( node ); 660 528 661 529 // make up a forward declaration and add it before processing the members 662 // needs to be on the heap because addStruct saves the pointer 663 indexerAddStructFwd( node ); 530 indexerAddUnionFwd( node ); 664 531 665 532 { … … 669 536 } 670 537 671 // this addition replaces the forward declaration 672 indexerAddStruct( node ); 538 indexerAddUnion( node ); 673 539 674 540 MUTATE_END( Declaration, node ); … … 676 542 677 543 //-------------------------------------------------------------------------- 678 // UnionDecl 679 template< typename pass_type > 680 void PassVisitor< pass_type >::visit( UnionDecl * node ) { 681 VISIT_START( node ); 682 683 // make up a forward declaration and add it before processing the members 684 indexerAddUnionFwd( node ); 544 // EnumDecl 545 template< typename pass_type > 546 void PassVisitor< pass_type >::visit( EnumDecl * node ) { 547 VISIT_START( node ); 548 549 indexerAddEnum( node ); 550 551 // unlike structs, traits, and unions, enums inject their members into the global scope 552 maybeAccept_impl( node->parameters, *this ); 553 maybeAccept_impl( node->members , *this ); 554 555 VISIT_END( node ); 556 } 557 558 template< typename pass_type > 559 Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) { 560 MUTATE_START( node ); 561 562 indexerAddEnum( node ); 563 564 // unlike structs, traits, and unions, enums inject their members into the global scope 565 maybeMutate_impl( node->parameters, *this ); 566 maybeMutate_impl( node->members , *this ); 567 568 MUTATE_END( Declaration, node ); 569 } 570 571 //-------------------------------------------------------------------------- 572 // TraitDecl 573 template< typename pass_type > 574 void PassVisitor< pass_type >::visit( TraitDecl * node ) { 575 VISIT_START( node ); 685 576 686 577 { … … 690 581 } 691 582 692 indexerAddUnion( node ); 693 694 VISIT_END( node ); 695 } 696 template< typename pass_type > 697 void PassVisitor< pass_type >::visit( const UnionDecl * node ) { 698 VISIT_START( node ); 699 700 // make up a forward declaration and add it before processing the members 701 indexerAddUnionFwd( node ); 702 703 { 704 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 705 maybeAccept_impl( node->parameters, *this ); 706 maybeAccept_impl( node->members , *this ); 707 } 708 709 indexerAddUnion( node ); 710 711 VISIT_END( node ); 712 } 713 714 template< typename pass_type > 715 Declaration * PassVisitor< pass_type >::mutate( UnionDecl * node ) { 716 MUTATE_START( node ); 717 718 // make up a forward declaration and add it before processing the members 719 indexerAddUnionFwd( node ); 583 indexerAddTrait( node ); 584 585 VISIT_END( node ); 586 } 587 588 template< typename pass_type > 589 Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) { 590 MUTATE_START( node ); 720 591 721 592 { … … 725 596 } 726 597 727 indexerAddUnion( node );728 729 MUTATE_END( Declaration, node );730 }731 732 //--------------------------------------------------------------------------733 // EnumDecl734 template< typename pass_type >735 void PassVisitor< pass_type >::visit( EnumDecl * node ) {736 VISIT_START( node );737 738 indexerAddEnum( node );739 740 // unlike structs, traits, and unions, enums inject their members into the global scope741 maybeAccept_impl( node->parameters, *this );742 maybeAccept_impl( node->members , *this );743 744 VISIT_END( node );745 }746 747 template< typename pass_type >748 void PassVisitor< pass_type >::visit( const EnumDecl * node ) {749 VISIT_START( node );750 751 indexerAddEnum( node );752 753 // unlike structs, traits, and unions, enums inject their members into the global scope754 maybeAccept_impl( node->parameters, *this );755 maybeAccept_impl( node->members , *this );756 757 VISIT_END( node );758 }759 760 template< typename pass_type >761 Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) {762 MUTATE_START( node );763 764 indexerAddEnum( node );765 766 // unlike structs, traits, and unions, enums inject their members into the global scope767 maybeMutate_impl( node->parameters, *this );768 maybeMutate_impl( node->members , *this );769 770 MUTATE_END( Declaration, node );771 }772 773 //--------------------------------------------------------------------------774 // TraitDecl775 template< typename pass_type >776 void PassVisitor< pass_type >::visit( TraitDecl * node ) {777 VISIT_START( node );778 779 {780 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );781 maybeAccept_impl( node->parameters, *this );782 maybeAccept_impl( node->members , *this );783 }784 785 indexerAddTrait( node );786 787 VISIT_END( node );788 }789 790 template< typename pass_type >791 void PassVisitor< pass_type >::visit( const TraitDecl * node ) {792 VISIT_START( node );793 794 {795 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );796 maybeAccept_impl( node->parameters, *this );797 maybeAccept_impl( node->members , *this );798 }799 800 indexerAddTrait( node );801 802 VISIT_END( node );803 }804 805 template< typename pass_type >806 Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) {807 MUTATE_START( node );808 809 {810 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );811 maybeMutate_impl( node->parameters, *this );812 maybeMutate_impl( node->members , *this );813 }814 815 598 indexerAddTrait( node ); 816 599 … … 842 625 } 843 626 844 845 template< typename pass_type > 846 void PassVisitor< pass_type >::visit( const TypeDecl * node ) { 627 template< typename pass_type > 628 Declaration * PassVisitor< pass_type >::mutate( TypeDecl * node ) { 629 MUTATE_START( node ); 630 631 { 632 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 633 maybeMutate_impl( node->parameters, *this ); 634 maybeMutate_impl( node->base , *this ); 635 } 636 637 // see A NOTE ON THE ORDER OF TRAVERSAL, above 638 // note that assertions come after the type is added to the symtab, since they are not part of the type proper 639 // and may depend on the type itself 640 indexerAddType( node ); 641 642 maybeMutate_impl( node->assertions, *this ); 643 644 indexerScopedMutate( node->init, *this ); 645 646 MUTATE_END( Declaration, node ); 647 } 648 649 //-------------------------------------------------------------------------- 650 // TypedefDecl 651 template< typename pass_type > 652 void PassVisitor< pass_type >::visit( TypedefDecl * node ) { 847 653 VISIT_START( node ); 848 654 … … 853 659 } 854 660 855 // see A NOTE ON THE ORDER OF TRAVERSAL, above856 // note that assertions come after the type is added to the symtab, since they are not part of the type proper857 // and may depend on the type itself858 661 indexerAddType( node ); 859 662 860 663 maybeAccept_impl( node->assertions, *this ); 861 664 862 indexerScopedAccept( node->init, *this ); 863 864 VISIT_END( node ); 865 } 866 867 template< typename pass_type > 868 Declaration * PassVisitor< pass_type >::mutate( TypeDecl * node ) { 665 VISIT_END( node ); 666 } 667 668 template< typename pass_type > 669 Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) { 869 670 MUTATE_START( node ); 870 671 … … 875 676 } 876 677 877 // see A NOTE ON THE ORDER OF TRAVERSAL, above878 // note that assertions come after the type is added to the symtab, since they are not part of the type proper879 // and may depend on the type itself880 678 indexerAddType( node ); 881 679 882 680 maybeMutate_impl( node->assertions, *this ); 883 681 884 indexerScopedMutate( node->init, *this );885 886 682 MUTATE_END( Declaration, node ); 887 683 } 888 684 889 685 //-------------------------------------------------------------------------- 890 // TypedefDecl891 template< typename pass_type >892 void PassVisitor< pass_type >::visit( TypedefDecl * node ) {893 VISIT_START( node );894 895 {896 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );897 maybeAccept_impl( node->parameters, *this );898 maybeAccept_impl( node->base , *this );899 }900 901 indexerAddType( node );902 903 maybeAccept_impl( node->assertions, *this );904 905 VISIT_END( node );906 }907 908 template< typename pass_type >909 void PassVisitor< pass_type >::visit( const TypedefDecl * node ) {910 VISIT_START( node );911 912 {913 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );914 maybeAccept_impl( node->parameters, *this );915 maybeAccept_impl( node->base , *this );916 }917 918 indexerAddType( node );919 920 maybeAccept_impl( node->assertions, *this );921 922 VISIT_END( node );923 }924 925 template< typename pass_type >926 Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) {927 MUTATE_START( node );928 929 {930 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );931 maybeMutate_impl( node->parameters, *this );932 maybeMutate_impl( node->base , *this );933 }934 935 indexerAddType( node );936 937 maybeMutate_impl( node->assertions, *this );938 939 MUTATE_END( Declaration, node );940 }941 942 //--------------------------------------------------------------------------943 686 // AsmDecl 944 687 template< typename pass_type > … … 952 695 953 696 template< typename pass_type > 954 void PassVisitor< pass_type >::visit( const AsmDecl * node ) {955 VISIT_START( node );956 957 maybeAccept_impl( node->stmt, *this );958 959 VISIT_END( node );960 }961 962 template< typename pass_type >963 697 AsmDecl * PassVisitor< pass_type >::mutate( AsmDecl * node ) { 964 698 MUTATE_START( node ); … … 976 710 977 711 node->condition = visitExpression( node->condition ); 978 maybeAccept_impl( node->message, *this );979 980 VISIT_END( node );981 }982 983 template< typename pass_type >984 void PassVisitor< pass_type >::visit( const StaticAssertDecl * node ) {985 VISIT_START( node );986 987 visitExpression( node->condition );988 712 maybeAccept_impl( node->message, *this ); 989 713 … … 1018 742 1019 743 template< typename pass_type > 1020 void PassVisitor< pass_type >::visit( const CompoundStmt * node ) {1021 VISIT_START( node );1022 {1023 // do not enter a new scope if inFunction is true - needs to check old state before the assignment1024 ValueGuard< bool > oldInFunction( inFunction );1025 auto guard1 = makeFuncGuard( [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeEnter(); }, [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeLeave(); } );1026 auto guard2 = makeFuncGuard( [this]() { call_beginScope(); }, [this]() { call_endScope(); } );1027 inFunction = false;1028 visitStatementList( node->kids );1029 }1030 VISIT_END( node );1031 }1032 1033 template< typename pass_type >1034 744 CompoundStmt * PassVisitor< pass_type >::mutate( CompoundStmt * node ) { 1035 745 MUTATE_START( node ); … … 1057 767 1058 768 template< typename pass_type > 1059 void PassVisitor< pass_type >::visit( const ExprStmt * node ) {1060 VISIT_START( node );1061 1062 visitExpression( node->expr );1063 1064 VISIT_END( node );1065 }1066 1067 template< typename pass_type >1068 769 Statement * PassVisitor< pass_type >::mutate( ExprStmt * node ) { 1069 770 MUTATE_START( node ); … … 1089 790 1090 791 template< typename pass_type > 1091 void PassVisitor< pass_type >::visit( const AsmStmt * node ) {1092 VISIT_START( node )1093 1094 maybeAccept_impl( node->instruction, *this );1095 maybeAccept_impl( node->output, *this );1096 maybeAccept_impl( node->input, *this );1097 maybeAccept_impl( node->clobber, *this );1098 1099 VISIT_END( node );1100 }1101 1102 template< typename pass_type >1103 792 Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) { 1104 793 MUTATE_START( node ); … … 1122 811 1123 812 template< typename pass_type > 1124 void PassVisitor< pass_type >::visit( const DirectiveStmt * node ) {1125 VISIT_START( node )1126 1127 VISIT_END( node );1128 }1129 1130 template< typename pass_type >1131 813 Statement * PassVisitor< pass_type >::mutate( DirectiveStmt * node ) { 1132 814 MUTATE_START( node ); … … 1143 825 // if statements introduce a level of scope (for the initialization) 1144 826 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 1145 maybeAccept_impl( node-> initialization, *this );827 maybeAccept_impl( node->get_initialization(), *this ); 1146 828 visitExpression ( node->condition ); 1147 829 node->thenPart = visitStatement( node->thenPart ); … … 1152 834 1153 835 template< typename pass_type > 1154 void PassVisitor< pass_type >::visit( constIfStmt * node ) {1155 VISIT_START( node );836 Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) { 837 MUTATE_START( node ); 1156 838 { 1157 839 // if statements introduce a level of scope (for the initialization) 1158 840 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 1159 maybeAccept_impl( node->initialization, *this ); 1160 visitExpression ( node->condition ); 1161 visitStatement ( node->thenPart ); 1162 visitStatement ( node->elsePart ); 1163 } 1164 VISIT_END( node ); 1165 } 1166 1167 template< typename pass_type > 1168 Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) { 1169 MUTATE_START( node ); 1170 { 1171 // if statements introduce a level of scope (for the initialization) 1172 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 1173 maybeMutate_impl( node->initialization, *this ); 841 maybeMutate_impl( node->get_initialization(), *this ); 1174 842 node->condition = mutateExpression( node->condition ); 1175 843 node->thenPart = mutateStatement ( node->thenPart ); … … 1191 859 visitExpression ( node->condition ); 1192 860 node->body = visitStatement( node->body ); 1193 }1194 1195 VISIT_END( node );1196 }1197 1198 template< typename pass_type >1199 void PassVisitor< pass_type >::visit( const WhileStmt * node ) {1200 VISIT_START( node );1201 1202 {1203 // while statements introduce a level of scope (for the initialization)1204 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );1205 maybeAccept_impl( node->initialization, *this );1206 visitExpression ( node->condition );1207 visitStatement ( node->body );1208 861 } 1209 862 … … 1244 897 1245 898 template< typename pass_type > 1246 void PassVisitor< pass_type >::visit( const ForStmt * node ) {1247 VISIT_START( node );1248 {1249 // for statements introduce a level of scope (for the initialization)1250 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );1251 maybeAccept_impl( node->initialization, *this );1252 visitExpression( node->condition );1253 visitExpression( node->increment );1254 visitStatement ( node->body );1255 }1256 VISIT_END( node );1257 }1258 1259 template< typename pass_type >1260 899 Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) { 1261 900 MUTATE_START( node ); … … 1284 923 1285 924 template< typename pass_type > 1286 void PassVisitor< pass_type >::visit( const SwitchStmt * node ) {1287 VISIT_START( node );1288 1289 visitExpression ( node->condition );1290 visitStatementList( node->statements );1291 1292 VISIT_END( node );1293 }1294 1295 template< typename pass_type >1296 925 Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) { 1297 926 MUTATE_START( node ); … … 1316 945 1317 946 template< typename pass_type > 1318 void PassVisitor< pass_type >::visit( const CaseStmt * node ) {1319 VISIT_START( node );1320 1321 visitExpression ( node->condition );1322 visitStatementList( node->stmts );1323 1324 VISIT_END( node );1325 }1326 1327 template< typename pass_type >1328 947 Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) { 1329 948 MUTATE_START( node ); … … 1344 963 1345 964 template< typename pass_type > 1346 void PassVisitor< pass_type >::visit( const BranchStmt * node ) {1347 VISIT_START( node );1348 VISIT_END( node );1349 }1350 1351 template< typename pass_type >1352 965 Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) { 1353 966 MUTATE_START( node ); … … 1367 980 1368 981 template< typename pass_type > 1369 void PassVisitor< pass_type >::visit( const ReturnStmt * node ) {1370 VISIT_START( node );1371 1372 visitExpression( node->expr );1373 1374 VISIT_END( node );1375 }1376 1377 template< typename pass_type >1378 982 Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) { 1379 983 MUTATE_START( node ); … … 1386 990 //-------------------------------------------------------------------------- 1387 991 // ThrowStmt 992 1388 993 template< typename pass_type > 1389 994 void PassVisitor< pass_type >::visit( ThrowStmt * node ) { … … 1397 1002 1398 1003 template< typename pass_type > 1399 void PassVisitor< pass_type >::visit( const ThrowStmt * node ) {1400 VISIT_START( node );1401 1402 maybeAccept_impl( node->expr, *this );1403 maybeAccept_impl( node->target, *this );1404 1405 VISIT_END( node );1406 }1407 1408 template< typename pass_type >1409 1004 Statement * PassVisitor< pass_type >::mutate( ThrowStmt * node ) { 1410 1005 MUTATE_START( node ); … … 1420 1015 template< typename pass_type > 1421 1016 void PassVisitor< pass_type >::visit( TryStmt * node ) { 1422 VISIT_START( node );1423 1424 maybeAccept_impl( node->block , *this );1425 maybeAccept_impl( node->handlers , *this );1426 maybeAccept_impl( node->finallyBlock, *this );1427 1428 VISIT_END( node );1429 }1430 1431 template< typename pass_type >1432 void PassVisitor< pass_type >::visit( const TryStmt * node ) {1433 1017 VISIT_START( node ); 1434 1018 … … 1467 1051 1468 1052 template< typename pass_type > 1469 void PassVisitor< pass_type >::visit( const CatchStmt * node ) {1470 VISIT_START( node );1471 {1472 // catch statements introduce a level of scope (for the caught exception)1473 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );1474 maybeAccept_impl( node->decl, *this );1475 visitExpression ( node->cond );1476 visitStatement ( node->body );1477 }1478 VISIT_END( node );1479 }1480 1481 template< typename pass_type >1482 1053 Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) { 1483 1054 MUTATE_START( node ); … … 1504 1075 1505 1076 template< typename pass_type > 1506 void PassVisitor< pass_type >::visit( const FinallyStmt * node ) {1507 VISIT_START( node );1508 1509 maybeAccept_impl( node->block, *this );1510 1511 VISIT_END( node );1512 }1513 1514 template< typename pass_type >1515 1077 Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) { 1516 1078 MUTATE_START( node ); … … 1545 1107 1546 1108 template< typename pass_type > 1547 void PassVisitor< pass_type >::visit( const WaitForStmt * node ) {1548 VISIT_START( node );1549 1550 for( auto & clause : node->clauses ) {1551 maybeAccept_impl( clause.target.function, *this );1552 maybeAccept_impl( clause.target.arguments, *this );1553 1554 maybeAccept_impl( clause.statement, *this );1555 maybeAccept_impl( clause.condition, *this );1556 }1557 1558 maybeAccept_impl( node->timeout.time, *this );1559 maybeAccept_impl( node->timeout.statement, *this );1560 maybeAccept_impl( node->timeout.condition, *this );1561 maybeAccept_impl( node->orelse.statement, *this );1562 maybeAccept_impl( node->orelse.condition, *this );1563 1564 VISIT_END( node );1565 }1566 1567 template< typename pass_type >1568 1109 Statement * PassVisitor< pass_type >::mutate( WaitForStmt * node ) { 1569 1110 MUTATE_START( node ); … … 1589 1130 1590 1131 //-------------------------------------------------------------------------- 1591 // WithStmt1132 // NullStmt 1592 1133 template< typename pass_type > 1593 1134 void PassVisitor< pass_type >::visit( WithStmt * node ) { … … 1604 1145 1605 1146 template< typename pass_type > 1606 void PassVisitor< pass_type >::visit( const WithStmt * node ) { 1607 VISIT_START( node ); 1608 maybeAccept_impl( node->exprs, *this ); 1609 { 1610 // catch statements introduce a level of scope (for the caught exception) 1611 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 1612 indexerAddWith( node->exprs, node ); 1613 maybeAccept_impl( node->stmt, *this ); 1614 } 1615 VISIT_END( node ); 1616 } 1617 1618 template< typename pass_type > 1619 Declaration * PassVisitor< pass_type >::mutate( WithStmt * node ) { 1147 Statement * PassVisitor< pass_type >::mutate( WithStmt * node ) { 1620 1148 MUTATE_START( node ); 1621 1149 maybeMutate_impl( node->exprs, *this ); … … 1626 1154 maybeMutate_impl( node->stmt, *this ); 1627 1155 } 1628 MUTATE_END( Declaration, node );1156 MUTATE_END( Statement, node ); 1629 1157 } 1630 1158 … … 1638 1166 1639 1167 template< typename pass_type > 1640 void PassVisitor< pass_type >::visit( const NullStmt * node ) {1641 VISIT_START( node );1642 VISIT_END( node );1643 }1644 1645 template< typename pass_type >1646 1168 NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) { 1647 1169 MUTATE_START( node ); … … 1661 1183 1662 1184 template< typename pass_type > 1663 void PassVisitor< pass_type >::visit( const DeclStmt * node ) {1664 VISIT_START( node );1665 1666 maybeAccept_impl( node->decl, *this );1667 1668 VISIT_END( node );1669 }1670 1671 template< typename pass_type >1672 1185 Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) { 1673 1186 MUTATE_START( node ); … … 1690 1203 1691 1204 template< typename pass_type > 1692 void PassVisitor< pass_type >::visit( const ImplicitCtorDtorStmt * node ) {1693 VISIT_START( node );1694 1695 maybeAccept_impl( node->callStmt, *this );1696 1697 VISIT_END( node );1698 }1699 1700 template< typename pass_type >1701 1205 Statement * PassVisitor< pass_type >::mutate( ImplicitCtorDtorStmt * node ) { 1702 1206 MUTATE_START( node ); … … 1714 1218 1715 1219 indexerScopedAccept( node->result , *this ); 1716 maybeAccept_impl ( node->function, *this ); 1717 maybeAccept_impl ( node->args , *this ); 1718 1719 VISIT_END( node ); 1720 } 1721 1722 template< typename pass_type > 1723 void PassVisitor< pass_type >::visit( const ApplicationExpr * node ) { 1724 VISIT_START( node ); 1725 1726 indexerScopedAccept( node->result , *this ); 1727 maybeAccept_impl ( node->function, *this ); 1728 maybeAccept_impl ( node->args , *this ); 1220 maybeAccept_impl ( node->function, *this ); 1221 maybeAccept_impl ( node->args , *this ); 1729 1222 1730 1223 VISIT_END( node ); … … 1760 1253 1761 1254 template< typename pass_type > 1762 void PassVisitor< pass_type >::visit( const UntypedExpr * node ) {1763 VISIT_START( node );1764 1765 indexerScopedAccept( node->result, *this );1766 1767 for ( auto expr : node->args ) {1768 visitExpression( expr );1769 }1770 1771 VISIT_END( node );1772 }1773 1774 template< typename pass_type >1775 1255 Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) { 1776 1256 MUTATE_START( node ); … … 1798 1278 1799 1279 template< typename pass_type > 1800 void PassVisitor< pass_type >::visit( const NameExpr * node ) { 1280 Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) { 1281 MUTATE_START( node ); 1282 1283 indexerScopedMutate( node->env , *this ); 1284 indexerScopedMutate( node->result, *this ); 1285 1286 MUTATE_END( Expression, node ); 1287 } 1288 1289 //-------------------------------------------------------------------------- 1290 // CastExpr 1291 template< typename pass_type > 1292 void PassVisitor< pass_type >::visit( CastExpr * node ) { 1801 1293 VISIT_START( node ); 1802 1294 1803 1295 indexerScopedAccept( node->result, *this ); 1804 1805 VISIT_END( node ); 1806 } 1807 1808 template< typename pass_type > 1809 Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) { 1296 maybeAccept_impl ( node->arg , *this ); 1297 1298 VISIT_END( node ); 1299 } 1300 1301 template< typename pass_type > 1302 Expression * PassVisitor< pass_type >::mutate( CastExpr * node ) { 1810 1303 MUTATE_START( node ); 1811 1304 1812 1305 indexerScopedMutate( node->env , *this ); 1813 1306 indexerScopedMutate( node->result, *this ); 1814 1815 MUTATE_END( Expression, node ); 1816 } 1817 1818 //-------------------------------------------------------------------------- 1819 // CastExpr 1820 template< typename pass_type > 1821 void PassVisitor< pass_type >::visit( CastExpr * node ) { 1307 maybeMutate_impl ( node->arg , *this ); 1308 1309 MUTATE_END( Expression, node ); 1310 } 1311 1312 //-------------------------------------------------------------------------- 1313 // KeywordCastExpr 1314 template< typename pass_type > 1315 void PassVisitor< pass_type >::visit( KeywordCastExpr * node ) { 1316 VISIT_START( node ); 1317 1318 indexerScopedAccept( node->result, *this ); 1319 maybeAccept_impl ( node->arg , *this ); 1320 1321 VISIT_END( node ); 1322 } 1323 1324 template< typename pass_type > 1325 Expression * PassVisitor< pass_type >::mutate( KeywordCastExpr * node ) { 1326 MUTATE_START( node ); 1327 1328 indexerScopedMutate( node->env , *this ); 1329 indexerScopedMutate( node->result, *this ); 1330 maybeMutate_impl ( node->arg , *this ); 1331 1332 MUTATE_END( Expression, node ); 1333 } 1334 1335 //-------------------------------------------------------------------------- 1336 // VirtualCastExpr 1337 template< typename pass_type > 1338 void PassVisitor< pass_type >::visit( VirtualCastExpr * node ) { 1339 VISIT_START( node ); 1340 1341 indexerScopedAccept( node->result, *this ); 1342 maybeAccept_impl( node->arg, *this ); 1343 1344 VISIT_END( node ); 1345 } 1346 1347 template< typename pass_type > 1348 Expression * PassVisitor< pass_type >::mutate( VirtualCastExpr * node ) { 1349 MUTATE_START( node ); 1350 1351 indexerScopedMutate( node->env , *this ); 1352 indexerScopedMutate( node->result, *this ); 1353 maybeMutate_impl ( node->arg , *this ); 1354 1355 MUTATE_END( Expression, node ); 1356 } 1357 1358 //-------------------------------------------------------------------------- 1359 // AddressExpr 1360 template< typename pass_type > 1361 void PassVisitor< pass_type >::visit( AddressExpr * node ) { 1822 1362 VISIT_START( node ); 1823 1363 … … 1829 1369 1830 1370 template< typename pass_type > 1831 void PassVisitor< pass_type >::visit( const CastExpr * node ) { 1371 Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) { 1372 MUTATE_START( node ); 1373 1374 indexerScopedMutate( node->env , *this ); 1375 indexerScopedMutate( node->result, *this ); 1376 maybeMutate_impl ( node->arg , *this ); 1377 1378 MUTATE_END( Expression, node ); 1379 } 1380 1381 //-------------------------------------------------------------------------- 1382 // LabelAddressExpr 1383 template< typename pass_type > 1384 void PassVisitor< pass_type >::visit( LabelAddressExpr * node ) { 1832 1385 VISIT_START( node ); 1833 1386 1834 1387 indexerScopedAccept( node->result, *this ); 1835 maybeAccept_impl ( node->arg , *this ); 1836 1837 VISIT_END( node ); 1838 } 1839 1840 template< typename pass_type > 1841 Expression * PassVisitor< pass_type >::mutate( CastExpr * node ) { 1388 1389 VISIT_END( node ); 1390 } 1391 1392 template< typename pass_type > 1393 Expression * PassVisitor< pass_type >::mutate( LabelAddressExpr * node ) { 1842 1394 MUTATE_START( node ); 1843 1395 1844 1396 indexerScopedMutate( node->env , *this ); 1845 1397 indexerScopedMutate( node->result, *this ); 1846 maybeMutate_impl ( node->arg , *this );1847 1848 MUTATE_END( Expression, node );1849 }1850 1851 //--------------------------------------------------------------------------1852 // KeywordCastExpr1853 template< typename pass_type >1854 void PassVisitor< pass_type >::visit( KeywordCastExpr * node ) {1855 VISIT_START( node );1856 1857 indexerScopedAccept( node->result, *this );1858 maybeAccept_impl ( node->arg , *this );1859 1860 VISIT_END( node );1861 }1862 1863 template< typename pass_type >1864 void PassVisitor< pass_type >::visit( const KeywordCastExpr * node ) {1865 VISIT_START( node );1866 1867 indexerScopedAccept( node->result, *this );1868 maybeAccept_impl ( node->arg , *this );1869 1870 VISIT_END( node );1871 }1872 1873 template< typename pass_type >1874 Expression * PassVisitor< pass_type >::mutate( KeywordCastExpr * node ) {1875 MUTATE_START( node );1876 1877 indexerScopedMutate( node->env , *this );1878 indexerScopedMutate( node->result, *this );1879 maybeMutate_impl ( node->arg , *this );1880 1881 MUTATE_END( Expression, node );1882 }1883 1884 //--------------------------------------------------------------------------1885 // VirtualCastExpr1886 template< typename pass_type >1887 void PassVisitor< pass_type >::visit( VirtualCastExpr * node ) {1888 VISIT_START( node );1889 1890 indexerScopedAccept( node->result, *this );1891 maybeAccept_impl ( node->arg, *this );1892 1893 VISIT_END( node );1894 }1895 1896 template< typename pass_type >1897 void PassVisitor< pass_type >::visit( const VirtualCastExpr * node ) {1898 VISIT_START( node );1899 1900 indexerScopedAccept( node->result, *this );1901 maybeAccept_impl ( node->arg, *this );1902 1903 VISIT_END( node );1904 }1905 1906 template< typename pass_type >1907 Expression * PassVisitor< pass_type >::mutate( VirtualCastExpr * node ) {1908 MUTATE_START( node );1909 1910 indexerScopedMutate( node->env , *this );1911 indexerScopedMutate( node->result, *this );1912 maybeMutate_impl ( node->arg , *this );1913 1914 MUTATE_END( Expression, node );1915 }1916 1917 //--------------------------------------------------------------------------1918 // AddressExpr1919 template< typename pass_type >1920 void PassVisitor< pass_type >::visit( AddressExpr * node ) {1921 VISIT_START( node );1922 1923 indexerScopedAccept( node->result, *this );1924 maybeAccept_impl ( node->arg , *this );1925 1926 VISIT_END( node );1927 }1928 1929 template< typename pass_type >1930 void PassVisitor< pass_type >::visit( const AddressExpr * node ) {1931 VISIT_START( node );1932 1933 indexerScopedAccept( node->result, *this );1934 maybeAccept_impl ( node->arg , *this );1935 1936 VISIT_END( node );1937 }1938 1939 template< typename pass_type >1940 Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) {1941 MUTATE_START( node );1942 1943 indexerScopedMutate( node->env , *this );1944 indexerScopedMutate( node->result, *this );1945 maybeMutate_impl ( node->arg , *this );1946 1947 MUTATE_END( Expression, node );1948 }1949 1950 //--------------------------------------------------------------------------1951 // LabelAddressExpr1952 template< typename pass_type >1953 void PassVisitor< pass_type >::visit( LabelAddressExpr * node ) {1954 VISIT_START( node );1955 1956 indexerScopedAccept( node->result, *this );1957 1958 VISIT_END( node );1959 }1960 1961 template< typename pass_type >1962 void PassVisitor< pass_type >::visit( const LabelAddressExpr * node ) {1963 VISIT_START( node );1964 1965 indexerScopedAccept( node->result, *this );1966 1967 VISIT_END( node );1968 }1969 1970 template< typename pass_type >1971 Expression * PassVisitor< pass_type >::mutate( LabelAddressExpr * node ) {1972 MUTATE_START( node );1973 1974 indexerScopedMutate( node->env , *this );1975 indexerScopedMutate( node->result, *this );1976 1398 1977 1399 MUTATE_END( Expression, node ); … … 1982 1404 template< typename pass_type > 1983 1405 void PassVisitor< pass_type >::visit( UntypedMemberExpr * node ) { 1984 VISIT_START( node );1985 1986 indexerScopedAccept( node->result , *this );1987 maybeAccept_impl ( node->aggregate, *this );1988 maybeAccept_impl ( node->member , *this );1989 1990 VISIT_END( node );1991 }1992 1993 template< typename pass_type >1994 void PassVisitor< pass_type >::visit( const UntypedMemberExpr * node ) {1995 1406 VISIT_START( node ); 1996 1407 … … 2027 1438 2028 1439 template< typename pass_type > 2029 void PassVisitor< pass_type >::visit( const MemberExpr * node ) {2030 VISIT_START( node );2031 2032 indexerScopedAccept( node->result , *this );2033 maybeAccept_impl ( node->aggregate, *this );2034 2035 VISIT_END( node );2036 }2037 2038 template< typename pass_type >2039 1440 Expression * PassVisitor< pass_type >::mutate( MemberExpr * node ) { 2040 1441 MUTATE_START( node ); … … 2059 1460 2060 1461 template< typename pass_type > 2061 void PassVisitor< pass_type >::visit( const VariableExpr * node ) {2062 VISIT_START( node );2063 2064 indexerScopedAccept( node->result, *this );2065 2066 VISIT_END( node );2067 }2068 2069 template< typename pass_type >2070 1462 Expression * PassVisitor< pass_type >::mutate( VariableExpr * node ) { 2071 1463 MUTATE_START( node ); … … 2081 1473 template< typename pass_type > 2082 1474 void PassVisitor< pass_type >::visit( ConstantExpr * node ) { 2083 VISIT_START( node );2084 2085 indexerScopedAccept( node->result , *this );2086 maybeAccept_impl ( &node->constant, *this );2087 2088 VISIT_END( node );2089 }2090 2091 template< typename pass_type >2092 void PassVisitor< pass_type >::visit( const ConstantExpr * node ) {2093 1475 VISIT_START( node ); 2094 1476 … … 2129 1511 2130 1512 template< typename pass_type > 2131 void PassVisitor< pass_type >::visit( const SizeofExpr * node ) { 1513 Expression * PassVisitor< pass_type >::mutate( SizeofExpr * node ) { 1514 MUTATE_START( node ); 1515 1516 indexerScopedMutate( node->env , *this ); 1517 indexerScopedMutate( node->result, *this ); 1518 if ( node->get_isType() ) { 1519 maybeMutate_impl( node->type, *this ); 1520 } else { 1521 maybeMutate_impl( node->expr, *this ); 1522 } 1523 1524 MUTATE_END( Expression, node ); 1525 } 1526 1527 //-------------------------------------------------------------------------- 1528 // AlignofExpr 1529 template< typename pass_type > 1530 void PassVisitor< pass_type >::visit( AlignofExpr * node ) { 2132 1531 VISIT_START( node ); 2133 1532 … … 2143 1542 2144 1543 template< typename pass_type > 2145 Expression * PassVisitor< pass_type >::mutate( SizeofExpr * node ) {1544 Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) { 2146 1545 MUTATE_START( node ); 2147 1546 … … 2158 1557 2159 1558 //-------------------------------------------------------------------------- 2160 // AlignofExpr 2161 template< typename pass_type > 2162 void PassVisitor< pass_type >::visit( AlignofExpr * node ) { 1559 // UntypedOffsetofExpr 1560 template< typename pass_type > 1561 void PassVisitor< pass_type >::visit( UntypedOffsetofExpr * node ) { 1562 VISIT_START( node ); 1563 1564 indexerScopedAccept( node->result, *this ); 1565 maybeAccept_impl ( node->type , *this ); 1566 1567 VISIT_END( node ); 1568 } 1569 1570 template< typename pass_type > 1571 Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) { 1572 MUTATE_START( node ); 1573 1574 indexerScopedMutate( node->env , *this ); 1575 indexerScopedMutate( node->result, *this ); 1576 maybeMutate_impl ( node->type , *this ); 1577 1578 MUTATE_END( Expression, node ); 1579 } 1580 1581 //-------------------------------------------------------------------------- 1582 // OffsetofExpr 1583 template< typename pass_type > 1584 void PassVisitor< pass_type >::visit( OffsetofExpr * node ) { 1585 VISIT_START( node ); 1586 1587 indexerScopedAccept( node->result, *this ); 1588 maybeAccept_impl ( node->type , *this ); 1589 1590 VISIT_END( node ); 1591 } 1592 1593 template< typename pass_type > 1594 Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) { 1595 MUTATE_START( node ); 1596 1597 indexerScopedMutate( node->env , *this ); 1598 indexerScopedMutate( node->result, *this ); 1599 maybeMutate_impl ( node->type , *this ); 1600 1601 MUTATE_END( Expression, node ); 1602 } 1603 1604 //-------------------------------------------------------------------------- 1605 // OffsetPackExpr 1606 template< typename pass_type > 1607 void PassVisitor< pass_type >::visit( OffsetPackExpr * node ) { 1608 VISIT_START( node ); 1609 1610 indexerScopedAccept( node->result, *this ); 1611 maybeAccept_impl ( node->type , *this ); 1612 1613 VISIT_END( node ); 1614 } 1615 1616 template< typename pass_type > 1617 Expression * PassVisitor< pass_type >::mutate( OffsetPackExpr * node ) { 1618 MUTATE_START( node ); 1619 1620 indexerScopedMutate( node->env , *this ); 1621 indexerScopedMutate( node->result, *this ); 1622 maybeMutate_impl ( node->type , *this ); 1623 1624 MUTATE_END( Expression, node ); 1625 } 1626 1627 //-------------------------------------------------------------------------- 1628 // AttrExpr 1629 template< typename pass_type > 1630 void PassVisitor< pass_type >::visit( AttrExpr * node ) { 2163 1631 VISIT_START( node ); 2164 1632 … … 2174 1642 2175 1643 template< typename pass_type > 2176 void PassVisitor< pass_type >::visit( const AlignofExpr * node ) { 2177 VISIT_START( node ); 2178 2179 indexerScopedAccept( node->result, *this ); 2180 if ( node->get_isType() ) { 2181 maybeAccept_impl( node->type, *this ); 2182 } else { 2183 maybeAccept_impl( node->expr, *this ); 2184 } 2185 2186 VISIT_END( node ); 2187 } 2188 2189 template< typename pass_type > 2190 Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) { 1644 Expression * PassVisitor< pass_type >::mutate( AttrExpr * node ) { 2191 1645 MUTATE_START( node ); 2192 1646 … … 2203 1657 2204 1658 //-------------------------------------------------------------------------- 2205 // UntypedOffsetofExpr2206 template< typename pass_type >2207 void PassVisitor< pass_type >::visit( UntypedOffsetofExpr * node ) {2208 VISIT_START( node );2209 2210 indexerScopedAccept( node->result, *this );2211 maybeAccept_impl ( node->type , *this );2212 2213 VISIT_END( node );2214 }2215 2216 template< typename pass_type >2217 void PassVisitor< pass_type >::visit( const UntypedOffsetofExpr * node ) {2218 VISIT_START( node );2219 2220 indexerScopedAccept( node->result, *this );2221 maybeAccept_impl ( node->type , *this );2222 2223 VISIT_END( node );2224 }2225 2226 template< typename pass_type >2227 Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) {2228 MUTATE_START( node );2229 2230 indexerScopedMutate( node->env , *this );2231 indexerScopedMutate( node->result, *this );2232 maybeMutate_impl ( node->type , *this );2233 2234 MUTATE_END( Expression, node );2235 }2236 2237 //--------------------------------------------------------------------------2238 // OffsetofExpr2239 template< typename pass_type >2240 void PassVisitor< pass_type >::visit( OffsetofExpr * node ) {2241 VISIT_START( node );2242 2243 indexerScopedAccept( node->result, *this );2244 maybeAccept_impl ( node->type , *this );2245 2246 VISIT_END( node );2247 }2248 2249 template< typename pass_type >2250 void PassVisitor< pass_type >::visit( const OffsetofExpr * node ) {2251 VISIT_START( node );2252 2253 indexerScopedAccept( node->result, *this );2254 maybeAccept_impl ( node->type , *this );2255 2256 VISIT_END( node );2257 }2258 2259 template< typename pass_type >2260 Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) {2261 MUTATE_START( node );2262 2263 indexerScopedMutate( node->env , *this );2264 indexerScopedMutate( node->result, *this );2265 maybeMutate_impl ( node->type , *this );2266 2267 MUTATE_END( Expression, node );2268 }2269 2270 //--------------------------------------------------------------------------2271 // OffsetPackExpr2272 template< typename pass_type >2273 void PassVisitor< pass_type >::visit( OffsetPackExpr * node ) {2274 VISIT_START( node );2275 2276 indexerScopedAccept( node->result, *this );2277 maybeAccept_impl ( node->type , *this );2278 2279 VISIT_END( node );2280 }2281 2282 template< typename pass_type >2283 void PassVisitor< pass_type >::visit( const OffsetPackExpr * node ) {2284 VISIT_START( node );2285 2286 indexerScopedAccept( node->result, *this );2287 maybeAccept_impl ( node->type , *this );2288 2289 VISIT_END( node );2290 }2291 2292 template< typename pass_type >2293 Expression * PassVisitor< pass_type >::mutate( OffsetPackExpr * node ) {2294 MUTATE_START( node );2295 2296 indexerScopedMutate( node->env , *this );2297 indexerScopedMutate( node->result, *this );2298 maybeMutate_impl ( node->type , *this );2299 2300 MUTATE_END( Expression, node );2301 }2302 2303 //--------------------------------------------------------------------------2304 // AttrExpr2305 template< typename pass_type >2306 void PassVisitor< pass_type >::visit( AttrExpr * node ) {2307 VISIT_START( node );2308 2309 indexerScopedAccept( node->result, *this );2310 if ( node->get_isType() ) {2311 maybeAccept_impl( node->type, *this );2312 } else {2313 maybeAccept_impl( node->expr, *this );2314 }2315 2316 VISIT_END( node );2317 }2318 2319 template< typename pass_type >2320 void PassVisitor< pass_type >::visit( const AttrExpr * node ) {2321 VISIT_START( node );2322 2323 indexerScopedAccept( node->result, *this );2324 if ( node->get_isType() ) {2325 maybeAccept_impl( node->type, *this );2326 } else {2327 maybeAccept_impl( node->expr, *this );2328 }2329 2330 VISIT_END( node );2331 }2332 2333 template< typename pass_type >2334 Expression * PassVisitor< pass_type >::mutate( AttrExpr * node ) {2335 MUTATE_START( node );2336 2337 indexerScopedMutate( node->env , *this );2338 indexerScopedMutate( node->result, *this );2339 if ( node->get_isType() ) {2340 maybeMutate_impl( node->type, *this );2341 } else {2342 maybeMutate_impl( node->expr, *this );2343 }2344 2345 MUTATE_END( Expression, node );2346 }2347 2348 //--------------------------------------------------------------------------2349 1659 // LogicalExpr 2350 1660 template< typename pass_type > 2351 1661 void PassVisitor< pass_type >::visit( LogicalExpr * node ) { 2352 VISIT_START( node );2353 2354 indexerScopedAccept( node->result, *this );2355 maybeAccept_impl ( node->arg1 , *this );2356 maybeAccept_impl ( node->arg2 , *this );2357 2358 VISIT_END( node );2359 }2360 2361 template< typename pass_type >2362 void PassVisitor< pass_type >::visit( const LogicalExpr * node ) {2363 1662 VISIT_START( node ); 2364 1663 … … 2397 1696 2398 1697 template< typename pass_type > 2399 void PassVisitor< pass_type >::visit( const ConditionalExpr * node ) { 1698 Expression * PassVisitor< pass_type >::mutate( ConditionalExpr * node ) { 1699 MUTATE_START( node ); 1700 1701 indexerScopedMutate( node->env , *this ); 1702 indexerScopedMutate( node->result, *this ); 1703 maybeMutate_impl ( node->arg1 , *this ); 1704 maybeMutate_impl ( node->arg2 , *this ); 1705 maybeMutate_impl ( node->arg3 , *this ); 1706 1707 MUTATE_END( Expression, node ); 1708 } 1709 1710 //-------------------------------------------------------------------------- 1711 // CommaExpr 1712 template< typename pass_type > 1713 void PassVisitor< pass_type >::visit( CommaExpr * node ) { 2400 1714 VISIT_START( node ); 2401 1715 … … 2403 1717 maybeAccept_impl ( node->arg1 , *this ); 2404 1718 maybeAccept_impl ( node->arg2 , *this ); 2405 maybeAccept_impl ( node->arg3 , *this ); 2406 2407 VISIT_END( node ); 2408 } 2409 2410 template< typename pass_type > 2411 Expression * PassVisitor< pass_type >::mutate( ConditionalExpr * node ) { 1719 1720 VISIT_END( node ); 1721 } 1722 1723 template< typename pass_type > 1724 Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) { 2412 1725 MUTATE_START( node ); 2413 1726 … … 2416 1729 maybeMutate_impl ( node->arg1 , *this ); 2417 1730 maybeMutate_impl ( node->arg2 , *this ); 2418 maybeMutate_impl ( node->arg3 , *this );2419 2420 MUTATE_END( Expression, node );2421 }2422 2423 //--------------------------------------------------------------------------2424 // CommaExpr2425 template< typename pass_type >2426 void PassVisitor< pass_type >::visit( CommaExpr * node ) {2427 VISIT_START( node );2428 2429 indexerScopedAccept( node->result, *this );2430 maybeAccept_impl ( node->arg1 , *this );2431 maybeAccept_impl ( node->arg2 , *this );2432 2433 VISIT_END( node );2434 }2435 2436 template< typename pass_type >2437 void PassVisitor< pass_type >::visit( const CommaExpr * node ) {2438 VISIT_START( node );2439 2440 indexerScopedAccept( node->result, *this );2441 maybeAccept_impl ( node->arg1 , *this );2442 maybeAccept_impl ( node->arg2 , *this );2443 2444 VISIT_END( node );2445 }2446 2447 template< typename pass_type >2448 Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) {2449 MUTATE_START( node );2450 2451 indexerScopedMutate( node->env , *this );2452 indexerScopedMutate( node->result, *this );2453 maybeMutate_impl ( node->arg1 , *this );2454 maybeMutate_impl ( node->arg2 , *this );2455 1731 2456 1732 MUTATE_END( Expression, node ); … … 2470 1746 2471 1747 template< typename pass_type > 2472 void PassVisitor< pass_type >::visit( const TypeExpr * node ) {2473 VISIT_START( node );2474 2475 indexerScopedAccept( node->result, *this );2476 maybeAccept_impl ( node->type, *this );2477 2478 VISIT_END( node );2479 }2480 2481 template< typename pass_type >2482 1748 Expression * PassVisitor< pass_type >::mutate( TypeExpr * node ) { 2483 1749 MUTATE_START( node ); … … 2494 1760 template< typename pass_type > 2495 1761 void PassVisitor< pass_type >::visit( AsmExpr * node ) { 2496 VISIT_START( node );2497 2498 indexerScopedAccept( node->result , *this );2499 maybeAccept_impl ( node->inout , *this );2500 maybeAccept_impl ( node->constraint, *this );2501 maybeAccept_impl ( node->operand , *this );2502 2503 VISIT_END( node );2504 }2505 2506 template< typename pass_type >2507 void PassVisitor< pass_type >::visit( const AsmExpr * node ) {2508 1762 VISIT_START( node ); 2509 1763 … … 2535 1789 VISIT_START( node ); 2536 1790 2537 indexerScopedAccept( node->result , *this ); 2538 maybeAccept_impl ( node->callExpr , *this ); 2539 2540 VISIT_END( node ); 2541 } 2542 2543 template< typename pass_type > 2544 void PassVisitor< pass_type >::visit( const ImplicitCopyCtorExpr * node ) { 2545 VISIT_START( node ); 2546 2547 indexerScopedAccept( node->result , *this ); 2548 maybeAccept_impl ( node->callExpr , *this ); 1791 indexerScopedAccept( node->result , *this ); 1792 maybeAccept_impl ( node->callExpr , *this ); 1793 maybeAccept_impl ( node->tempDecls , *this ); 1794 maybeAccept_impl ( node->returnDecls, *this ); 1795 maybeAccept_impl ( node->dtors , *this ); 2549 1796 2550 1797 VISIT_END( node ); … … 2555 1802 MUTATE_START( node ); 2556 1803 2557 indexerScopedMutate( node->env , *this ); 2558 indexerScopedMutate( node->result , *this ); 2559 maybeMutate_impl ( node->callExpr , *this ); 1804 indexerScopedMutate( node->env , *this ); 1805 indexerScopedMutate( node->result , *this ); 1806 maybeMutate_impl ( node->callExpr , *this ); 1807 maybeMutate_impl ( node->tempDecls , *this ); 1808 maybeMutate_impl ( node->returnDecls, *this ); 1809 maybeMutate_impl ( node->dtors , *this ); 2560 1810 2561 1811 MUTATE_END( Expression, node ); … … 2566 1816 template< typename pass_type > 2567 1817 void PassVisitor< pass_type >::visit( ConstructorExpr * node ) { 2568 VISIT_START( node );2569 2570 indexerScopedAccept( node->result , *this );2571 maybeAccept_impl ( node->callExpr, *this );2572 2573 VISIT_END( node );2574 }2575 2576 template< typename pass_type >2577 void PassVisitor< pass_type >::visit( const ConstructorExpr * node ) {2578 1818 VISIT_START( node ); 2579 1819 … … 2608 1848 2609 1849 template< typename pass_type > 2610 void PassVisitor< pass_type >::visit( const CompoundLiteralExpr * node ) {2611 VISIT_START( node );2612 2613 indexerScopedAccept( node->result , *this );2614 maybeAccept_impl ( node->initializer, *this );2615 2616 VISIT_END( node );2617 }2618 2619 template< typename pass_type >2620 1850 Expression * PassVisitor< pass_type >::mutate( CompoundLiteralExpr * node ) { 2621 1851 MUTATE_START( node ); … … 2642 1872 2643 1873 template< typename pass_type > 2644 void PassVisitor< pass_type >::visit( const RangeExpr * node ) {2645 VISIT_START( node );2646 2647 indexerScopedAccept( node->result, *this );2648 maybeAccept_impl ( node->low , *this );2649 maybeAccept_impl ( node->high , *this );2650 2651 VISIT_END( node );2652 }2653 2654 template< typename pass_type >2655 1874 Expression * PassVisitor< pass_type >::mutate( RangeExpr * node ) { 2656 1875 MUTATE_START( node ); … … 2677 1896 2678 1897 template< typename pass_type > 2679 void PassVisitor< pass_type >::visit( const UntypedTupleExpr * node ) { 1898 Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) { 1899 MUTATE_START( node ); 1900 1901 indexerScopedMutate( node->env , *this ); 1902 indexerScopedMutate( node->result, *this ); 1903 maybeMutate_impl ( node->exprs , *this ); 1904 1905 MUTATE_END( Expression, node ); 1906 } 1907 1908 //-------------------------------------------------------------------------- 1909 // TupleExpr 1910 template< typename pass_type > 1911 void PassVisitor< pass_type >::visit( TupleExpr * node ) { 2680 1912 VISIT_START( node ); 2681 1913 … … 2687 1919 2688 1920 template< typename pass_type > 2689 Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) {2690 MUTATE_START( node );2691 2692 indexerScopedMutate( node->env , *this );2693 indexerScopedMutate( node->result, *this );2694 maybeMutate_impl ( node->exprs , *this );2695 2696 MUTATE_END( Expression, node );2697 }2698 2699 //--------------------------------------------------------------------------2700 // TupleExpr2701 template< typename pass_type >2702 void PassVisitor< pass_type >::visit( TupleExpr * node ) {2703 VISIT_START( node );2704 2705 indexerScopedAccept( node->result, *this );2706 maybeAccept_impl ( node->exprs , *this );2707 2708 VISIT_END( node );2709 }2710 2711 template< typename pass_type >2712 void PassVisitor< pass_type >::visit( const TupleExpr * node ) {2713 VISIT_START( node );2714 2715 indexerScopedAccept( node->result, *this );2716 maybeAccept_impl ( node->exprs , *this );2717 2718 VISIT_END( node );2719 }2720 2721 template< typename pass_type >2722 1921 Expression * PassVisitor< pass_type >::mutate( TupleExpr * node ) { 2723 1922 MUTATE_START( node ); … … 2743 1942 2744 1943 template< typename pass_type > 2745 void PassVisitor< pass_type >::visit( const TupleIndexExpr * node ) {2746 VISIT_START( node );2747 2748 indexerScopedAccept( node->result, *this );2749 maybeAccept_impl ( node->tuple , *this );2750 2751 VISIT_END( node );2752 }2753 2754 template< typename pass_type >2755 1944 Expression * PassVisitor< pass_type >::mutate( TupleIndexExpr * node ) { 2756 1945 MUTATE_START( node ); … … 2771 1960 indexerScopedAccept( node->result , *this ); 2772 1961 maybeAccept_impl ( node->stmtExpr, *this ); 2773 2774 VISIT_END( node );2775 }2776 2777 template< typename pass_type >2778 void PassVisitor< pass_type >::visit( const TupleAssignExpr * node ) {2779 VISIT_START( node );2780 2781 indexerScopedAccept( node->result , *this );2782 maybeAccept_impl( node->stmtExpr, *this );2783 1962 2784 1963 VISIT_END( node ); … … 2816 1995 2817 1996 template< typename pass_type > 2818 void PassVisitor< pass_type >::visit( constStmtExpr * node ) {2819 VISIT_START( node );1997 Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) { 1998 MUTATE_START( node ); 2820 1999 2821 2000 // don't want statements from outer CompoundStmts to be added to this StmtExpr … … 2824 2003 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () ); 2825 2004 2826 indexerScopedAccept( node->result , *this );2827 maybeAccept_impl ( node->statements , *this );2828 maybeAccept_impl ( node->returnDecls, *this );2829 maybeAccept_impl ( node->dtors , *this );2830 2831 VISIT_END( node );2832 }2833 2834 template< typename pass_type >2835 Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) {2836 MUTATE_START( node );2837 2838 // don't want statements from outer CompoundStmts to be added to this StmtExpr2839 ValueGuardPtr< typename std::remove_pointer<decltype(get_env_ptr())>::type > oldEnv( get_env_ptr() );2840 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );2841 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );2842 2843 2005 indexerScopedMutate( node->result , *this ); 2844 2006 maybeMutate_impl ( node->statements , *this ); … … 2862 2024 2863 2025 template< typename pass_type > 2864 void PassVisitor< pass_type >::visit( const UniqueExpr * node ) {2865 VISIT_START( node );2866 2867 indexerScopedAccept( node->result, *this );2868 maybeAccept_impl ( node->expr , *this );2869 2870 VISIT_END( node );2871 }2872 2873 template< typename pass_type >2874 2026 Expression * PassVisitor< pass_type >::mutate( UniqueExpr * node ) { 2875 2027 MUTATE_START( node ); … … 2896 2048 2897 2049 template< typename pass_type > 2898 void PassVisitor< pass_type >::visit( const UntypedInitExpr * node ) {2899 VISIT_START( node );2900 2901 indexerScopedAccept( node->result, *this );2902 maybeAccept_impl ( node->expr , *this );2903 // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver.2904 2905 VISIT_END( node );2906 }2907 2908 template< typename pass_type >2909 2050 Expression * PassVisitor< pass_type >::mutate( UntypedInitExpr * node ) { 2910 2051 MUTATE_START( node ); … … 2932 2073 2933 2074 template< typename pass_type > 2934 void PassVisitor< pass_type >::visit( const InitExpr * node ) {2935 VISIT_START( node );2936 2937 indexerScopedAccept( node->result, *this );2938 maybeAccept_impl ( node->expr , *this );2939 maybeAccept_impl ( node->designation, *this );2940 2941 VISIT_END( node );2942 }2943 2944 template< typename pass_type >2945 2075 Expression * PassVisitor< pass_type >::mutate( InitExpr * node ) { 2946 2076 MUTATE_START( node ); … … 2961 2091 2962 2092 indexerScopedAccept( node->result, *this ); 2963 maybeAccept_impl ( node->expr, *this );2093 maybeAccept_impl( node->expr, *this ); 2964 2094 // don't visit deleteStmt, because it is a pointer to somewhere else in the tree. 2965 2095 … … 2968 2098 2969 2099 template< typename pass_type > 2970 void PassVisitor< pass_type >::visit( const DeletedExpr * node ) { 2100 Expression * PassVisitor< pass_type >::mutate( DeletedExpr * node ) { 2101 MUTATE_START( node ); 2102 2103 indexerScopedMutate( node->env, *this ); 2104 indexerScopedMutate( node->result, *this ); 2105 maybeMutate_impl( node->expr, *this ); 2106 2107 MUTATE_END( Expression, node ); 2108 } 2109 2110 //-------------------------------------------------------------------------- 2111 // DefaultArgExpr 2112 template< typename pass_type > 2113 void PassVisitor< pass_type >::visit( DefaultArgExpr * node ) { 2971 2114 VISIT_START( node ); 2972 2115 2973 2116 indexerScopedAccept( node->result, *this ); 2974 maybeAccept_impl ( node->expr, *this ); 2975 // don't visit deleteStmt, because it is a pointer to somewhere else in the tree. 2976 2977 VISIT_END( node ); 2978 } 2979 2980 template< typename pass_type > 2981 Expression * PassVisitor< pass_type >::mutate( DeletedExpr * node ) { 2982 MUTATE_START( node ); 2983 2984 indexerScopedMutate( node->env, *this ); 2985 indexerScopedMutate( node->result, *this ); 2986 maybeMutate_impl( node->expr, *this ); 2987 2988 MUTATE_END( Expression, node ); 2989 } 2990 2991 //-------------------------------------------------------------------------- 2992 // DefaultArgExpr 2993 template< typename pass_type > 2994 void PassVisitor< pass_type >::visit( DefaultArgExpr * node ) { 2995 VISIT_START( node ); 2996 2997 indexerScopedAccept( node->result, *this ); 2998 maybeAccept_impl ( node->expr, *this ); 2999 3000 VISIT_END( node ); 3001 } 3002 3003 template< typename pass_type > 3004 void PassVisitor< pass_type >::visit( const DefaultArgExpr * node ) { 3005 VISIT_START( node ); 3006 3007 indexerScopedAccept( node->result, *this ); 3008 maybeAccept_impl ( node->expr, *this ); 2117 maybeAccept_impl( node->expr, *this ); 3009 2118 3010 2119 VISIT_END( node ); … … 3039 2148 3040 2149 template< typename pass_type > 3041 void PassVisitor< pass_type >::visit( const GenericExpr * node ) {3042 VISIT_START( node );3043 3044 indexerScopedAccept( node->result, *this );3045 maybeAccept_impl( node->control, *this );3046 for ( const GenericExpr::Association & assoc : node->associations ) {3047 indexerScopedAccept( assoc.type, *this );3048 maybeAccept_impl( assoc.expr, *this );3049 }3050 3051 VISIT_END( node );3052 }3053 3054 template< typename pass_type >3055 2150 Expression * PassVisitor< pass_type >::mutate( GenericExpr * node ) { 3056 2151 MUTATE_START( node ); … … 3079 2174 3080 2175 template< typename pass_type > 3081 void PassVisitor< pass_type >::visit( const VoidType * node ) {3082 VISIT_START( node );3083 3084 maybeAccept_impl( node->forall, *this );3085 3086 VISIT_END( node );3087 }3088 3089 template< typename pass_type >3090 2176 Type * PassVisitor< pass_type >::mutate( VoidType * node ) { 3091 2177 MUTATE_START( node ); … … 3100 2186 template< typename pass_type > 3101 2187 void PassVisitor< pass_type >::visit( BasicType * node ) { 3102 VISIT_START( node );3103 3104 maybeAccept_impl( node->forall, *this );3105 3106 VISIT_END( node );3107 }3108 3109 template< typename pass_type >3110 void PassVisitor< pass_type >::visit( const BasicType * node ) {3111 2188 VISIT_START( node ); 3112 2189 … … 3139 2216 3140 2217 template< typename pass_type > 3141 void PassVisitor< pass_type >::visit( const PointerType * node ) {3142 VISIT_START( node );3143 3144 maybeAccept_impl( node->forall, *this );3145 // xxx - should PointerType visit/mutate dimension?3146 maybeAccept_impl( node->base, *this );3147 3148 VISIT_END( node );3149 }3150 3151 template< typename pass_type >3152 2218 Type * PassVisitor< pass_type >::mutate( PointerType * node ) { 3153 2219 MUTATE_START( node ); … … 3174 2240 3175 2241 template< typename pass_type > 3176 void PassVisitor< pass_type >::visit( const ArrayType * node ) {3177 VISIT_START( node );3178 3179 maybeAccept_impl( node->forall, *this );3180 maybeAccept_impl( node->dimension, *this );3181 maybeAccept_impl( node->base, *this );3182 3183 VISIT_END( node );3184 }3185 3186 template< typename pass_type >3187 2242 Type * PassVisitor< pass_type >::mutate( ArrayType * node ) { 3188 2243 MUTATE_START( node ); … … 3208 2263 3209 2264 template< typename pass_type > 3210 void PassVisitor< pass_type >::visit( const ReferenceType * node ) {3211 VISIT_START( node );3212 3213 maybeAccept_impl( node->forall, *this );3214 maybeAccept_impl( node->base, *this );3215 3216 VISIT_END( node );3217 }3218 3219 template< typename pass_type >3220 2265 Type * PassVisitor< pass_type >::mutate( ReferenceType * node ) { 3221 2266 MUTATE_START( node ); … … 3241 2286 3242 2287 template< typename pass_type > 3243 void PassVisitor< pass_type >::visit( const QualifiedType * node ) {3244 VISIT_START( node );3245 3246 maybeAccept_impl( node->forall, *this );3247 maybeAccept_impl( node->parent, *this );3248 maybeAccept_impl( node->child, *this );3249 3250 VISIT_END( node );3251 }3252 3253 template< typename pass_type >3254 2288 Type * PassVisitor< pass_type >::mutate( QualifiedType * node ) { 3255 2289 MUTATE_START( node ); … … 3266 2300 template< typename pass_type > 3267 2301 void PassVisitor< pass_type >::visit( FunctionType * node ) { 3268 VISIT_START( node );3269 3270 maybeAccept_impl( node->forall, *this );3271 maybeAccept_impl( node->returnVals, *this );3272 maybeAccept_impl( node->parameters, *this );3273 3274 VISIT_END( node );3275 }3276 3277 template< typename pass_type >3278 void PassVisitor< pass_type >::visit( const FunctionType * node ) {3279 2302 VISIT_START( node ); 3280 2303 … … 3315 2338 3316 2339 template< typename pass_type > 3317 void PassVisitor< pass_type >::visit( const StructInstType * node ) { 2340 Type * PassVisitor< pass_type >::mutate( StructInstType * node ) { 2341 MUTATE_START( node ); 2342 2343 indexerAddStruct( node->name ); 2344 2345 { 2346 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 2347 maybeMutate_impl( node->forall , *this ); 2348 maybeMutate_impl( node->parameters, *this ); 2349 } 2350 2351 MUTATE_END( Type, node ); 2352 } 2353 2354 //-------------------------------------------------------------------------- 2355 // UnionInstType 2356 template< typename pass_type > 2357 void PassVisitor< pass_type >::visit( UnionInstType * node ) { 3318 2358 VISIT_START( node ); 3319 2359 … … 3330 2370 3331 2371 template< typename pass_type > 3332 Type * PassVisitor< pass_type >::mutate( StructInstType * node ) {2372 Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) { 3333 2373 MUTATE_START( node ); 3334 2374 … … 3345 2385 3346 2386 //-------------------------------------------------------------------------- 3347 // UnionInstType3348 template< typename pass_type >3349 void PassVisitor< pass_type >::visit( UnionInstType * node ) {3350 VISIT_START( node );3351 3352 indexerAddStruct( node->name );3353 3354 {3355 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );3356 maybeAccept_impl( node->forall , *this );3357 maybeAccept_impl( node->parameters, *this );3358 }3359 3360 VISIT_END( node );3361 }3362 3363 template< typename pass_type >3364 void PassVisitor< pass_type >::visit( const UnionInstType * node ) {3365 VISIT_START( node );3366 3367 indexerAddStruct( node->name );3368 3369 {3370 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );3371 maybeAccept_impl( node->forall , *this );3372 maybeAccept_impl( node->parameters, *this );3373 }3374 3375 VISIT_END( node );3376 }3377 3378 template< typename pass_type >3379 Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) {3380 MUTATE_START( node );3381 3382 indexerAddStruct( node->name );3383 3384 {3385 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );3386 maybeMutate_impl( node->forall , *this );3387 maybeMutate_impl( node->parameters, *this );3388 }3389 3390 MUTATE_END( Type, node );3391 }3392 3393 //--------------------------------------------------------------------------3394 2387 // EnumInstType 3395 2388 template< typename pass_type > … … 3404 2397 3405 2398 template< typename pass_type > 3406 void PassVisitor< pass_type >::visit( const EnumInstType * node ) {3407 VISIT_START( node );3408 3409 maybeAccept_impl( node->forall, *this );3410 maybeAccept_impl( node->parameters, *this );3411 3412 VISIT_END( node );3413 }3414 3415 template< typename pass_type >3416 2399 Type * PassVisitor< pass_type >::mutate( EnumInstType * node ) { 3417 2400 MUTATE_START( node ); … … 3436 2419 3437 2420 template< typename pass_type > 3438 void PassVisitor< pass_type >::visit( const TraitInstType * node ) {3439 VISIT_START( node );3440 3441 maybeAccept_impl( node->forall , *this );3442 maybeAccept_impl( node->parameters, *this );3443 3444 VISIT_END( node );3445 }3446 3447 template< typename pass_type >3448 2421 Type * PassVisitor< pass_type >::mutate( TraitInstType * node ) { 3449 2422 MUTATE_START( node ); … … 3459 2432 template< typename pass_type > 3460 2433 void PassVisitor< pass_type >::visit( TypeInstType * node ) { 3461 VISIT_START( node );3462 3463 maybeAccept_impl( node->forall , *this );3464 maybeAccept_impl( node->parameters, *this );3465 3466 VISIT_END( node );3467 }3468 3469 template< typename pass_type >3470 void PassVisitor< pass_type >::visit( const TypeInstType * node ) {3471 2434 VISIT_START( node ); 3472 2435 … … 3501 2464 3502 2465 template< typename pass_type > 3503 void PassVisitor< pass_type >::visit( const TupleType * node ) {3504 VISIT_START( node );3505 3506 maybeAccept_impl( node->forall, *this );3507 maybeAccept_impl( node->types, *this );3508 maybeAccept_impl( node->members, *this );3509 3510 VISIT_END( node );3511 }3512 3513 template< typename pass_type >3514 2466 Type * PassVisitor< pass_type >::mutate( TupleType * node ) { 3515 2467 MUTATE_START( node ); … … 3526 2478 template< typename pass_type > 3527 2479 void PassVisitor< pass_type >::visit( TypeofType * node ) { 3528 VISIT_START( node );3529 3530 assert( node->expr );3531 maybeAccept_impl( node->expr, *this );3532 3533 VISIT_END( node );3534 }3535 3536 template< typename pass_type >3537 void PassVisitor< pass_type >::visit( const TypeofType * node ) {3538 2480 VISIT_START( node ); 3539 2481 … … 3572 2514 3573 2515 template< typename pass_type > 3574 void PassVisitor< pass_type >::visit( const AttrType * node ) {3575 VISIT_START( node );3576 3577 if ( node->isType ) {3578 assert( node->type );3579 maybeAccept_impl( node->type, *this );3580 } else {3581 assert( node->expr );3582 maybeAccept_impl( node->expr, *this );3583 } // if3584 3585 VISIT_END( node );3586 }3587 3588 template< typename pass_type >3589 2516 Type * PassVisitor< pass_type >::mutate( AttrType * node ) { 3590 2517 MUTATE_START( node ); … … 3613 2540 3614 2541 template< typename pass_type > 3615 void PassVisitor< pass_type >::visit( const VarArgsType * node ) { 2542 Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) { 2543 MUTATE_START( node ); 2544 2545 maybeMutate_impl( node->forall, *this ); 2546 2547 MUTATE_END( Type, node ); 2548 } 2549 2550 //-------------------------------------------------------------------------- 2551 // ZeroType 2552 template< typename pass_type > 2553 void PassVisitor< pass_type >::visit( ZeroType * node ) { 3616 2554 VISIT_START( node ); 3617 2555 … … 3622 2560 3623 2561 template< typename pass_type > 3624 Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) {2562 Type * PassVisitor< pass_type >::mutate( ZeroType * node ) { 3625 2563 MUTATE_START( node ); 3626 2564 … … 3631 2569 3632 2570 //-------------------------------------------------------------------------- 3633 // ZeroType3634 template< typename pass_type > 3635 void PassVisitor< pass_type >::visit( ZeroType * node ) {2571 // OneType 2572 template< typename pass_type > 2573 void PassVisitor< pass_type >::visit( OneType * node ) { 3636 2574 VISIT_START( node ); 3637 2575 … … 3642 2580 3643 2581 template< typename pass_type > 3644 void PassVisitor< pass_type >::visit( const ZeroType * node ) { 2582 Type * PassVisitor< pass_type >::mutate( OneType * node ) { 2583 MUTATE_START( node ); 2584 2585 maybeMutate_impl( node->forall, *this ); 2586 2587 MUTATE_END( Type, node ); 2588 } 2589 2590 //-------------------------------------------------------------------------- 2591 // GlobalScopeType 2592 template< typename pass_type > 2593 void PassVisitor< pass_type >::visit( GlobalScopeType * node ) { 3645 2594 VISIT_START( node ); 3646 2595 … … 3651 2600 3652 2601 template< typename pass_type > 3653 Type * PassVisitor< pass_type >::mutate( ZeroType * node ) {2602 Type * PassVisitor< pass_type >::mutate( GlobalScopeType * node ) { 3654 2603 MUTATE_START( node ); 3655 2604 … … 3660 2609 3661 2610 //-------------------------------------------------------------------------- 3662 // OneType3663 template< typename pass_type >3664 void PassVisitor< pass_type >::visit( OneType * node ) {3665 VISIT_START( node );3666 3667 maybeAccept_impl( node->forall, *this );3668 3669 VISIT_END( node );3670 }3671 3672 template< typename pass_type >3673 void PassVisitor< pass_type >::visit( const OneType * node ) {3674 VISIT_START( node );3675 3676 maybeAccept_impl( node->forall, *this );3677 3678 VISIT_END( node );3679 }3680 3681 template< typename pass_type >3682 Type * PassVisitor< pass_type >::mutate( OneType * node ) {3683 MUTATE_START( node );3684 3685 maybeMutate_impl( node->forall, *this );3686 3687 MUTATE_END( Type, node );3688 }3689 3690 //--------------------------------------------------------------------------3691 // GlobalScopeType3692 template< typename pass_type >3693 void PassVisitor< pass_type >::visit( GlobalScopeType * node ) {3694 VISIT_START( node );3695 3696 maybeAccept_impl( node->forall, *this );3697 3698 VISIT_END( node );3699 }3700 3701 template< typename pass_type >3702 void PassVisitor< pass_type >::visit( const GlobalScopeType * node ) {3703 VISIT_START( node );3704 3705 maybeAccept_impl( node->forall, *this );3706 3707 VISIT_END( node );3708 }3709 3710 template< typename pass_type >3711 Type * PassVisitor< pass_type >::mutate( GlobalScopeType * node ) {3712 MUTATE_START( node );3713 3714 maybeMutate_impl( node->forall, *this );3715 3716 MUTATE_END( Type, node );3717 }3718 3719 //--------------------------------------------------------------------------3720 2611 // Designation 3721 2612 template< typename pass_type > … … 3729 2620 3730 2621 template< typename pass_type > 3731 void PassVisitor< pass_type >::visit( const Designation * node ) {3732 VISIT_START( node );3733 3734 maybeAccept_impl( node->designators, *this );3735 3736 VISIT_END( node );3737 }3738 3739 template< typename pass_type >3740 2622 Designation * PassVisitor< pass_type >::mutate( Designation * node ) { 3741 2623 MUTATE_START( node ); … … 3758 2640 3759 2641 template< typename pass_type > 3760 void PassVisitor< pass_type >::visit( const SingleInit * node ) {3761 VISIT_START( node );3762 3763 visitExpression( node->value );3764 3765 VISIT_END( node );3766 }3767 3768 template< typename pass_type >3769 2642 Initializer * PassVisitor< pass_type >::mutate( SingleInit * node ) { 3770 2643 MUTATE_START( node ); … … 3779 2652 template< typename pass_type > 3780 2653 void PassVisitor< pass_type >::visit( ListInit * node ) { 3781 VISIT_START( node );3782 3783 maybeAccept_impl( node->designations, *this );3784 maybeAccept_impl( node->initializers, *this );3785 3786 VISIT_END( node );3787 }3788 3789 template< typename pass_type >3790 void PassVisitor< pass_type >::visit( const ListInit * node ) {3791 2654 VISIT_START( node ); 3792 2655 … … 3821 2684 3822 2685 template< typename pass_type > 3823 void PassVisitor< pass_type >::visit( const ConstructorInit * node ) {3824 VISIT_START( node );3825 3826 maybeAccept_impl( node->ctor, *this );3827 maybeAccept_impl( node->dtor, *this );3828 maybeAccept_impl( node->init, *this );3829 3830 VISIT_END( node );3831 }3832 3833 template< typename pass_type >3834 2686 Initializer * PassVisitor< pass_type >::mutate( ConstructorInit * node ) { 3835 2687 MUTATE_START( node ); … … 3852 2704 3853 2705 template< typename pass_type > 3854 void PassVisitor< pass_type >::visit( const Constant * node ) {3855 VISIT_START( node );3856 3857 VISIT_END( node );3858 }3859 3860 template< typename pass_type >3861 2706 Constant * PassVisitor< pass_type >::mutate( Constant * node ) { 3862 2707 MUTATE_START( node ); … … 3869 2714 template< typename pass_type > 3870 2715 void PassVisitor< pass_type >::visit( Attribute * node ) { 3871 VISIT_START( node );3872 3873 maybeAccept_impl( node->parameters, *this );3874 3875 VISIT_END( node );3876 }3877 3878 template< typename pass_type >3879 void PassVisitor< pass_type >::visit( const Attribute * node ) {3880 2716 VISIT_START( node ); 3881 2717
Note:
See TracChangeset
for help on using the changeset viewer.