1// Copyright 2013 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package unreachable 6 7// This file produces masses of errors from the type checker due to 8// missing returns statements and other things. 9 10type T int 11 12var x interface{} 13var c chan int 14 15func external() int // ok 16 17func _() int { 18} 19 20func _() int { 21 print(1) 22} 23 24func _() int { 25 print(1) 26 return 2 27 println() // want "unreachable code" 28} 29 30func _() int { 31L: 32 print(1) 33 goto L 34 println() // want "unreachable code" 35} 36 37func _() int { 38 print(1) 39 panic(2) 40 println() // want "unreachable code" 41} 42 43// but only builtin panic 44func _() int { 45 var panic = func(int) {} 46 print(1) 47 panic(2) 48 println() // ok 49} 50 51func _() int { 52 { 53 print(1) 54 return 2 55 println() // want "unreachable code" 56 } 57 println() // ok 58} 59 60func _() int { 61 { 62 print(1) 63 return 2 64 } 65 println() // want "unreachable code" 66} 67 68func _() int { 69L: 70 { 71 print(1) 72 goto L 73 println() // want "unreachable code" 74 } 75 println() // ok 76} 77 78func _() int { 79L: 80 { 81 print(1) 82 goto L 83 } 84 println() // want "unreachable code" 85} 86 87func _() int { 88 print(1) 89 { 90 panic(2) 91 } 92} 93 94func _() int { 95 print(1) 96 { 97 panic(2) 98 println() // want "unreachable code" 99 } 100} 101 102func _() int { 103 print(1) 104 { 105 panic(2) 106 } 107 println() // want "unreachable code" 108} 109 110func _() int { 111 print(1) 112 return 2 113 { // want "unreachable code" 114 } 115} 116 117func _() int { 118L: 119 print(1) 120 goto L 121 { // want "unreachable code" 122 } 123} 124 125func _() int { 126 print(1) 127 panic(2) 128 { // want "unreachable code" 129 } 130} 131 132func _() int { 133 { 134 print(1) 135 return 2 136 { // want "unreachable code" 137 } 138 } 139} 140 141func _() int { 142L: 143 { 144 print(1) 145 goto L 146 { // want "unreachable code" 147 } 148 } 149} 150 151func _() int { 152 print(1) 153 { 154 panic(2) 155 { // want "unreachable code" 156 } 157 } 158} 159 160func _() int { 161 { 162 print(1) 163 return 2 164 } 165 { // want "unreachable code" 166 } 167} 168 169func _() int { 170L: 171 { 172 print(1) 173 goto L 174 } 175 { // want "unreachable code" 176 } 177} 178 179func _() int { 180 print(1) 181 { 182 panic(2) 183 } 184 { // want "unreachable code" 185 } 186} 187 188func _() int { 189 print(1) 190 if x == nil { 191 panic(2) 192 } else { 193 panic(3) 194 } 195 println() // want "unreachable code" 196} 197 198func _() int { 199L: 200 print(1) 201 if x == nil { 202 panic(2) 203 } else { 204 goto L 205 } 206 println() // want "unreachable code" 207} 208 209func _() int { 210L: 211 print(1) 212 if x == nil { 213 panic(2) 214 } else if x == 1 { 215 return 0 216 } else if x != 2 { 217 panic(3) 218 } else { 219 goto L 220 } 221 println() // want "unreachable code" 222} 223 224// if-else chain missing final else is not okay, even if the 225// conditions cover every possible case. 226 227func _() int { 228 print(1) 229 if x == nil { 230 panic(2) 231 } else if x != nil { 232 panic(3) 233 } 234 println() // ok 235} 236 237func _() int { 238 print(1) 239 if x == nil { 240 panic(2) 241 } 242 println() // ok 243} 244 245func _() int { 246L: 247 print(1) 248 if x == nil { 249 panic(2) 250 } else if x == 1 { 251 return 0 252 } else if x != 1 { 253 panic(3) 254 } 255 println() // ok 256} 257 258func _() int { 259 print(1) 260 for { 261 } 262 println() // want "unreachable code" 263} 264 265func _() int { 266 for { 267 for { 268 break 269 } 270 } 271 println() // want "unreachable code" 272} 273 274func _() int { 275 for { 276 for { 277 break 278 println() // want "unreachable code" 279 } 280 } 281} 282 283func _() int { 284 for { 285 for { 286 continue 287 println() // want "unreachable code" 288 } 289 } 290} 291 292func _() int { 293 for { 294 L: 295 for { 296 break L 297 } 298 } 299 println() // want "unreachable code" 300} 301 302func _() int { 303 print(1) 304 for { 305 break 306 } 307 println() // ok 308} 309 310func _() int { 311 for { 312 for { 313 } 314 break // want "unreachable code" 315 } 316 println() // ok 317} 318 319func _() int { 320L: 321 for { 322 for { 323 break L 324 } 325 } 326 println() // ok 327} 328 329func _() int { 330 print(1) 331 for x == nil { 332 } 333 println() // ok 334} 335 336func _() int { 337 for x == nil { 338 for { 339 break 340 } 341 } 342 println() // ok 343} 344 345func _() int { 346 for x == nil { 347 L: 348 for { 349 break L 350 } 351 } 352 println() // ok 353} 354 355func _() int { 356 print(1) 357 for true { 358 } 359 println() // ok 360} 361 362func _() int { 363 for true { 364 for { 365 break 366 } 367 } 368 println() // ok 369} 370 371func _() int { 372 for true { 373 L: 374 for { 375 break L 376 } 377 } 378 println() // ok 379} 380 381func _() int { 382 print(1) 383 select {} 384 println() // want "unreachable code" 385} 386 387func _() int { 388 print(1) 389 select { 390 case <-c: 391 print(2) 392 panic("abc") 393 println() // want "unreachable code" 394 } 395} 396 397func _() int { 398 print(1) 399 select { 400 case <-c: 401 print(2) 402 panic("abc") 403 } 404 println() // want "unreachable code" 405} 406 407func _() int { 408 print(1) 409 select { 410 case <-c: 411 print(2) 412 for { 413 } 414 println() // want "unreachable code" 415 } 416} 417 418func _() int { 419 print(1) 420 select { 421 case <-c: 422 print(2) 423 for { 424 } 425 } 426 println() // want "unreachable code" 427} 428 429func _() int { 430L: 431 print(1) 432 select { 433 case <-c: 434 print(2) 435 panic("abc") 436 println() // want "unreachable code" 437 case c <- 1: 438 print(2) 439 goto L 440 println() // want "unreachable code" 441 } 442} 443 444func _() int { 445L: 446 print(1) 447 select { 448 case <-c: 449 print(2) 450 panic("abc") 451 case c <- 1: 452 print(2) 453 goto L 454 } 455 println() // want "unreachable code" 456} 457 458func _() int { 459 print(1) 460 select { 461 case <-c: 462 print(2) 463 panic("abc") 464 println() // want "unreachable code" 465 default: 466 select {} 467 println() // want "unreachable code" 468 } 469} 470 471func _() int { 472 print(1) 473 select { 474 case <-c: 475 print(2) 476 panic("abc") 477 default: 478 select {} 479 } 480 println() // want "unreachable code" 481} 482 483func _() int { 484 print(1) 485 select { 486 case <-c: 487 print(2) 488 } 489 println() // ok 490} 491 492func _() int { 493L: 494 print(1) 495 select { 496 case <-c: 497 print(2) 498 panic("abc") 499 goto L // want "unreachable code" 500 case c <- 1: 501 print(2) 502 } 503 println() // ok 504} 505 506func _() int { 507 print(1) 508 select { 509 case <-c: 510 print(2) 511 panic("abc") 512 default: 513 print(2) 514 } 515 println() // ok 516} 517 518func _() int { 519 print(1) 520 select { 521 default: 522 break 523 } 524 println() // ok 525} 526 527func _() int { 528 print(1) 529 select { 530 case <-c: 531 print(2) 532 panic("abc") 533 break // want "unreachable code" 534 } 535 println() // ok 536} 537 538func _() int { 539 print(1) 540L: 541 select { 542 case <-c: 543 print(2) 544 for { 545 break L 546 } 547 } 548 println() // ok 549} 550 551func _() int { 552 print(1) 553L: 554 select { 555 case <-c: 556 print(2) 557 panic("abc") 558 case c <- 1: 559 print(2) 560 break L 561 } 562 println() // ok 563} 564 565func _() int { 566 print(1) 567 select { 568 case <-c: 569 print(1) 570 panic("abc") 571 default: 572 select {} 573 break // want "unreachable code" 574 } 575 println() // ok 576} 577 578func _() int { 579 print(1) 580 switch x { 581 case 1: 582 print(2) 583 panic(3) 584 println() // want "unreachable code" 585 default: 586 return 4 587 println() // want "unreachable code" 588 } 589} 590 591func _() int { 592 print(1) 593 switch x { 594 case 1: 595 print(2) 596 panic(3) 597 default: 598 return 4 599 } 600 println() // want "unreachable code" 601} 602 603func _() int { 604 print(1) 605 switch x { 606 default: 607 return 4 608 println() // want "unreachable code" 609 case 1: 610 print(2) 611 panic(3) 612 println() // want "unreachable code" 613 } 614} 615 616func _() int { 617 print(1) 618 switch x { 619 default: 620 return 4 621 case 1: 622 print(2) 623 panic(3) 624 } 625 println() // want "unreachable code" 626} 627 628func _() int { 629 print(1) 630 switch x { 631 case 1: 632 print(2) 633 fallthrough 634 default: 635 return 4 636 println() // want "unreachable code" 637 } 638} 639 640func _() int { 641 print(1) 642 switch x { 643 case 1: 644 print(2) 645 fallthrough 646 default: 647 return 4 648 } 649 println() // want "unreachable code" 650} 651 652func _() int { 653 print(1) 654 switch { 655 } 656 println() // ok 657} 658 659func _() int { 660 print(1) 661 switch x { 662 case 1: 663 print(2) 664 panic(3) 665 case 2: 666 return 4 667 } 668 println() // ok 669} 670 671func _() int { 672 print(1) 673 switch x { 674 case 2: 675 return 4 676 case 1: 677 print(2) 678 panic(3) 679 } 680 println() // ok 681} 682 683func _() int { 684 print(1) 685 switch x { 686 case 1: 687 print(2) 688 fallthrough 689 case 2: 690 return 4 691 } 692 println() // ok 693} 694 695func _() int { 696 print(1) 697 switch x { 698 case 1: 699 print(2) 700 panic(3) 701 } 702 println() // ok 703} 704 705func _() int { 706 print(1) 707L: 708 switch x { 709 case 1: 710 print(2) 711 panic(3) 712 break L // want "unreachable code" 713 default: 714 return 4 715 } 716 println() // ok 717} 718 719func _() int { 720 print(1) 721 switch x { 722 default: 723 return 4 724 break // want "unreachable code" 725 case 1: 726 print(2) 727 panic(3) 728 } 729 println() // ok 730} 731 732func _() int { 733 print(1) 734L: 735 switch x { 736 case 1: 737 print(2) 738 for { 739 break L 740 } 741 default: 742 return 4 743 } 744 println() // ok 745} 746 747func _() int { 748 print(1) 749 switch x.(type) { 750 case int: 751 print(2) 752 panic(3) 753 println() // want "unreachable code" 754 default: 755 return 4 756 println() // want "unreachable code" 757 } 758} 759 760func _() int { 761 print(1) 762 switch x.(type) { 763 case int: 764 print(2) 765 panic(3) 766 default: 767 return 4 768 } 769 println() // want "unreachable code" 770} 771 772func _() int { 773 print(1) 774 switch x.(type) { 775 default: 776 return 4 777 println() // want "unreachable code" 778 case int: 779 print(2) 780 panic(3) 781 println() // want "unreachable code" 782 } 783} 784 785func _() int { 786 print(1) 787 switch x.(type) { 788 default: 789 return 4 790 case int: 791 print(2) 792 panic(3) 793 } 794 println() // want "unreachable code" 795} 796 797func _() int { 798 print(1) 799 switch x.(type) { 800 case int: 801 print(2) 802 fallthrough 803 default: 804 return 4 805 println() // want "unreachable code" 806 } 807} 808 809func _() int { 810 print(1) 811 switch x.(type) { 812 case int: 813 print(2) 814 fallthrough 815 default: 816 return 4 817 } 818 println() // want "unreachable code" 819} 820 821func _() int { 822 print(1) 823 switch { 824 } 825 println() // ok 826} 827 828func _() int { 829 print(1) 830 switch x.(type) { 831 case int: 832 print(2) 833 panic(3) 834 case float64: 835 return 4 836 } 837 println() // ok 838} 839 840func _() int { 841 print(1) 842 switch x.(type) { 843 case float64: 844 return 4 845 case int: 846 print(2) 847 panic(3) 848 } 849 println() // ok 850} 851 852func _() int { 853 print(1) 854 switch x.(type) { 855 case int: 856 print(2) 857 fallthrough 858 case float64: 859 return 4 860 } 861 println() // ok 862} 863 864func _() int { 865 print(1) 866 switch x.(type) { 867 case int: 868 print(2) 869 panic(3) 870 } 871 println() // ok 872} 873 874func _() int { 875 print(1) 876L: 877 switch x.(type) { 878 case int: 879 print(2) 880 panic(3) 881 break L // want "unreachable code" 882 default: 883 return 4 884 } 885 println() // ok 886} 887 888func _() int { 889 print(1) 890 switch x.(type) { 891 default: 892 return 4 893 break // want "unreachable code" 894 case int: 895 print(2) 896 panic(3) 897 } 898 println() // ok 899} 900 901func _() int { 902 print(1) 903L: 904 switch x.(type) { 905 case int: 906 print(2) 907 for { 908 break L 909 } 910 default: 911 return 4 912 } 913 println() // ok 914} 915 916// again, but without the leading print(1). 917// testing that everything works when the terminating statement is first. 918 919func _() int { 920 println() // ok 921} 922 923func _() int { 924 return 2 925 println() // want "unreachable code" 926} 927 928func _() int { 929L: 930 goto L 931 println() // want "unreachable code" 932} 933 934func _() int { 935 panic(2) 936 println() // want "unreachable code" 937} 938 939// but only builtin panic 940func _() int { 941 var panic = func(int) {} 942 panic(2) 943 println() // ok 944} 945 946func _() int { 947 { 948 return 2 949 println() // want "unreachable code" 950 } 951} 952 953func _() int { 954 { 955 return 2 956 } 957 println() // want "unreachable code" 958} 959 960func _() int { 961L: 962 { 963 goto L 964 println() // want "unreachable code" 965 } 966} 967 968func _() int { 969L: 970 { 971 goto L 972 } 973 println() // want "unreachable code" 974} 975 976func _() int { 977 { 978 panic(2) 979 println() // want "unreachable code" 980 } 981} 982 983func _() int { 984 { 985 panic(2) 986 } 987 println() // want "unreachable code" 988} 989 990func _() int { 991 return 2 992 { // want "unreachable code" 993 } 994 println() // ok 995} 996 997func _() int { 998L: 999 goto L 1000 { // want "unreachable code" 1001 } 1002 println() // ok 1003} 1004 1005func _() int { 1006 panic(2) 1007 { // want "unreachable code" 1008 } 1009 println() // ok 1010} 1011 1012func _() int { 1013 { 1014 return 2 1015 { // want "unreachable code" 1016 } 1017 } 1018 println() // ok 1019} 1020 1021func _() int { 1022L: 1023 { 1024 goto L 1025 { // want "unreachable code" 1026 } 1027 } 1028 println() // ok 1029} 1030 1031func _() int { 1032 { 1033 panic(2) 1034 { // want "unreachable code" 1035 } 1036 } 1037 println() // ok 1038} 1039 1040func _() int { 1041 { 1042 return 2 1043 } 1044 { // want "unreachable code" 1045 } 1046 println() // ok 1047} 1048 1049func _() int { 1050L: 1051 { 1052 goto L 1053 } 1054 { // want "unreachable code" 1055 } 1056 println() // ok 1057} 1058 1059func _() int { 1060 { 1061 panic(2) 1062 } 1063 { // want "unreachable code" 1064 } 1065 println() // ok 1066} 1067 1068// again, with func literals 1069 1070var _ = func() int { 1071} 1072 1073var _ = func() int { 1074 print(1) 1075} 1076 1077var _ = func() int { 1078 print(1) 1079 return 2 1080 println() // want "unreachable code" 1081} 1082 1083var _ = func() int { 1084L: 1085 print(1) 1086 goto L 1087 println() // want "unreachable code" 1088} 1089 1090var _ = func() int { 1091 print(1) 1092 panic(2) 1093 println() // want "unreachable code" 1094} 1095 1096// but only builtin panic 1097var _ = func() int { 1098 var panic = func(int) {} 1099 print(1) 1100 panic(2) 1101 println() // ok 1102} 1103 1104var _ = func() int { 1105 { 1106 print(1) 1107 return 2 1108 println() // want "unreachable code" 1109 } 1110 println() // ok 1111} 1112 1113var _ = func() int { 1114 { 1115 print(1) 1116 return 2 1117 } 1118 println() // want "unreachable code" 1119} 1120 1121var _ = func() int { 1122L: 1123 { 1124 print(1) 1125 goto L 1126 println() // want "unreachable code" 1127 } 1128 println() // ok 1129} 1130 1131var _ = func() int { 1132L: 1133 { 1134 print(1) 1135 goto L 1136 } 1137 println() // want "unreachable code" 1138} 1139 1140var _ = func() int { 1141 print(1) 1142 { 1143 panic(2) 1144 } 1145} 1146 1147var _ = func() int { 1148 print(1) 1149 { 1150 panic(2) 1151 println() // want "unreachable code" 1152 } 1153} 1154 1155var _ = func() int { 1156 print(1) 1157 { 1158 panic(2) 1159 } 1160 println() // want "unreachable code" 1161} 1162 1163var _ = func() int { 1164 print(1) 1165 return 2 1166 { // want "unreachable code" 1167 } 1168} 1169 1170var _ = func() int { 1171L: 1172 print(1) 1173 goto L 1174 { // want "unreachable code" 1175 } 1176} 1177 1178var _ = func() int { 1179 print(1) 1180 panic(2) 1181 { // want "unreachable code" 1182 } 1183} 1184 1185var _ = func() int { 1186 { 1187 print(1) 1188 return 2 1189 { // want "unreachable code" 1190 } 1191 } 1192} 1193 1194var _ = func() int { 1195L: 1196 { 1197 print(1) 1198 goto L 1199 { // want "unreachable code" 1200 } 1201 } 1202} 1203 1204var _ = func() int { 1205 print(1) 1206 { 1207 panic(2) 1208 { // want "unreachable code" 1209 } 1210 } 1211} 1212 1213var _ = func() int { 1214 { 1215 print(1) 1216 return 2 1217 } 1218 { // want "unreachable code" 1219 } 1220} 1221 1222var _ = func() int { 1223L: 1224 { 1225 print(1) 1226 goto L 1227 } 1228 { // want "unreachable code" 1229 } 1230} 1231 1232var _ = func() int { 1233 print(1) 1234 { 1235 panic(2) 1236 } 1237 { // want "unreachable code" 1238 } 1239} 1240 1241var _ = func() int { 1242 print(1) 1243 if x == nil { 1244 panic(2) 1245 } else { 1246 panic(3) 1247 } 1248 println() // want "unreachable code" 1249} 1250 1251var _ = func() int { 1252L: 1253 print(1) 1254 if x == nil { 1255 panic(2) 1256 } else { 1257 goto L 1258 } 1259 println() // want "unreachable code" 1260} 1261 1262var _ = func() int { 1263L: 1264 print(1) 1265 if x == nil { 1266 panic(2) 1267 } else if x == 1 { 1268 return 0 1269 } else if x != 2 { 1270 panic(3) 1271 } else { 1272 goto L 1273 } 1274 println() // want "unreachable code" 1275} 1276 1277// if-else chain missing final else is not okay, even if the 1278// conditions cover every possible case. 1279 1280var _ = func() int { 1281 print(1) 1282 if x == nil { 1283 panic(2) 1284 } else if x != nil { 1285 panic(3) 1286 } 1287 println() // ok 1288} 1289 1290var _ = func() int { 1291 print(1) 1292 if x == nil { 1293 panic(2) 1294 } 1295 println() // ok 1296} 1297 1298var _ = func() int { 1299L: 1300 print(1) 1301 if x == nil { 1302 panic(2) 1303 } else if x == 1 { 1304 return 0 1305 } else if x != 1 { 1306 panic(3) 1307 } 1308 println() // ok 1309} 1310 1311var _ = func() int { 1312 print(1) 1313 for { 1314 } 1315 println() // want "unreachable code" 1316} 1317 1318var _ = func() int { 1319 for { 1320 for { 1321 break 1322 } 1323 } 1324 println() // want "unreachable code" 1325} 1326 1327var _ = func() int { 1328 for { 1329 for { 1330 break 1331 println() // want "unreachable code" 1332 } 1333 } 1334} 1335 1336var _ = func() int { 1337 for { 1338 for { 1339 continue 1340 println() // want "unreachable code" 1341 } 1342 } 1343} 1344 1345var _ = func() int { 1346 for { 1347 L: 1348 for { 1349 break L 1350 } 1351 } 1352 println() // want "unreachable code" 1353} 1354 1355var _ = func() int { 1356 print(1) 1357 for { 1358 break 1359 } 1360 println() // ok 1361} 1362 1363var _ = func() int { 1364 for { 1365 for { 1366 } 1367 break // want "unreachable code" 1368 } 1369 println() // ok 1370} 1371 1372var _ = func() int { 1373L: 1374 for { 1375 for { 1376 break L 1377 } 1378 } 1379 println() // ok 1380} 1381 1382var _ = func() int { 1383 print(1) 1384 for x == nil { 1385 } 1386 println() // ok 1387} 1388 1389var _ = func() int { 1390 for x == nil { 1391 for { 1392 break 1393 } 1394 } 1395 println() // ok 1396} 1397 1398var _ = func() int { 1399 for x == nil { 1400 L: 1401 for { 1402 break L 1403 } 1404 } 1405 println() // ok 1406} 1407 1408var _ = func() int { 1409 print(1) 1410 for true { 1411 } 1412 println() // ok 1413} 1414 1415var _ = func() int { 1416 for true { 1417 for { 1418 break 1419 } 1420 } 1421 println() // ok 1422} 1423 1424var _ = func() int { 1425 for true { 1426 L: 1427 for { 1428 break L 1429 } 1430 } 1431 println() // ok 1432} 1433 1434var _ = func() int { 1435 print(1) 1436 select {} 1437 println() // want "unreachable code" 1438} 1439 1440var _ = func() int { 1441 print(1) 1442 select { 1443 case <-c: 1444 print(2) 1445 panic("abc") 1446 println() // want "unreachable code" 1447 } 1448} 1449 1450var _ = func() int { 1451 print(1) 1452 select { 1453 case <-c: 1454 print(2) 1455 panic("abc") 1456 } 1457 println() // want "unreachable code" 1458} 1459 1460var _ = func() int { 1461 print(1) 1462 select { 1463 case <-c: 1464 print(2) 1465 for { 1466 } 1467 println() // want "unreachable code" 1468 } 1469} 1470 1471var _ = func() int { 1472 print(1) 1473 select { 1474 case <-c: 1475 print(2) 1476 for { 1477 } 1478 } 1479 println() // want "unreachable code" 1480} 1481 1482var _ = func() int { 1483L: 1484 print(1) 1485 select { 1486 case <-c: 1487 print(2) 1488 panic("abc") 1489 println() // want "unreachable code" 1490 case c <- 1: 1491 print(2) 1492 goto L 1493 println() // want "unreachable code" 1494 } 1495} 1496 1497var _ = func() int { 1498L: 1499 print(1) 1500 select { 1501 case <-c: 1502 print(2) 1503 panic("abc") 1504 case c <- 1: 1505 print(2) 1506 goto L 1507 } 1508 println() // want "unreachable code" 1509} 1510 1511var _ = func() int { 1512 print(1) 1513 select { 1514 case <-c: 1515 print(2) 1516 panic("abc") 1517 println() // want "unreachable code" 1518 default: 1519 select {} 1520 println() // want "unreachable code" 1521 } 1522} 1523 1524var _ = func() int { 1525 print(1) 1526 select { 1527 case <-c: 1528 print(2) 1529 panic("abc") 1530 default: 1531 select {} 1532 } 1533 println() // want "unreachable code" 1534} 1535 1536var _ = func() int { 1537 print(1) 1538 select { 1539 case <-c: 1540 print(2) 1541 } 1542 println() // ok 1543} 1544 1545var _ = func() int { 1546L: 1547 print(1) 1548 select { 1549 case <-c: 1550 print(2) 1551 panic("abc") 1552 goto L // want "unreachable code" 1553 case c <- 1: 1554 print(2) 1555 } 1556 println() // ok 1557} 1558 1559var _ = func() int { 1560 print(1) 1561 select { 1562 case <-c: 1563 print(2) 1564 panic("abc") 1565 default: 1566 print(2) 1567 } 1568 println() // ok 1569} 1570 1571var _ = func() int { 1572 print(1) 1573 select { 1574 default: 1575 break 1576 } 1577 println() // ok 1578} 1579 1580var _ = func() int { 1581 print(1) 1582 select { 1583 case <-c: 1584 print(2) 1585 panic("abc") 1586 break // want "unreachable code" 1587 } 1588 println() // ok 1589} 1590 1591var _ = func() int { 1592 print(1) 1593L: 1594 select { 1595 case <-c: 1596 print(2) 1597 for { 1598 break L 1599 } 1600 } 1601 println() // ok 1602} 1603 1604var _ = func() int { 1605 print(1) 1606L: 1607 select { 1608 case <-c: 1609 print(2) 1610 panic("abc") 1611 case c <- 1: 1612 print(2) 1613 break L 1614 } 1615 println() // ok 1616} 1617 1618var _ = func() int { 1619 print(1) 1620 select { 1621 case <-c: 1622 print(1) 1623 panic("abc") 1624 default: 1625 select {} 1626 break // want "unreachable code" 1627 } 1628 println() // ok 1629} 1630 1631var _ = func() int { 1632 print(1) 1633 switch x { 1634 case 1: 1635 print(2) 1636 panic(3) 1637 println() // want "unreachable code" 1638 default: 1639 return 4 1640 println() // want "unreachable code" 1641 } 1642} 1643 1644var _ = func() int { 1645 print(1) 1646 switch x { 1647 case 1: 1648 print(2) 1649 panic(3) 1650 default: 1651 return 4 1652 } 1653 println() // want "unreachable code" 1654} 1655 1656var _ = func() int { 1657 print(1) 1658 switch x { 1659 default: 1660 return 4 1661 println() // want "unreachable code" 1662 case 1: 1663 print(2) 1664 panic(3) 1665 println() // want "unreachable code" 1666 } 1667} 1668 1669var _ = func() int { 1670 print(1) 1671 switch x { 1672 default: 1673 return 4 1674 case 1: 1675 print(2) 1676 panic(3) 1677 } 1678 println() // want "unreachable code" 1679} 1680 1681var _ = func() int { 1682 print(1) 1683 switch x { 1684 case 1: 1685 print(2) 1686 fallthrough 1687 default: 1688 return 4 1689 println() // want "unreachable code" 1690 } 1691} 1692 1693var _ = func() int { 1694 print(1) 1695 switch x { 1696 case 1: 1697 print(2) 1698 fallthrough 1699 default: 1700 return 4 1701 } 1702 println() // want "unreachable code" 1703} 1704 1705var _ = func() int { 1706 print(1) 1707 switch { 1708 } 1709 println() // ok 1710} 1711 1712var _ = func() int { 1713 print(1) 1714 switch x { 1715 case 1: 1716 print(2) 1717 panic(3) 1718 case 2: 1719 return 4 1720 } 1721 println() // ok 1722} 1723 1724var _ = func() int { 1725 print(1) 1726 switch x { 1727 case 2: 1728 return 4 1729 case 1: 1730 print(2) 1731 panic(3) 1732 } 1733 println() // ok 1734} 1735 1736var _ = func() int { 1737 print(1) 1738 switch x { 1739 case 1: 1740 print(2) 1741 fallthrough 1742 case 2: 1743 return 4 1744 } 1745 println() // ok 1746} 1747 1748var _ = func() int { 1749 print(1) 1750 switch x { 1751 case 1: 1752 print(2) 1753 panic(3) 1754 } 1755 println() // ok 1756} 1757 1758var _ = func() int { 1759 print(1) 1760L: 1761 switch x { 1762 case 1: 1763 print(2) 1764 panic(3) 1765 break L // want "unreachable code" 1766 default: 1767 return 4 1768 } 1769 println() // ok 1770} 1771 1772var _ = func() int { 1773 print(1) 1774 switch x { 1775 default: 1776 return 4 1777 break // want "unreachable code" 1778 case 1: 1779 print(2) 1780 panic(3) 1781 } 1782 println() // ok 1783} 1784 1785var _ = func() int { 1786 print(1) 1787L: 1788 switch x { 1789 case 1: 1790 print(2) 1791 for { 1792 break L 1793 } 1794 default: 1795 return 4 1796 } 1797 println() // ok 1798} 1799 1800var _ = func() int { 1801 print(1) 1802 switch x.(type) { 1803 case int: 1804 print(2) 1805 panic(3) 1806 println() // want "unreachable code" 1807 default: 1808 return 4 1809 println() // want "unreachable code" 1810 } 1811} 1812 1813var _ = func() int { 1814 print(1) 1815 switch x.(type) { 1816 case int: 1817 print(2) 1818 panic(3) 1819 default: 1820 return 4 1821 } 1822 println() // want "unreachable code" 1823} 1824 1825var _ = func() int { 1826 print(1) 1827 switch x.(type) { 1828 default: 1829 return 4 1830 println() // want "unreachable code" 1831 case int: 1832 print(2) 1833 panic(3) 1834 println() // want "unreachable code" 1835 } 1836} 1837 1838var _ = func() int { 1839 print(1) 1840 switch x.(type) { 1841 default: 1842 return 4 1843 case int: 1844 print(2) 1845 panic(3) 1846 } 1847 println() // want "unreachable code" 1848} 1849 1850var _ = func() int { 1851 print(1) 1852 switch x.(type) { 1853 case int: 1854 print(2) 1855 fallthrough 1856 default: 1857 return 4 1858 println() // want "unreachable code" 1859 } 1860} 1861 1862var _ = func() int { 1863 print(1) 1864 switch x.(type) { 1865 case int: 1866 print(2) 1867 fallthrough 1868 default: 1869 return 4 1870 } 1871 println() // want "unreachable code" 1872} 1873 1874var _ = func() int { 1875 print(1) 1876 switch { 1877 } 1878 println() // ok 1879} 1880 1881var _ = func() int { 1882 print(1) 1883 switch x.(type) { 1884 case int: 1885 print(2) 1886 panic(3) 1887 case float64: 1888 return 4 1889 } 1890 println() // ok 1891} 1892 1893var _ = func() int { 1894 print(1) 1895 switch x.(type) { 1896 case float64: 1897 return 4 1898 case int: 1899 print(2) 1900 panic(3) 1901 } 1902 println() // ok 1903} 1904 1905var _ = func() int { 1906 print(1) 1907 switch x.(type) { 1908 case int: 1909 print(2) 1910 fallthrough 1911 case float64: 1912 return 4 1913 } 1914 println() // ok 1915} 1916 1917var _ = func() int { 1918 print(1) 1919 switch x.(type) { 1920 case int: 1921 print(2) 1922 panic(3) 1923 } 1924 println() // ok 1925} 1926 1927var _ = func() int { 1928 print(1) 1929L: 1930 switch x.(type) { 1931 case int: 1932 print(2) 1933 panic(3) 1934 break L // want "unreachable code" 1935 default: 1936 return 4 1937 } 1938 println() // ok 1939} 1940 1941var _ = func() int { 1942 print(1) 1943 switch x.(type) { 1944 default: 1945 return 4 1946 break // want "unreachable code" 1947 case int: 1948 print(2) 1949 panic(3) 1950 } 1951 println() // ok 1952} 1953 1954var _ = func() int { 1955 print(1) 1956L: 1957 switch x.(type) { 1958 case int: 1959 print(2) 1960 for { 1961 break L 1962 } 1963 default: 1964 return 4 1965 } 1966 println() // ok 1967} 1968 1969// again, but without the leading print(1). 1970// testing that everything works when the terminating statement is first. 1971 1972var _ = func() int { 1973 println() // ok 1974} 1975 1976var _ = func() int { 1977 return 2 1978 println() // want "unreachable code" 1979} 1980 1981var _ = func() int { 1982L: 1983 goto L 1984 println() // want "unreachable code" 1985} 1986 1987var _ = func() int { 1988 panic(2) 1989 println() // want "unreachable code" 1990} 1991 1992// but only builtin panic 1993var _ = func() int { 1994 var panic = func(int) {} 1995 panic(2) 1996 println() // ok 1997} 1998 1999var _ = func() int { 2000 { 2001 return 2 2002 println() // want "unreachable code" 2003 } 2004} 2005 2006var _ = func() int { 2007 { 2008 return 2 2009 } 2010 println() // want "unreachable code" 2011} 2012 2013var _ = func() int { 2014L: 2015 { 2016 goto L 2017 println() // want "unreachable code" 2018 } 2019} 2020 2021var _ = func() int { 2022L: 2023 { 2024 goto L 2025 } 2026 println() // want "unreachable code" 2027} 2028 2029var _ = func() int { 2030 { 2031 panic(2) 2032 println() // want "unreachable code" 2033 } 2034} 2035 2036var _ = func() int { 2037 { 2038 panic(2) 2039 } 2040 println() // want "unreachable code" 2041} 2042 2043var _ = func() int { 2044 return 2 2045 { // want "unreachable code" 2046 } 2047 println() // ok 2048} 2049 2050var _ = func() int { 2051L: 2052 goto L 2053 { // want "unreachable code" 2054 } 2055 println() // ok 2056} 2057 2058var _ = func() int { 2059 panic(2) 2060 { // want "unreachable code" 2061 } 2062 println() // ok 2063} 2064 2065var _ = func() int { 2066 { 2067 return 2 2068 { // want "unreachable code" 2069 } 2070 } 2071 println() // ok 2072} 2073 2074var _ = func() int { 2075L: 2076 { 2077 goto L 2078 { // want "unreachable code" 2079 } 2080 } 2081 println() // ok 2082} 2083 2084var _ = func() int { 2085 { 2086 panic(2) 2087 { // want "unreachable code" 2088 } 2089 } 2090 println() // ok 2091} 2092 2093var _ = func() int { 2094 { 2095 return 2 2096 } 2097 { // want "unreachable code" 2098 } 2099 println() // ok 2100} 2101 2102var _ = func() int { 2103L: 2104 { 2105 goto L 2106 } 2107 { // want "unreachable code" 2108 } 2109 println() // ok 2110} 2111 2112var _ = func() int { 2113 { 2114 panic(2) 2115 } 2116 { // want "unreachable code" 2117 } 2118 println() // ok 2119} 2120 2121var _ = func() { 2122 // goto without label used to panic 2123 goto 2124} 2125 2126func _() int { 2127 // Empty switch tag with non-bool case value used to panic. 2128 switch { 2129 case 1: 2130 println() 2131 } 2132 println() 2133} 2134