- Timestamp:
- Feb 1, 2022, 10:10:46 AM (4 years ago)
- Branches:
- ADT, ast-experimental, enum, forall-pointer-decay, master, pthread-emulation, qualifiedEnum
- Children:
- 7b2c8c3c
- Parents:
- f681823 (diff), 89a5a1f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src/AST
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Copy.hpp
rf681823 r376c632a 10 10 // Created On : Wed Jul 10 16:13:00 2019 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Nov 11 9:22:00 202113 // Update Count : 212 // Last Modified On : Wed Dec 15 11:07:00 2021 13 // Update Count : 3 14 14 // 15 15 … … 52 52 Node * deepCopy<Node>( const Node * localRoot ); 53 53 54 template<typename node_t, enum Node::ref_type ref_t> 55 node_t * shallowCopy( const ptr_base<node_t, ref_t> & localRoot ) { 56 return shallowCopy( localRoot.get() ); 57 } 58 59 template<typename node_t, enum Node::ref_type ref_t> 60 node_t * deepCopy( const ptr_base<node_t, ref_t> & localRoot ) { 61 return deepCopy( localRoot.get() ); 62 } 63 54 64 } 55 65 -
src/AST/Node.hpp
rf681823 r376c632a 188 188 } 189 189 190 ptr_base & operator=( const node_t * node ) { 191 assign( node ); 192 return *this; 193 } 194 190 195 template<typename o_node_t> 191 196 ptr_base & operator=( const o_node_t * node ) { -
src/AST/Pass.impl.hpp
rf681823 r376c632a 33 33 /* call the implementation of the previsit of this pass */ \ 34 34 __pass::previsit( core, node, 0 ); 35 36 #define VISIT( code... ) \37 /* if this node should visit its children */ \38 if ( __visit_children() ) { \39 /* visit the children */ \40 code \41 }42 35 43 36 #define VISIT_END( type, node ) \ … … 452 445 VISIT_START( node ); 453 446 454 VISIT(447 if ( __visit_children() ) { 455 448 { 456 449 guard_symtab guard { *this }; … … 460 453 maybe_accept( node, &ObjectDecl::bitfieldWidth ); 461 454 maybe_accept( node, &ObjectDecl::attributes ); 462 )455 } 463 456 464 457 __pass::symtab::addId( core, 0, node ); … … 475 468 __pass::symtab::addId( core, 0, node ); 476 469 477 VISIT(maybe_accept( node, &FunctionDecl::withExprs );) 470 if ( __visit_children() ) { 471 maybe_accept( node, &FunctionDecl::withExprs ); 472 } 478 473 { 479 474 // with clause introduces a level of scope (for the with expression members). … … 493 488 } }; 494 489 __pass::symtab::addId( core, 0, func ); 495 VISIT(490 if ( __visit_children() ) { 496 491 // parameter declarations 497 492 maybe_accept( node, &FunctionDecl::params ); … … 509 504 maybe_accept( node, &FunctionDecl::stmts ); 510 505 maybe_accept( node, &FunctionDecl::attributes ); 511 )506 } 512 507 } 513 508 } … … 526 521 __pass::symtab::addStructFwd( core, 0, node ); 527 522 528 VISIT({523 if ( __visit_children() ) { 529 524 guard_symtab guard { * this }; 530 525 maybe_accept( node, &StructDecl::params ); 531 526 maybe_accept( node, &StructDecl::members ); 532 527 maybe_accept( node, &StructDecl::attributes ); 533 } )528 } 534 529 535 530 // this addition replaces the forward declaration … … 548 543 __pass::symtab::addUnionFwd( core, 0, node ); 549 544 550 VISIT({545 if ( __visit_children() ) { 551 546 guard_symtab guard { * this }; 552 547 maybe_accept( node, &UnionDecl::params ); 553 548 maybe_accept( node, &UnionDecl::members ); 554 549 maybe_accept( node, &UnionDecl::attributes ); 555 } )550 } 556 551 557 552 __pass::symtab::addUnion( core, 0, node ); … … 568 563 __pass::symtab::addEnum( core, 0, node ); 569 564 570 VISIT(565 if ( __visit_children() ) { 571 566 // unlike structs, traits, and unions, enums inject their members into the global scope 572 567 maybe_accept( node, &EnumDecl::params ); 573 568 maybe_accept( node, &EnumDecl::members ); 574 569 maybe_accept( node, &EnumDecl::attributes ); 575 )570 } 576 571 577 572 VISIT_END( Decl, node ); … … 584 579 VISIT_START( node ); 585 580 586 VISIT({581 if ( __visit_children() ) { 587 582 guard_symtab guard { *this }; 588 583 maybe_accept( node, &TraitDecl::params ); 589 584 maybe_accept( node, &TraitDecl::members ); 590 585 maybe_accept( node, &TraitDecl::attributes ); 591 } )586 } 592 587 593 588 __pass::symtab::addTrait( core, 0, node ); … … 602 597 VISIT_START( node ); 603 598 604 VISIT({599 if ( __visit_children() ) { 605 600 guard_symtab guard { *this }; 606 601 maybe_accept( node, &TypeDecl::base ); 607 } )602 } 608 603 609 604 // see A NOTE ON THE ORDER OF TRAVERSAL, above … … 612 607 __pass::symtab::addType( core, 0, node ); 613 608 614 VISIT(609 if ( __visit_children() ) { 615 610 maybe_accept( node, &TypeDecl::assertions ); 616 611 … … 619 614 maybe_accept( node, &TypeDecl::init ); 620 615 } 621 )616 } 622 617 623 618 VISIT_END( Decl, node ); … … 630 625 VISIT_START( node ); 631 626 632 VISIT({627 if ( __visit_children() ) { 633 628 guard_symtab guard { *this }; 634 629 maybe_accept( node, &TypedefDecl::base ); 635 } )630 } 636 631 637 632 __pass::symtab::addType( core, 0, node ); 638 633 639 VISIT( maybe_accept( node, &TypedefDecl::assertions ); ) 634 if ( __visit_children() ) { 635 maybe_accept( node, &TypedefDecl::assertions ); 636 } 640 637 641 638 VISIT_END( Decl, node ); … … 648 645 VISIT_START( node ); 649 646 650 VISIT(647 if ( __visit_children() ) { 651 648 maybe_accept( node, &AsmDecl::stmt ); 652 )649 } 653 650 654 651 VISIT_END( AsmDecl, node ); … … 661 658 VISIT_START( node ); 662 659 663 VISIT(660 if ( __visit_children() ) { 664 661 maybe_accept( node, &DirectiveDecl::stmt ); 665 )662 } 666 663 667 664 VISIT_END( DirectiveDecl, node ); … … 674 671 VISIT_START( node ); 675 672 676 VISIT(673 if ( __visit_children() ) { 677 674 maybe_accept( node, &StaticAssertDecl::cond ); 678 675 maybe_accept( node, &StaticAssertDecl::msg ); 679 )676 } 680 677 681 678 VISIT_END( StaticAssertDecl, node ); … … 687 684 const ast::CompoundStmt * ast::Pass< core_t >::visit( const ast::CompoundStmt * node ) { 688 685 VISIT_START( node ); 689 VISIT( 686 687 if ( __visit_children() ) { 690 688 // Do not enter (or leave) a new scope if atFunctionTop. Remember to save the result. 691 689 auto guard1 = makeFuncGuard( [this, enterScope = !this->atFunctionTop]() { … … 704 702 guard_scope guard3 { *this }; 705 703 maybe_accept( node, &CompoundStmt::kids ); 706 ) 704 } 705 707 706 VISIT_END( CompoundStmt, node ); 708 707 } … … 714 713 VISIT_START( node ); 715 714 716 VISIT(715 if ( __visit_children() ) { 717 716 maybe_accept( node, &ExprStmt::expr ); 718 )717 } 719 718 720 719 VISIT_END( Stmt, node ); … … 727 726 VISIT_START( node ) 728 727 729 VISIT(728 if ( __visit_children() ) { 730 729 maybe_accept( node, &AsmStmt::instruction ); 731 730 maybe_accept( node, &AsmStmt::output ); 732 731 maybe_accept( node, &AsmStmt::input ); 733 732 maybe_accept( node, &AsmStmt::clobber ); 734 )733 } 735 734 736 735 VISIT_END( Stmt, node ); … … 752 751 VISIT_START( node ); 753 752 754 VISIT({753 if ( __visit_children() ) { 755 754 // if statements introduce a level of scope (for the initialization) 756 755 guard_symtab guard { *this }; … … 759 758 maybe_accept_as_compound( node, &IfStmt::thenPart ); 760 759 maybe_accept_as_compound( node, &IfStmt::elsePart ); 761 } )760 } 762 761 763 762 VISIT_END( Stmt, node ); … … 770 769 VISIT_START( node ); 771 770 772 VISIT({771 if ( __visit_children() ) { 773 772 // while statements introduce a level of scope (for the initialization) 774 773 guard_symtab guard { *this }; … … 776 775 maybe_accept( node, &WhileStmt::cond ); 777 776 maybe_accept_as_compound( node, &WhileStmt::body ); 778 } )777 } 779 778 780 779 VISIT_END( Stmt, node ); … … 787 786 VISIT_START( node ); 788 787 789 VISIT({788 if ( __visit_children() ) { 790 789 // for statements introduce a level of scope (for the initialization) 791 790 guard_symtab guard { *this }; … … 795 794 maybe_accept( node, &ForStmt::inc ); 796 795 maybe_accept_as_compound( node, &ForStmt::body ); 797 } )796 } 798 797 799 798 VISIT_END( Stmt, node ); … … 806 805 VISIT_START( node ); 807 806 808 VISIT(807 if ( __visit_children() ) { 809 808 maybe_accept( node, &SwitchStmt::cond ); 810 809 maybe_accept( node, &SwitchStmt::stmts ); 811 )810 } 812 811 813 812 VISIT_END( Stmt, node ); … … 820 819 VISIT_START( node ); 821 820 822 VISIT(821 if ( __visit_children() ) { 823 822 maybe_accept( node, &CaseStmt::cond ); 824 823 maybe_accept( node, &CaseStmt::stmts ); 825 )824 } 826 825 827 826 VISIT_END( Stmt, node ); … … 842 841 VISIT_START( node ); 843 842 844 VISIT(843 if ( __visit_children() ) { 845 844 maybe_accept( node, &ReturnStmt::expr ); 846 )845 } 847 846 848 847 VISIT_END( Stmt, node ); … … 855 854 VISIT_START( node ); 856 855 857 VISIT(856 if ( __visit_children() ) { 858 857 maybe_accept( node, &ThrowStmt::expr ); 859 858 maybe_accept( node, &ThrowStmt::target ); 860 )859 } 861 860 862 861 VISIT_END( Stmt, node ); … … 869 868 VISIT_START( node ); 870 869 871 VISIT(870 if ( __visit_children() ) { 872 871 maybe_accept( node, &TryStmt::body ); 873 872 maybe_accept( node, &TryStmt::handlers ); 874 873 maybe_accept( node, &TryStmt::finally ); 875 )874 } 876 875 877 876 VISIT_END( Stmt, node ); … … 884 883 VISIT_START( node ); 885 884 886 VISIT({885 if ( __visit_children() ) { 887 886 // catch statements introduce a level of scope (for the caught exception) 888 887 guard_symtab guard { *this }; … … 890 889 maybe_accept( node, &CatchStmt::cond ); 891 890 maybe_accept_as_compound( node, &CatchStmt::body ); 892 } )891 } 893 892 894 893 VISIT_END( Stmt, node ); … … 901 900 VISIT_START( node ); 902 901 903 VISIT(902 if ( __visit_children() ) { 904 903 maybe_accept( node, &FinallyStmt::body ); 905 )904 } 906 905 907 906 VISIT_END( Stmt, node ); … … 914 913 VISIT_START( node ); 915 914 916 VISIT(915 if ( __visit_children() ) { 917 916 maybe_accept( node, &SuspendStmt::then ); 918 )917 } 919 918 920 919 VISIT_END( Stmt, node ); … … 934 933 // } 935 934 936 VISIT({935 if ( __visit_children() ) { 937 936 std::vector<WaitForStmt::Clause> new_clauses; 938 937 new_clauses.reserve( node->clauses.size() ); … … 965 964 node = n; 966 965 } 967 } )966 } 968 967 969 968 #define maybe_accept(field) \ … … 977 976 } 978 977 979 VISIT(978 if ( __visit_children() ) { 980 979 maybe_accept( timeout.time ); 981 980 maybe_accept( timeout.stmt ); … … 983 982 maybe_accept( orElse.stmt ); 984 983 maybe_accept( orElse.cond ); 985 )984 } 986 985 987 986 #undef maybe_accept … … 996 995 VISIT_START( node ); 997 996 998 VISIT(997 if ( __visit_children() ) { 999 998 maybe_accept( node, &WithStmt::exprs ); 1000 999 { … … 1004 1003 maybe_accept( node, &WithStmt::stmt ); 1005 1004 } 1006 ) 1005 } 1006 1007 1007 VISIT_END( Stmt, node ); 1008 1008 } … … 1022 1022 VISIT_START( node ); 1023 1023 1024 VISIT(1024 if ( __visit_children() ) { 1025 1025 maybe_accept( node, &DeclStmt::decl ); 1026 )1026 } 1027 1027 1028 1028 VISIT_END( Stmt, node ); … … 1037 1037 // For now this isn't visited, it is unclear if this causes problem 1038 1038 // if all tests are known to pass, remove this code 1039 VISIT(1039 if ( __visit_children() ) { 1040 1040 maybe_accept( node, &ImplicitCtorDtorStmt::callStmt ); 1041 )1041 } 1042 1042 1043 1043 VISIT_END( Stmt, node ); … … 1050 1050 VISIT_START( node ); 1051 1051 1052 VISIT({1052 if ( __visit_children() ) { 1053 1053 // mutex statements introduce a level of scope (for the initialization) 1054 1054 guard_symtab guard { *this }; 1055 1055 maybe_accept( node, &MutexStmt::stmt ); 1056 1056 maybe_accept( node, &MutexStmt::mutexObjs ); 1057 } )1057 } 1058 1058 1059 1059 VISIT_END( Stmt, node ); … … 1066 1066 VISIT_START( node ); 1067 1067 1068 VISIT(1068 if ( __visit_children() ) { 1069 1069 { 1070 1070 guard_symtab guard { *this }; … … 1073 1073 maybe_accept( node, &ApplicationExpr::func ); 1074 1074 maybe_accept( node, &ApplicationExpr::args ); 1075 )1075 } 1076 1076 1077 1077 VISIT_END( Expr, node ); … … 1084 1084 VISIT_START( node ); 1085 1085 1086 VISIT(1086 if ( __visit_children() ) { 1087 1087 { 1088 1088 guard_symtab guard { *this }; … … 1091 1091 1092 1092 maybe_accept( node, &UntypedExpr::args ); 1093 )1093 } 1094 1094 1095 1095 VISIT_END( Expr, node ); … … 1102 1102 VISIT_START( node ); 1103 1103 1104 VISIT({1104 if ( __visit_children() ) { 1105 1105 guard_symtab guard { *this }; 1106 1106 maybe_accept( node, &NameExpr::result ); 1107 } )1107 } 1108 1108 1109 1109 VISIT_END( Expr, node ); … … 1116 1116 VISIT_START( node ); 1117 1117 1118 VISIT({ 1118 if ( __visit_children() ) { 1119 { 1119 1120 guard_symtab guard { *this }; 1120 1121 maybe_accept( node, &CastExpr::result ); 1121 1122 } 1122 1123 maybe_accept( node, &CastExpr::arg ); 1123 )1124 } 1124 1125 1125 1126 VISIT_END( Expr, node ); … … 1132 1133 VISIT_START( node ); 1133 1134 1134 VISIT({ 1135 if ( __visit_children() ) { 1136 { 1135 1137 guard_symtab guard { *this }; 1136 1138 maybe_accept( node, &KeywordCastExpr::result ); 1137 1139 } 1138 1140 maybe_accept( node, &KeywordCastExpr::arg ); 1139 )1141 } 1140 1142 1141 1143 VISIT_END( Expr, node ); … … 1148 1150 VISIT_START( node ); 1149 1151 1150 VISIT({ 1152 if ( __visit_children() ) { 1153 { 1151 1154 guard_symtab guard { *this }; 1152 1155 maybe_accept( node, &VirtualCastExpr::result ); 1153 1156 } 1154 1157 maybe_accept( node, &VirtualCastExpr::arg ); 1155 )1158 } 1156 1159 1157 1160 VISIT_END( Expr, node ); … … 1164 1167 VISIT_START( node ); 1165 1168 1166 VISIT({ 1169 if ( __visit_children() ) { 1170 { 1167 1171 guard_symtab guard { *this }; 1168 1172 maybe_accept( node, &AddressExpr::result ); 1169 1173 } 1170 1174 maybe_accept( node, &AddressExpr::arg ); 1171 )1175 } 1172 1176 1173 1177 VISIT_END( Expr, node ); … … 1180 1184 VISIT_START( node ); 1181 1185 1182 VISIT({1186 if ( __visit_children() ) { 1183 1187 guard_symtab guard { *this }; 1184 1188 maybe_accept( node, &LabelAddressExpr::result ); 1185 } )1189 } 1186 1190 1187 1191 VISIT_END( Expr, node ); … … 1194 1198 VISIT_START( node ); 1195 1199 1196 VISIT({ 1200 if ( __visit_children() ) { 1201 { 1197 1202 guard_symtab guard { *this }; 1198 1203 maybe_accept( node, &UntypedMemberExpr::result ); … … 1200 1205 maybe_accept( node, &UntypedMemberExpr::aggregate ); 1201 1206 maybe_accept( node, &UntypedMemberExpr::member ); 1202 )1207 } 1203 1208 1204 1209 VISIT_END( Expr, node ); … … 1211 1216 VISIT_START( node ); 1212 1217 1213 VISIT({ 1218 if ( __visit_children() ) { 1219 { 1214 1220 guard_symtab guard { *this }; 1215 1221 maybe_accept( node, &MemberExpr::result ); 1216 1222 } 1217 1223 maybe_accept( node, &MemberExpr::aggregate ); 1218 )1224 } 1219 1225 1220 1226 VISIT_END( Expr, node ); … … 1227 1233 VISIT_START( node ); 1228 1234 1229 VISIT({1235 if ( __visit_children() ) { 1230 1236 guard_symtab guard { *this }; 1231 1237 maybe_accept( node, &VariableExpr::result ); 1232 } )1238 } 1233 1239 1234 1240 VISIT_END( Expr, node ); … … 1241 1247 VISIT_START( node ); 1242 1248 1243 VISIT({1249 if ( __visit_children() ) { 1244 1250 guard_symtab guard { *this }; 1245 1251 maybe_accept( node, &ConstantExpr::result ); 1246 } )1252 } 1247 1253 1248 1254 VISIT_END( Expr, node ); … … 1255 1261 VISIT_START( node ); 1256 1262 1257 VISIT({ 1263 if ( __visit_children() ) { 1264 { 1258 1265 guard_symtab guard { *this }; 1259 1266 maybe_accept( node, &SizeofExpr::result ); … … 1264 1271 maybe_accept( node, &SizeofExpr::expr ); 1265 1272 } 1266 )1273 } 1267 1274 1268 1275 VISIT_END( Expr, node ); … … 1275 1282 VISIT_START( node ); 1276 1283 1277 VISIT({ 1284 if ( __visit_children() ) { 1285 { 1278 1286 guard_symtab guard { *this }; 1279 1287 maybe_accept( node, &AlignofExpr::result ); … … 1284 1292 maybe_accept( node, &AlignofExpr::expr ); 1285 1293 } 1286 )1294 } 1287 1295 1288 1296 VISIT_END( Expr, node ); … … 1295 1303 VISIT_START( node ); 1296 1304 1297 VISIT({ 1305 if ( __visit_children() ) { 1306 { 1298 1307 guard_symtab guard { *this }; 1299 1308 maybe_accept( node, &UntypedOffsetofExpr::result ); 1300 1309 } 1301 1310 maybe_accept( node, &UntypedOffsetofExpr::type ); 1302 )1311 } 1303 1312 1304 1313 VISIT_END( Expr, node ); … … 1311 1320 VISIT_START( node ); 1312 1321 1313 VISIT({ 1322 if ( __visit_children() ) { 1323 { 1314 1324 guard_symtab guard { *this }; 1315 1325 maybe_accept( node, &OffsetofExpr::result ); 1316 1326 } 1317 1327 maybe_accept( node, &OffsetofExpr::type ); 1318 )1328 } 1319 1329 1320 1330 VISIT_END( Expr, node ); … … 1327 1337 VISIT_START( node ); 1328 1338 1329 VISIT({ 1339 if ( __visit_children() ) { 1340 { 1330 1341 guard_symtab guard { *this }; 1331 1342 maybe_accept( node, &OffsetPackExpr::result ); 1332 1343 } 1333 1344 maybe_accept( node, &OffsetPackExpr::type ); 1334 )1345 } 1335 1346 1336 1347 VISIT_END( Expr, node ); … … 1343 1354 VISIT_START( node ); 1344 1355 1345 VISIT({ 1356 if ( __visit_children() ) { 1357 { 1346 1358 guard_symtab guard { *this }; 1347 1359 maybe_accept( node, &LogicalExpr::result ); … … 1349 1361 maybe_accept( node, &LogicalExpr::arg1 ); 1350 1362 maybe_accept( node, &LogicalExpr::arg2 ); 1351 )1363 } 1352 1364 1353 1365 VISIT_END( Expr, node ); … … 1360 1372 VISIT_START( node ); 1361 1373 1362 VISIT({ 1374 if ( __visit_children() ) { 1375 { 1363 1376 guard_symtab guard { *this }; 1364 1377 maybe_accept( node, &ConditionalExpr::result ); … … 1367 1380 maybe_accept( node, &ConditionalExpr::arg2 ); 1368 1381 maybe_accept( node, &ConditionalExpr::arg3 ); 1369 )1382 } 1370 1383 1371 1384 VISIT_END( Expr, node ); … … 1378 1391 VISIT_START( node ); 1379 1392 1380 VISIT({ 1393 if ( __visit_children() ) { 1394 { 1381 1395 guard_symtab guard { *this }; 1382 1396 maybe_accept( node, &CommaExpr::result ); … … 1384 1398 maybe_accept( node, &CommaExpr::arg1 ); 1385 1399 maybe_accept( node, &CommaExpr::arg2 ); 1386 )1400 } 1387 1401 1388 1402 VISIT_END( Expr, node ); … … 1395 1409 VISIT_START( node ); 1396 1410 1397 VISIT({ 1411 if ( __visit_children() ) { 1412 { 1398 1413 guard_symtab guard { *this }; 1399 1414 maybe_accept( node, &TypeExpr::result ); 1400 1415 } 1401 1416 maybe_accept( node, &TypeExpr::type ); 1402 )1417 } 1403 1418 1404 1419 VISIT_END( Expr, node ); … … 1411 1426 VISIT_START( node ); 1412 1427 1413 VISIT({ 1428 if ( __visit_children() ) { 1429 { 1414 1430 guard_symtab guard { *this }; 1415 1431 maybe_accept( node, &AsmExpr::result ); … … 1417 1433 maybe_accept( node, &AsmExpr::constraint ); 1418 1434 maybe_accept( node, &AsmExpr::operand ); 1419 )1435 } 1420 1436 1421 1437 VISIT_END( Expr, node ); … … 1428 1444 VISIT_START( node ); 1429 1445 1430 VISIT({ 1446 if ( __visit_children() ) { 1447 { 1431 1448 guard_symtab guard { *this }; 1432 1449 maybe_accept( node, &ImplicitCopyCtorExpr::result ); 1433 1450 } 1434 1451 maybe_accept( node, &ImplicitCopyCtorExpr::callExpr ); 1435 )1452 } 1436 1453 1437 1454 VISIT_END( Expr, node ); … … 1444 1461 VISIT_START( node ); 1445 1462 1446 VISIT({ 1463 if ( __visit_children() ) { 1464 { 1447 1465 guard_symtab guard { *this }; 1448 1466 maybe_accept( node, &ConstructorExpr::result ); 1449 1467 } 1450 1468 maybe_accept( node, &ConstructorExpr::callExpr ); 1451 )1469 } 1452 1470 1453 1471 VISIT_END( Expr, node ); … … 1460 1478 VISIT_START( node ); 1461 1479 1462 VISIT({ 1480 if ( __visit_children() ) { 1481 { 1463 1482 guard_symtab guard { *this }; 1464 1483 maybe_accept( node, &CompoundLiteralExpr::result ); 1465 1484 } 1466 1485 maybe_accept( node, &CompoundLiteralExpr::init ); 1467 )1486 } 1468 1487 1469 1488 VISIT_END( Expr, node ); … … 1476 1495 VISIT_START( node ); 1477 1496 1478 VISIT({ 1497 if ( __visit_children() ) { 1498 { 1479 1499 guard_symtab guard { *this }; 1480 1500 maybe_accept( node, &RangeExpr::result ); … … 1482 1502 maybe_accept( node, &RangeExpr::low ); 1483 1503 maybe_accept( node, &RangeExpr::high ); 1484 )1504 } 1485 1505 1486 1506 VISIT_END( Expr, node ); … … 1493 1513 VISIT_START( node ); 1494 1514 1495 VISIT({ 1515 if ( __visit_children() ) { 1516 { 1496 1517 guard_symtab guard { *this }; 1497 1518 maybe_accept( node, &UntypedTupleExpr::result ); 1498 1519 } 1499 1520 maybe_accept( node, &UntypedTupleExpr::exprs ); 1500 )1521 } 1501 1522 1502 1523 VISIT_END( Expr, node ); … … 1509 1530 VISIT_START( node ); 1510 1531 1511 VISIT({ 1532 if ( __visit_children() ) { 1533 { 1512 1534 guard_symtab guard { *this }; 1513 1535 maybe_accept( node, &TupleExpr::result ); 1514 1536 } 1515 1537 maybe_accept( node, &TupleExpr::exprs ); 1516 )1538 } 1517 1539 1518 1540 VISIT_END( Expr, node ); … … 1525 1547 VISIT_START( node ); 1526 1548 1527 VISIT({ 1549 if ( __visit_children() ) { 1550 { 1528 1551 guard_symtab guard { *this }; 1529 1552 maybe_accept( node, &TupleIndexExpr::result ); 1530 1553 } 1531 1554 maybe_accept( node, &TupleIndexExpr::tuple ); 1532 )1555 } 1533 1556 1534 1557 VISIT_END( Expr, node ); … … 1541 1564 VISIT_START( node ); 1542 1565 1543 VISIT({ 1566 if ( __visit_children() ) { 1567 { 1544 1568 guard_symtab guard { *this }; 1545 1569 maybe_accept( node, &TupleAssignExpr::result ); 1546 1570 } 1547 1571 maybe_accept( node, &TupleAssignExpr::stmtExpr ); 1548 )1572 } 1549 1573 1550 1574 VISIT_END( Expr, node ); … … 1557 1581 VISIT_START( node ); 1558 1582 1559 VISIT(// don't want statements from outer CompoundStmts to be added to this StmtExpr 1583 if ( __visit_children() ) { 1584 // don't want statements from outer CompoundStmts to be added to this StmtExpr 1560 1585 // get the stmts that will need to be spliced in 1561 1586 auto stmts_before = __pass::stmtsToAddBefore( core, 0); … … 1574 1599 maybe_accept( node, &StmtExpr::returnDecls ); 1575 1600 maybe_accept( node, &StmtExpr::dtors ); 1576 )1601 } 1577 1602 1578 1603 VISIT_END( Expr, node ); … … 1585 1610 VISIT_START( node ); 1586 1611 1587 VISIT({ 1612 if ( __visit_children() ) { 1613 { 1588 1614 guard_symtab guard { *this }; 1589 1615 maybe_accept( node, &UniqueExpr::result ); 1590 1616 } 1591 1617 maybe_accept( node, &UniqueExpr::expr ); 1592 )1618 } 1593 1619 1594 1620 VISIT_END( Expr, node ); … … 1601 1627 VISIT_START( node ); 1602 1628 1603 VISIT({ 1629 if ( __visit_children() ) { 1630 { 1604 1631 guard_symtab guard { *this }; 1605 1632 maybe_accept( node, &UntypedInitExpr::result ); … … 1607 1634 maybe_accept( node, &UntypedInitExpr::expr ); 1608 1635 // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver. 1609 )1636 } 1610 1637 1611 1638 VISIT_END( Expr, node ); … … 1618 1645 VISIT_START( node ); 1619 1646 1620 VISIT({ 1647 if ( __visit_children() ) { 1648 { 1621 1649 guard_symtab guard { *this }; 1622 1650 maybe_accept( node, &InitExpr::result ); … … 1624 1652 maybe_accept( node, &InitExpr::expr ); 1625 1653 maybe_accept( node, &InitExpr::designation ); 1626 )1654 } 1627 1655 1628 1656 VISIT_END( Expr, node ); … … 1635 1663 VISIT_START( node ); 1636 1664 1637 VISIT({ 1665 if ( __visit_children() ) { 1666 { 1638 1667 guard_symtab guard { *this }; 1639 1668 maybe_accept( node, &DeletedExpr::result ); … … 1641 1670 maybe_accept( node, &DeletedExpr::expr ); 1642 1671 // don't visit deleteStmt, because it is a pointer to somewhere else in the tree. 1643 )1672 } 1644 1673 1645 1674 VISIT_END( Expr, node ); … … 1652 1681 VISIT_START( node ); 1653 1682 1654 VISIT({ 1683 if ( __visit_children() ) { 1684 { 1655 1685 guard_symtab guard { *this }; 1656 1686 maybe_accept( node, &DefaultArgExpr::result ); 1657 1687 } 1658 1688 maybe_accept( node, &DefaultArgExpr::expr ); 1659 )1689 } 1660 1690 1661 1691 VISIT_END( Expr, node ); … … 1668 1698 VISIT_START( node ); 1669 1699 1670 VISIT({ 1700 if ( __visit_children() ) { 1701 { 1671 1702 guard_symtab guard { *this }; 1672 1703 maybe_accept( node, &GenericExpr::result ); … … 1697 1728 node = n; 1698 1729 } 1699 )1730 } 1700 1731 1701 1732 VISIT_END( Expr, node ); … … 1726 1757 VISIT_START( node ); 1727 1758 1728 VISIT(1759 if ( __visit_children() ) { 1729 1760 // xxx - should PointerType visit/mutate dimension? 1730 1761 maybe_accept( node, &PointerType::base ); 1731 )1762 } 1732 1763 1733 1764 VISIT_END( Type, node ); … … 1740 1771 VISIT_START( node ); 1741 1772 1742 VISIT(1773 if ( __visit_children() ) { 1743 1774 maybe_accept( node, &ArrayType::dimension ); 1744 1775 maybe_accept( node, &ArrayType::base ); 1745 )1776 } 1746 1777 1747 1778 VISIT_END( Type, node ); … … 1754 1785 VISIT_START( node ); 1755 1786 1756 VISIT(1787 if ( __visit_children() ) { 1757 1788 maybe_accept( node, &ReferenceType::base ); 1758 )1789 } 1759 1790 1760 1791 VISIT_END( Type, node ); … … 1767 1798 VISIT_START( node ); 1768 1799 1769 VISIT(1800 if ( __visit_children() ) { 1770 1801 maybe_accept( node, &QualifiedType::parent ); 1771 1802 maybe_accept( node, &QualifiedType::child ); 1772 )1803 } 1773 1804 1774 1805 VISIT_END( Type, node ); … … 1781 1812 VISIT_START( node ); 1782 1813 1783 VISIT({1814 if ( __visit_children() ) { 1784 1815 // guard_forall_subs forall_guard { *this, node }; 1785 1816 // mutate_forall( node ); … … 1787 1818 maybe_accept( node, &FunctionType::returns ); 1788 1819 maybe_accept( node, &FunctionType::params ); 1789 } )1820 } 1790 1821 1791 1822 VISIT_END( Type, node ); … … 1800 1831 __pass::symtab::addStruct( core, 0, node->name ); 1801 1832 1802 VISIT({1833 if ( __visit_children() ) { 1803 1834 guard_symtab guard { *this }; 1804 1835 maybe_accept( node, &StructInstType::params ); 1805 } )1836 } 1806 1837 1807 1838 VISIT_END( Type, node ); … … 1816 1847 __pass::symtab::addUnion( core, 0, node->name ); 1817 1848 1818 VISIT({1849 if ( __visit_children() ) { 1819 1850 guard_symtab guard { *this }; 1820 1851 maybe_accept( node, &UnionInstType::params ); 1821 } )1852 } 1822 1853 1823 1854 VISIT_END( Type, node ); … … 1830 1861 VISIT_START( node ); 1831 1862 1832 VISIT({1863 if ( __visit_children() ) { 1833 1864 maybe_accept( node, &EnumInstType::params ); 1834 } )1865 } 1835 1866 1836 1867 VISIT_END( Type, node ); … … 1843 1874 VISIT_START( node ); 1844 1875 1845 VISIT({1876 if ( __visit_children() ) { 1846 1877 maybe_accept( node, &TraitInstType::params ); 1847 } )1878 } 1848 1879 1849 1880 VISIT_END( Type, node ); … … 1856 1887 VISIT_START( node ); 1857 1888 1858 VISIT(1889 if ( __visit_children() ) { 1859 1890 { 1860 1891 maybe_accept( node, &TypeInstType::params ); … … 1862 1893 // ensure that base re-bound if doing substitution 1863 1894 __pass::forall::replace( core, 0, node ); 1864 )1895 } 1865 1896 1866 1897 VISIT_END( Type, node ); … … 1873 1904 VISIT_START( node ); 1874 1905 1875 VISIT(1906 if ( __visit_children() ) { 1876 1907 maybe_accept( node, &TupleType::types ); 1877 1908 maybe_accept( node, &TupleType::members ); 1878 )1909 } 1879 1910 1880 1911 VISIT_END( Type, node ); … … 1887 1918 VISIT_START( node ); 1888 1919 1889 VISIT(1920 if ( __visit_children() ) { 1890 1921 maybe_accept( node, &TypeofType::expr ); 1891 )1922 } 1892 1923 1893 1924 VISIT_END( Type, node ); … … 1900 1931 VISIT_START( node ); 1901 1932 1902 VISIT(1933 if ( __visit_children() ) { 1903 1934 maybe_accept( node, &VTableType::base ); 1904 )1935 } 1905 1936 1906 1937 VISIT_END( Type, node ); … … 1950 1981 VISIT_START( node ); 1951 1982 1952 VISIT( maybe_accept( node, &Designation::designators ); ) 1983 if ( __visit_children() ) { 1984 maybe_accept( node, &Designation::designators ); 1985 } 1953 1986 1954 1987 VISIT_END( Designation, node ); … … 1961 1994 VISIT_START( node ); 1962 1995 1963 VISIT(1996 if ( __visit_children() ) { 1964 1997 maybe_accept( node, &SingleInit::value ); 1965 )1998 } 1966 1999 1967 2000 VISIT_END( Init, node ); … … 1974 2007 VISIT_START( node ); 1975 2008 1976 VISIT(2009 if ( __visit_children() ) { 1977 2010 maybe_accept( node, &ListInit::designations ); 1978 2011 maybe_accept( node, &ListInit::initializers ); 1979 )2012 } 1980 2013 1981 2014 VISIT_END( Init, node ); … … 1988 2021 VISIT_START( node ); 1989 2022 1990 VISIT(2023 if ( __visit_children() ) { 1991 2024 maybe_accept( node, &ConstructorInit::ctor ); 1992 2025 maybe_accept( node, &ConstructorInit::dtor ); 1993 2026 maybe_accept( node, &ConstructorInit::init ); 1994 )2027 } 1995 2028 1996 2029 VISIT_END( Init, node ); … … 2003 2036 VISIT_START( node ); 2004 2037 2005 VISIT(2038 if ( __visit_children() ) { 2006 2039 maybe_accept( node, &Attribute::params ); 2007 )2040 } 2008 2041 2009 2042 VISIT_END( Attribute, node ); … … 2016 2049 VISIT_START( node ); 2017 2050 2018 VISIT(2051 if ( __visit_children() ) { 2019 2052 { 2020 2053 bool mutated = false; … … 2032 2065 } 2033 2066 } 2034 )2067 } 2035 2068 2036 2069 VISIT_END( TypeSubstitution, node ); … … 2038 2071 2039 2072 #undef VISIT_START 2040 #undef VISIT2041 2073 #undef VISIT_END -
src/AST/Stmt.hpp
rf681823 r376c632a 9 9 // Author : Aaron B. Moss 10 10 // Created On : Wed May 8 13:00:00 2019 11 // Last Modified By : Andrew Beach12 // Last Modified On : Fri May 17 12:45:00 201913 // Update Count : 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jan 31 22:38:53 2022 13 // Update Count : 12 14 14 // 15 15 … … 17 17 18 18 #include <list> 19 #include <utility> // for move19 #include <utility> // for move 20 20 #include <vector> 21 21 22 22 #include "Label.hpp" 23 #include "Node.hpp" // for node, ptr23 #include "Node.hpp" // for node, ptr 24 24 #include "ParseNode.hpp" 25 25 #include "Visitor.hpp" … … 27 27 28 28 // Must be included in *all* AST classes; should be #undef'd at the end of the file 29 #define MUTATE_FRIEND \29 #define MUTATE_FRIEND \ 30 30 template<typename node_t> friend node_t * mutate(const node_t * node); \ 31 31 template<typename node_t> friend node_t * shallowCopy(const node_t * node); 32 32 33 33 namespace ast { 34 35 34 class Expr; 36 35 37 // /Base statement node36 // Base statement node 38 37 class Stmt : public ParseNode { 39 public:38 public: 40 39 std::vector<Label> labels; 41 40 42 41 Stmt( const CodeLocation & loc, std::vector<Label> && labels = {} ) 43 : ParseNode(loc), labels(std::move(labels)) {}42 : ParseNode(loc), labels(std::move(labels)) {} 44 43 45 44 Stmt(const Stmt& o) : ParseNode(o), labels(o.labels) {} 46 45 47 46 const Stmt * accept( Visitor & v ) const override = 0; 48 private:47 private: 49 48 Stmt * clone() const override = 0; 50 49 MUTATE_FRIEND 51 50 }; 52 51 53 // / Compound statement `{ ... }`52 // Compound statement: { ... } 54 53 class CompoundStmt final : public Stmt { 55 public:54 public: 56 55 std::list<ptr<Stmt>> kids; 57 56 58 57 CompoundStmt(const CodeLocation & loc, std::list<ptr<Stmt>> && ks = {}, 59 std::vector<Label>&& labels = {} )60 : Stmt(loc, std::move(labels)), kids(std::move(ks)) {}58 std::vector<Label>&& labels = {} ) 59 : Stmt(loc, std::move(labels)), kids(std::move(ks)) {} 61 60 62 61 CompoundStmt( const CompoundStmt& o ); … … 67 66 68 67 const CompoundStmt * accept( Visitor & v ) const override { return v.visit( this ); } 69 private:68 private: 70 69 CompoundStmt * clone() const override { return new CompoundStmt{ *this }; } 71 70 MUTATE_FRIEND 72 71 }; 73 72 74 // / Empty statment `;`73 // Empty statment: ; 75 74 class NullStmt final : public Stmt { 76 public:75 public: 77 76 NullStmt( const CodeLocation & loc, std::vector<Label> && labels = {} ) 78 : Stmt(loc, std::move(labels)) {}77 : Stmt(loc, std::move(labels)) {} 79 78 80 79 const NullStmt * accept( Visitor & v ) const override { return v.visit( this ); } 81 private:80 private: 82 81 NullStmt * clone() const override { return new NullStmt{ *this }; } 83 82 MUTATE_FRIEND 84 83 }; 85 84 86 // /Expression wrapped by statement85 // Expression wrapped by statement 87 86 class ExprStmt final : public Stmt { 88 public:87 public: 89 88 ptr<Expr> expr; 90 89 91 90 ExprStmt( const CodeLocation& loc, const Expr* e, std::vector<Label>&& labels = {} ) 92 : Stmt(loc, std::move(labels)), expr(e) {}93 94 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 95 private:91 : Stmt(loc, std::move(labels)), expr(e) {} 92 93 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 94 private: 96 95 ExprStmt * clone() const override { return new ExprStmt{ *this }; } 97 96 MUTATE_FRIEND 98 97 }; 99 98 100 // / Assembly statement `asm ... ( "..." : ... )`99 // Assembly statement: asm ... ( "..." : ... ) 101 100 class AsmStmt final : public Stmt { 102 public:101 public: 103 102 bool isVolatile; 104 103 ptr<Expr> instruction; … … 108 107 109 108 AsmStmt( const CodeLocation & loc, bool isVolatile, const Expr * instruction, 110 std::vector<ptr<Expr>> && output, std::vector<ptr<Expr>> && input,111 std::vector<ptr<ConstantExpr>> && clobber, std::vector<Label> && gotoLabels,112 std::vector<Label> && labels = {})113 : Stmt(loc, std::move(labels)), isVolatile(isVolatile), instruction(instruction),114 output(std::move(output)), input(std::move(input)), clobber(std::move(clobber)),115 gotoLabels(std::move(gotoLabels)) {}116 117 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 118 private:109 std::vector<ptr<Expr>> && output, std::vector<ptr<Expr>> && input, 110 std::vector<ptr<ConstantExpr>> && clobber, std::vector<Label> && gotoLabels, 111 std::vector<Label> && labels = {}) 112 : Stmt(loc, std::move(labels)), isVolatile(isVolatile), instruction(instruction), 113 output(std::move(output)), input(std::move(input)), clobber(std::move(clobber)), 114 gotoLabels(std::move(gotoLabels)) {} 115 116 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 117 private: 119 118 AsmStmt * clone() const override { return new AsmStmt{ *this }; } 120 119 MUTATE_FRIEND 121 120 }; 122 121 123 // / C-preprocessor directive `#...`122 // C-preprocessor directive: #... 124 123 class DirectiveStmt final : public Stmt { 125 public:124 public: 126 125 std::string directive; 127 126 128 127 DirectiveStmt( const CodeLocation & loc, const std::string & directive, 129 std::vector<Label> && labels = {} )130 : Stmt(loc, std::move(labels)), directive(directive) {}131 132 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 133 private:128 std::vector<Label> && labels = {} ) 129 : Stmt(loc, std::move(labels)), directive(directive) {} 130 131 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 132 private: 134 133 DirectiveStmt * clone() const override { return new DirectiveStmt{ *this }; } 135 134 MUTATE_FRIEND 136 135 }; 137 136 138 // / If conditional statement `if (...) ... else ...`137 // If statement: if (...) ... else ... 139 138 class IfStmt final : public Stmt { 140 public:139 public: 141 140 ptr<Expr> cond; 142 141 ptr<Stmt> thenPart; … … 145 144 146 145 IfStmt( const CodeLocation & loc, const Expr * cond, const Stmt * thenPart, 147 const Stmt * elsePart = nullptr, std::vector<ptr<Stmt>> && inits = {},148 std::vector<Label> && labels = {} )149 : Stmt(loc, std::move(labels)), cond(cond), thenPart(thenPart), elsePart(elsePart),150 inits(std::move(inits)) {}151 152 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 153 private:146 const Stmt * elsePart = nullptr, std::vector<ptr<Stmt>> && inits = {}, 147 std::vector<Label> && labels = {} ) 148 : Stmt(loc, std::move(labels)), cond(cond), thenPart(thenPart), elsePart(elsePart), 149 inits(std::move(inits)) {} 150 151 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 152 private: 154 153 IfStmt * clone() const override { return new IfStmt{ *this }; } 155 154 MUTATE_FRIEND 156 155 }; 157 156 158 // / Switch or choose conditional statement `switch (...) { ... }`157 // Switch or choose statement: switch (...) { ... } 159 158 class SwitchStmt final : public Stmt { 160 public:159 public: 161 160 ptr<Expr> cond; 162 161 std::vector<ptr<Stmt>> stmts; 163 162 164 163 SwitchStmt( const CodeLocation & loc, const Expr * cond, std::vector<ptr<Stmt>> && stmts, 165 std::vector<Label> && labels = {} )166 : Stmt(loc, std::move(labels)), cond(cond), stmts(std::move(stmts)) {}167 168 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 169 private:164 std::vector<Label> && labels = {} ) 165 : Stmt(loc, std::move(labels)), cond(cond), stmts(std::move(stmts)) {} 166 167 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 168 private: 170 169 SwitchStmt * clone() const override { return new SwitchStmt{ *this }; } 171 170 MUTATE_FRIEND 172 171 }; 173 172 174 // / Case label `case ...:` `default:`173 // Case label: case ...: or default: 175 174 class CaseStmt final : public Stmt { 176 public:177 // /Null for the default label.175 public: 176 // Null for the default label. 178 177 ptr<Expr> cond; 179 178 std::vector<ptr<Stmt>> stmts; 180 179 181 180 CaseStmt( const CodeLocation & loc, const Expr * cond, std::vector<ptr<Stmt>> && stmts, 182 std::vector<Label> && labels = {} )183 : Stmt(loc, std::move(labels)), cond(cond), stmts(std::move(stmts)) {}181 std::vector<Label> && labels = {} ) 182 : Stmt(loc, std::move(labels)), cond(cond), stmts(std::move(stmts)) {} 184 183 185 184 bool isDefault() const { return !cond; } 186 185 187 186 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 188 private:187 private: 189 188 CaseStmt * clone() const override { return new CaseStmt{ *this }; } 190 189 MUTATE_FRIEND 191 190 }; 192 191 193 // / While loop `while (...) ...` `do ... while (...);192 // While loop: while (...) ... else ... or do ... while (...) else ...; 194 193 class WhileStmt final : public Stmt { 195 public:194 public: 196 195 ptr<Expr> cond; 197 196 ptr<Stmt> body; 197 ptr<Stmt> elsePart; 198 198 std::vector<ptr<Stmt>> inits; 199 199 bool isDoWhile; 200 200 201 201 WhileStmt( const CodeLocation & loc, const Expr * cond, const Stmt * body, 202 std::vector<ptr<Stmt>> && inits, bool isDoWhile = false, std::vector<Label> && labels = {} ) 203 : Stmt(loc, std::move(labels)), cond(cond), body(body), inits(std::move(inits)), 204 isDoWhile(isDoWhile) {} 205 206 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 207 private: 202 std::vector<ptr<Stmt>> && inits, bool isDoWhile = false, std::vector<Label> && labels = {} ) 203 : Stmt(loc, std::move(labels)), cond(cond), body(body), inits(std::move(inits)), isDoWhile(isDoWhile) {} 204 205 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 206 private: 208 207 WhileStmt * clone() const override { return new WhileStmt{ *this }; } 209 208 MUTATE_FRIEND 210 209 }; 211 210 212 // / For loop `for (... ; ... ; ...) ...`211 // For loop: for (... ; ... ; ...) ... else ... 213 212 class ForStmt final : public Stmt { 214 public:213 public: 215 214 std::vector<ptr<Stmt>> inits; 216 215 ptr<Expr> cond; 217 216 ptr<Expr> inc; 218 217 ptr<Stmt> body; 218 ptr<Stmt> elsePart; 219 219 220 220 ForStmt( const CodeLocation & loc, std::vector<ptr<Stmt>> && inits, const Expr * cond, 221 const Expr * inc, const Stmt * body, std::vector<Label> && labels = {} ) 222 : Stmt(loc, std::move(labels)), inits(std::move(inits)), cond(cond), inc(inc), 223 body(body) {} 224 225 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 226 private: 221 const Expr * inc, const Stmt * body, std::vector<Label> && labels = {} ) 222 : Stmt(loc, std::move(labels)), inits(std::move(inits)), cond(cond), inc(inc), body(body) {} 223 224 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 225 private: 227 226 ForStmt * clone() const override { return new ForStmt{ *this }; } 228 227 MUTATE_FRIEND 229 228 }; 230 229 231 // / Branch control flow statement `goto ...` `break` `continue` `fallthru`230 // Branch control flow statement: goto ... or break or continue or fallthru 232 231 class BranchStmt final : public Stmt { 233 public:232 public: 234 233 enum Kind { Goto, Break, Continue, FallThrough, FallThroughDefault }; 235 234 static constexpr size_t kindEnd = 1 + (size_t)FallThroughDefault; … … 241 240 242 241 BranchStmt( const CodeLocation & loc, Kind kind, Label target, 243 std::vector<Label> && labels = {} );242 std::vector<Label> && labels = {} ); 244 243 BranchStmt( const CodeLocation & loc, const Expr * computedTarget, 245 std::vector<Label> && labels = {} )246 : Stmt(loc, std::move(labels)), originalTarget(loc), target(loc),247 computedTarget(computedTarget), kind(Goto) {}244 std::vector<Label> && labels = {} ) 245 : Stmt(loc, std::move(labels)), originalTarget(loc), target(loc), 246 computedTarget(computedTarget), kind(Goto) {} 248 247 249 248 const char * kindName() const { return kindNames[kind]; } 250 249 251 250 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 252 private:251 private: 253 252 BranchStmt * clone() const override { return new BranchStmt{ *this }; } 254 253 MUTATE_FRIEND … … 257 256 }; 258 257 259 // / Return statement `return ...`258 // Return statement: return ... 260 259 class ReturnStmt final : public Stmt { 261 public:260 public: 262 261 ptr<Expr> expr; 263 262 264 263 ReturnStmt( const CodeLocation & loc, const Expr * expr, std::vector<Label> && labels = {} ) 265 : Stmt(loc, std::move(labels)), expr(expr) {}266 267 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 268 private:264 : Stmt(loc, std::move(labels)), expr(expr) {} 265 266 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 267 private: 269 268 ReturnStmt * clone() const override { return new ReturnStmt{ *this }; } 270 269 MUTATE_FRIEND 271 270 }; 272 271 273 // /Kind of exception272 // Kind of exception 274 273 enum ExceptionKind { Terminate, Resume }; 275 274 276 // / Throw statement `throw ...`275 // Throw statement: throw ... 277 276 class ThrowStmt final : public Stmt { 278 public:277 public: 279 278 ptr<Expr> expr; 280 279 ptr<Expr> target; … … 284 283 const CodeLocation & loc, ExceptionKind kind, const Expr * expr, const Expr * target, 285 284 std::vector<Label> && labels = {} ) 286 : Stmt(loc, std::move(labels)), expr(expr), target(target), kind(kind) {}287 288 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 289 private:285 : Stmt(loc, std::move(labels)), expr(expr), target(target), kind(kind) {} 286 287 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 288 private: 290 289 ThrowStmt * clone() const override { return new ThrowStmt{ *this }; } 291 290 MUTATE_FRIEND 292 291 }; 293 292 294 // / Try statement `try { ... } ...`293 // Try statement: try { ... } ... 295 294 class TryStmt final : public Stmt { 296 public:295 public: 297 296 ptr<CompoundStmt> body; 298 297 std::vector<ptr<CatchStmt>> handlers; … … 303 302 std::vector<ptr<CatchStmt>> && handlers, const FinallyStmt * finally, 304 303 std::vector<Label> && labels = {} ) 305 : Stmt(loc, std::move(labels)), body(body), handlers(std::move(handlers)), finally(finally) {}306 307 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 308 private:304 : Stmt(loc, std::move(labels)), body(body), handlers(std::move(handlers)), finally(finally) {} 305 306 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 307 private: 309 308 TryStmt * clone() const override { return new TryStmt{ *this }; } 310 309 MUTATE_FRIEND 311 310 }; 312 311 313 // /Catch clause of try statement312 // Catch clause of try statement 314 313 class CatchStmt final : public Stmt { 315 public:314 public: 316 315 ptr<Decl> decl; 317 316 ptr<Expr> cond; … … 322 321 const CodeLocation & loc, ExceptionKind kind, const Decl * decl, const Expr * cond, 323 322 const Stmt * body, std::vector<Label> && labels = {} ) 324 : Stmt(loc, std::move(labels)), decl(decl), cond(cond), body(body), kind(kind) {}325 326 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 327 private:323 : Stmt(loc, std::move(labels)), decl(decl), cond(cond), body(body), kind(kind) {} 324 325 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 326 private: 328 327 CatchStmt * clone() const override { return new CatchStmt{ *this }; } 329 328 MUTATE_FRIEND 330 329 }; 331 330 332 // /Finally clause of try statement331 // Finally clause of try statement 333 332 class FinallyStmt final : public Stmt { 334 public:333 public: 335 334 ptr<CompoundStmt> body; 336 335 337 336 FinallyStmt( const CodeLocation & loc, const CompoundStmt * body, 338 std::vector<Label> && labels = {} )339 : Stmt(loc, std::move(labels)), body(body) {}340 341 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 342 private:337 std::vector<Label> && labels = {} ) 338 : Stmt(loc, std::move(labels)), body(body) {} 339 340 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 341 private: 343 342 FinallyStmt * clone() const override { return new FinallyStmt{ *this }; } 344 343 MUTATE_FRIEND 345 344 }; 346 345 347 // /Suspend statement346 // Suspend statement 348 347 class SuspendStmt final : public Stmt { 349 public:348 public: 350 349 ptr<CompoundStmt> then; 351 350 enum Type { None, Coroutine, Generator } type = None; 352 351 353 352 SuspendStmt( const CodeLocation & loc, const CompoundStmt * then, Type type, std::vector<Label> && labels = {} ) 354 : Stmt(loc, std::move(labels)), then(then), type(type) {}355 356 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 357 private:353 : Stmt(loc, std::move(labels)), then(then), type(type) {} 354 355 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 356 private: 358 357 SuspendStmt * clone() const override { return new SuspendStmt{ *this }; } 359 358 MUTATE_FRIEND 360 359 }; 361 360 362 // / Wait for concurrency statement `when (...) waitfor (... , ...) ... timeout(...) ... else ...`361 // Waitfor statement: when (...) waitfor (... , ...) ... timeout(...) ... else ... 363 362 class WaitForStmt final : public Stmt { 364 public:363 public: 365 364 struct Target { 366 365 ptr<Expr> func; … … 390 389 391 390 WaitForStmt( const CodeLocation & loc, std::vector<Label> && labels = {} ) 392 : Stmt(loc, std::move(labels)) {}393 394 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 395 private:391 : Stmt(loc, std::move(labels)) {} 392 393 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 394 private: 396 395 WaitForStmt * clone() const override { return new WaitForStmt{ *this }; } 397 396 MUTATE_FRIEND 398 397 }; 399 398 400 // /Any declaration in a (compound) statement.399 // Any declaration in a (compound) statement. 401 400 class DeclStmt final : public Stmt { 402 public:401 public: 403 402 ptr<Decl> decl; 404 403 405 404 DeclStmt( const CodeLocation & loc, const Decl * decl, std::vector<Label> && labels = {} ) 406 : Stmt(loc, std::move(labels)), decl(decl) {}407 408 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 409 private:405 : Stmt(loc, std::move(labels)), decl(decl) {} 406 407 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 408 private: 410 409 DeclStmt * clone() const override { return new DeclStmt{ *this }; } 411 410 MUTATE_FRIEND 412 411 }; 413 412 414 // /Represents an implicit application of a constructor or destructor.413 // Represents an implicit application of a constructor or destructor. 415 414 class ImplicitCtorDtorStmt final : public Stmt { 416 public:415 public: 417 416 ptr<Stmt> callStmt; 418 417 419 418 ImplicitCtorDtorStmt( const CodeLocation & loc, const Stmt * callStmt, 420 std::vector<Label> && labels = {} )421 : Stmt(loc, std::move(labels)), callStmt(callStmt) {}422 423 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 424 private:419 std::vector<Label> && labels = {} ) 420 : Stmt(loc, std::move(labels)), callStmt(callStmt) {} 421 422 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 423 private: 425 424 ImplicitCtorDtorStmt * clone() const override { return new ImplicitCtorDtorStmt{ *this }; } 426 425 MUTATE_FRIEND 427 426 }; 428 427 429 // /Mutex Statement428 // Mutex Statement 430 429 class MutexStmt final : public Stmt { 431 public:430 public: 432 431 ptr<Stmt> stmt; 433 432 std::vector<ptr<Expr>> mutexObjs; 434 433 435 434 MutexStmt( const CodeLocation & loc, const Stmt * stmt, 436 std::vector<ptr<Expr>> && mutexes, std::vector<Label> && labels = {} )437 : Stmt(loc, std::move(labels)), stmt(stmt), mutexObjs(std::move(mutexes)) {}438 439 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 440 private:435 std::vector<ptr<Expr>> && mutexes, std::vector<Label> && labels = {} ) 436 : Stmt(loc, std::move(labels)), stmt(stmt), mutexObjs(std::move(mutexes)) {} 437 438 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 439 private: 441 440 MutexStmt * clone() const override { return new MutexStmt{ *this }; } 442 441 MUTATE_FRIEND 443 442 }; 444 445 } 443 } // namespace ast 446 444 447 445 #undef MUTATE_FRIEND 448 446 449 447 // Local Variables: // 450 // tab-width: 4 //451 448 // mode: c++ // 452 // compile-command: "make install" //453 449 // End: //
Note:
See TracChangeset
for help on using the changeset viewer.