PR middle-end/77674
[official-gcc.git] / gcc / testsuite / go.test / test / return.go
blob482f22bd5f4d28c91bd2acca72011a813be1a697
1 // errorcheck
3 // Copyright 2013 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
7 // Test compiler diagnosis of function missing return statements.
8 // See issue 65 and golang.org/s/go11return.
10 package p
12 type T int
14 var x interface{}
15 var c chan int
17 func external() int // ok
19 func _() int {
20 } // ERROR "missing return"
22 func _() int {
23 print(1)
24 } // ERROR "missing return"
26 // return is okay
27 func _() int {
28 print(1)
29 return 2
32 // goto is okay
33 func _() int {
35 print(1)
36 goto L
39 // panic is okay
40 func _() int {
41 print(1)
42 panic(2)
45 // but only builtin panic
46 func _() int {
47 var panic = func(int) {}
48 print(1)
49 panic(2)
50 } // ERROR "missing return"
52 // block ending in terminating statement is okay
53 func _() int {
55 print(1)
56 return 2
60 // block ending in terminating statement is okay
61 func _() int {
64 print(1)
65 goto L
69 // block ending in terminating statement is okay
70 func _() int {
71 print(1)
73 panic(2)
77 // adding more code - even though it is dead - now requires a return
79 func _() int {
80 print(1)
81 return 2
82 print(3)
83 } // ERROR "missing return"
85 func _() int {
87 print(1)
88 goto L
89 print(3)
90 } // ERROR "missing return"
92 func _() int {
93 print(1)
94 panic(2)
95 print(3)
96 } // ERROR "missing return"
98 func _() int {
100 print(1)
101 return 2
102 print(3)
104 } // ERROR "missing return"
106 func _() int {
109 print(1)
110 goto L
111 print(3)
113 } // ERROR "missing return"
115 func _() int {
116 print(1)
118 panic(2)
119 print(3)
121 } // ERROR "missing return"
123 func _() int {
125 print(1)
126 return 2
128 print(3)
129 } // ERROR "missing return"
131 func _() int {
134 print(1)
135 goto L
137 print(3)
138 } // ERROR "missing return"
140 func _() int {
141 print(1)
143 panic(2)
145 print(3)
146 } // ERROR "missing return"
148 // even an empty dead block triggers the message, because it
149 // becomes the final statement.
151 func _() int {
152 print(1)
153 return 2
155 } // ERROR "missing return"
157 func _() int {
159 print(1)
160 goto L
162 } // ERROR "missing return"
164 func _() int {
165 print(1)
166 panic(2)
168 } // ERROR "missing return"
170 func _() int {
172 print(1)
173 return 2
176 } // ERROR "missing return"
178 func _() int {
181 print(1)
182 goto L
185 } // ERROR "missing return"
187 func _() int {
188 print(1)
190 panic(2)
193 } // ERROR "missing return"
195 func _() int {
197 print(1)
198 return 2
201 } // ERROR "missing return"
203 func _() int {
206 print(1)
207 goto L
210 } // ERROR "missing return"
212 func _() int {
213 print(1)
215 panic(2)
218 } // ERROR "missing return"
220 // if-else chain with final else and all terminating is okay
222 func _() int {
223 print(1)
224 if x == nil {
225 panic(2)
226 } else {
227 panic(3)
231 func _() int {
233 print(1)
234 if x == nil {
235 panic(2)
236 } else {
237 goto L
241 func _() int {
243 print(1)
244 if x == nil {
245 panic(2)
246 } else if x == 1 {
247 return 0
248 } else if x != 2 {
249 panic(3)
250 } else {
251 goto L
255 // if-else chain missing final else is not okay, even if the
256 // conditions cover every possible case.
258 func _() int {
259 print(1)
260 if x == nil {
261 panic(2)
262 } else if x != nil {
263 panic(3)
265 } // ERROR "missing return"
267 func _() int {
268 print(1)
269 if x == nil {
270 panic(2)
272 } // ERROR "missing return"
274 func _() int {
275 print(1)
276 if x == nil {
277 panic(2)
278 } else if x == 1 {
279 return 0
280 } else if x != 1 {
281 panic(3)
283 } // ERROR "missing return"
286 // for { loops that never break are okay.
288 func _() int {
289 print(1)
290 for {}
293 func _() int {
294 for {
295 for {
296 break
301 func _() int {
302 for {
304 for {
305 break L
310 // for { loops that break are not okay.
312 func _() int {
313 print(1)
314 for { break }
315 } // ERROR "missing return"
317 func _() int {
318 for {
319 for {
321 break
323 } // ERROR "missing return"
325 func _() int {
327 for {
328 for {
329 break L
332 } // ERROR "missing return"
334 // if there's a condition - even "true" - the loops are no longer syntactically terminating
336 func _() int {
337 print(1)
338 for x == nil {}
339 } // ERROR "missing return"
341 func _() int {
342 for x == nil {
343 for {
344 break
347 } // ERROR "missing return"
349 func _() int {
350 for x == nil {
352 for {
353 break L
356 } // ERROR "missing return"
358 func _() int {
359 print(1)
360 for true {}
361 } // ERROR "missing return"
363 func _() int {
364 for true {
365 for {
366 break
369 } // ERROR "missing return"
371 func _() int {
372 for true {
374 for {
375 break L
378 } // ERROR "missing return"
380 // select in which all cases terminate and none break are okay.
382 func _() int {
383 print(1)
384 select{}
387 func _() int {
388 print(1)
389 select {
390 case <-c:
391 print(2)
392 panic("abc")
396 func _() int {
397 print(1)
398 select {
399 case <-c:
400 print(2)
401 for{}
405 func _() int {
407 print(1)
408 select {
409 case <-c:
410 print(2)
411 panic("abc")
412 case c <- 1:
413 print(2)
414 goto L
418 func _() int {
419 print(1)
420 select {
421 case <-c:
422 print(2)
423 panic("abc")
424 default:
425 select{}
429 // if any cases don't terminate, the select isn't okay anymore
431 func _() int {
432 print(1)
433 select {
434 case <-c:
435 print(2)
437 } // ERROR "missing return"
439 func _() int {
441 print(1)
442 select {
443 case <-c:
444 print(2)
445 panic("abc")
446 goto L
447 case c <- 1:
448 print(2)
450 } // ERROR "missing return"
453 func _() int {
454 print(1)
455 select {
456 case <-c:
457 print(2)
458 panic("abc")
459 default:
460 print(2)
462 } // ERROR "missing return"
465 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
467 func _() int {
468 print(1)
469 select{ default: break }
470 } // ERROR "missing return"
472 func _() int {
473 print(1)
474 select {
475 case <-c:
476 print(2)
477 panic("abc")
478 break
480 } // ERROR "missing return"
482 func _() int {
483 print(1)
485 select {
486 case <-c:
487 print(2)
488 for{ break L }
490 } // ERROR "missing return"
492 func _() int {
493 print(1)
495 select {
496 case <-c:
497 print(2)
498 panic("abc")
499 case c <- 1:
500 print(2)
501 break L
503 } // ERROR "missing return"
505 func _() int {
506 print(1)
507 select {
508 case <-c:
509 print(1)
510 panic("abc")
511 default:
512 select{}
513 break
515 } // ERROR "missing return"
517 // switch with default in which all cases terminate is okay
519 func _() int {
520 print(1)
521 switch x {
522 case 1:
523 print(2)
524 panic(3)
525 default:
526 return 4
530 func _() int {
531 print(1)
532 switch x {
533 default:
534 return 4
535 case 1:
536 print(2)
537 panic(3)
541 func _() int {
542 print(1)
543 switch x {
544 case 1:
545 print(2)
546 fallthrough
547 default:
548 return 4
552 // if no default or some case doesn't terminate, switch is no longer okay
554 func _() int {
555 print(1)
556 switch {
558 } // ERROR "missing return"
561 func _() int {
562 print(1)
563 switch x {
564 case 1:
565 print(2)
566 panic(3)
567 case 2:
568 return 4
570 } // ERROR "missing return"
572 func _() int {
573 print(1)
574 switch x {
575 case 2:
576 return 4
577 case 1:
578 print(2)
579 panic(3)
581 } // ERROR "missing return"
583 func _() int {
584 print(1)
585 switch x {
586 case 1:
587 print(2)
588 fallthrough
589 case 2:
590 return 4
592 } // ERROR "missing return"
594 func _() int {
595 print(1)
596 switch x {
597 case 1:
598 print(2)
599 panic(3)
601 } // ERROR "missing return"
603 // if any breaks refer to the switch, switch is no longer okay
605 func _() int {
606 print(1)
608 switch x {
609 case 1:
610 print(2)
611 panic(3)
612 break L
613 default:
614 return 4
616 } // ERROR "missing return"
618 func _() int {
619 print(1)
620 switch x {
621 default:
622 return 4
623 break
624 case 1:
625 print(2)
626 panic(3)
628 } // ERROR "missing return"
630 func _() int {
631 print(1)
633 switch x {
634 case 1:
635 print(2)
636 for {
637 break L
639 default:
640 return 4
642 } // ERROR "missing return"
644 // type switch with default in which all cases terminate is okay
646 func _() int {
647 print(1)
648 switch x.(type) {
649 case int:
650 print(2)
651 panic(3)
652 default:
653 return 4
657 func _() int {
658 print(1)
659 switch x.(type) {
660 default:
661 return 4
662 case int:
663 print(2)
664 panic(3)
668 // if no default or some case doesn't terminate, switch is no longer okay
670 func _() int {
671 print(1)
672 switch {
674 } // ERROR "missing return"
677 func _() int {
678 print(1)
679 switch x.(type) {
680 case int:
681 print(2)
682 panic(3)
683 case float64:
684 return 4
686 } // ERROR "missing return"
688 func _() int {
689 print(1)
690 switch x.(type) {
691 case float64:
692 return 4
693 case int:
694 print(2)
695 panic(3)
697 } // ERROR "missing return"
699 func _() int {
700 print(1)
701 switch x.(type) {
702 case int:
703 print(2)
704 panic(3)
706 } // ERROR "missing return"
708 // if any breaks refer to the switch, switch is no longer okay
710 func _() int {
711 print(1)
713 switch x.(type) {
714 case int:
715 print(2)
716 panic(3)
717 break L
718 default:
719 return 4
721 } // ERROR "missing return"
723 func _() int {
724 print(1)
725 switch x.(type) {
726 default:
727 return 4
728 break
729 case int:
730 print(2)
731 panic(3)
733 } // ERROR "missing return"
735 func _() int {
736 print(1)
738 switch x.(type) {
739 case int:
740 print(2)
741 for {
742 break L
744 default:
745 return 4
747 } // ERROR "missing return"
749 // again, but without the leading print(1).
750 // testing that everything works when the terminating statement is first.
752 func _() int {
753 } // ERROR "missing return"
755 // return is okay
756 func _() int {
757 return 2
760 // goto is okay
761 func _() int {
763 goto L
766 // panic is okay
767 func _() int {
768 panic(2)
771 // but only builtin panic
772 func _() int {
773 var panic = func(int) {}
774 panic(2)
775 } // ERROR "missing return"
777 // block ending in terminating statement is okay
778 func _() int {
780 return 2
784 // block ending in terminating statement is okay
785 func _() int {
788 goto L
792 // block ending in terminating statement is okay
793 func _() int {
795 panic(2)
799 // adding more code - even though it is dead - now requires a return
801 func _() int {
802 return 2
803 print(3)
804 } // ERROR "missing return"
806 func _() int {
808 goto L
809 print(3)
810 } // ERROR "missing return"
812 func _() int {
813 panic(2)
814 print(3)
815 } // ERROR "missing return"
817 func _() int {
819 return 2
820 print(3)
822 } // ERROR "missing return"
824 func _() int {
827 goto L
828 print(3)
830 } // ERROR "missing return"
832 func _() int {
834 panic(2)
835 print(3)
837 } // ERROR "missing return"
839 func _() int {
841 return 2
843 print(3)
844 } // ERROR "missing return"
846 func _() int {
849 goto L
851 print(3)
852 } // ERROR "missing return"
854 func _() int {
856 panic(2)
858 print(3)
859 } // ERROR "missing return"
861 // even an empty dead block triggers the message, because it
862 // becomes the final statement.
864 func _() int {
865 return 2
867 } // ERROR "missing return"
869 func _() int {
871 goto L
873 } // ERROR "missing return"
875 func _() int {
876 panic(2)
878 } // ERROR "missing return"
880 func _() int {
882 return 2
885 } // ERROR "missing return"
887 func _() int {
890 goto L
893 } // ERROR "missing return"
895 func _() int {
897 panic(2)
900 } // ERROR "missing return"
902 func _() int {
904 return 2
907 } // ERROR "missing return"
909 func _() int {
912 goto L
915 } // ERROR "missing return"
917 func _() int {
919 panic(2)
922 } // ERROR "missing return"
924 // if-else chain with final else and all terminating is okay
926 func _() int {
927 if x == nil {
928 panic(2)
929 } else {
930 panic(3)
934 func _() int {
936 if x == nil {
937 panic(2)
938 } else {
939 goto L
943 func _() int {
945 if x == nil {
946 panic(2)
947 } else if x == 1 {
948 return 0
949 } else if x != 2 {
950 panic(3)
951 } else {
952 goto L
956 // if-else chain missing final else is not okay, even if the
957 // conditions cover every possible case.
959 func _() int {
960 if x == nil {
961 panic(2)
962 } else if x != nil {
963 panic(3)
965 } // ERROR "missing return"
967 func _() int {
968 if x == nil {
969 panic(2)
971 } // ERROR "missing return"
973 func _() int {
974 if x == nil {
975 panic(2)
976 } else if x == 1 {
977 return 0
978 } else if x != 1 {
979 panic(3)
981 } // ERROR "missing return"
984 // for { loops that never break are okay.
986 func _() int {
987 for {}
990 func _() int {
991 for {
992 for {
993 break
998 func _() int {
999 for {
1001 for {
1002 break L
1007 // for { loops that break are not okay.
1009 func _() int {
1010 for { break }
1011 } // ERROR "missing return"
1013 func _() int {
1014 for {
1015 for {
1017 break
1019 } // ERROR "missing return"
1021 func _() int {
1023 for {
1024 for {
1025 break L
1028 } // ERROR "missing return"
1030 // if there's a condition - even "true" - the loops are no longer syntactically terminating
1032 func _() int {
1033 for x == nil {}
1034 } // ERROR "missing return"
1036 func _() int {
1037 for x == nil {
1038 for {
1039 break
1042 } // ERROR "missing return"
1044 func _() int {
1045 for x == nil {
1047 for {
1048 break L
1051 } // ERROR "missing return"
1053 func _() int {
1054 for true {}
1055 } // ERROR "missing return"
1057 func _() int {
1058 for true {
1059 for {
1060 break
1063 } // ERROR "missing return"
1065 func _() int {
1066 for true {
1068 for {
1069 break L
1072 } // ERROR "missing return"
1074 // select in which all cases terminate and none break are okay.
1076 func _() int {
1077 select{}
1080 func _() int {
1081 select {
1082 case <-c:
1083 print(2)
1084 panic("abc")
1088 func _() int {
1089 select {
1090 case <-c:
1091 print(2)
1092 for{}
1096 func _() int {
1098 select {
1099 case <-c:
1100 print(2)
1101 panic("abc")
1102 case c <- 1:
1103 print(2)
1104 goto L
1108 func _() int {
1109 select {
1110 case <-c:
1111 print(2)
1112 panic("abc")
1113 default:
1114 select{}
1118 // if any cases don't terminate, the select isn't okay anymore
1120 func _() int {
1121 select {
1122 case <-c:
1123 print(2)
1125 } // ERROR "missing return"
1127 func _() int {
1129 select {
1130 case <-c:
1131 print(2)
1132 panic("abc")
1133 goto L
1134 case c <- 1:
1135 print(2)
1137 } // ERROR "missing return"
1140 func _() int {
1141 select {
1142 case <-c:
1143 print(2)
1144 panic("abc")
1145 default:
1146 print(2)
1148 } // ERROR "missing return"
1151 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
1153 func _() int {
1154 select{ default: break }
1155 } // ERROR "missing return"
1157 func _() int {
1158 select {
1159 case <-c:
1160 print(2)
1161 panic("abc")
1162 break
1164 } // ERROR "missing return"
1166 func _() int {
1168 select {
1169 case <-c:
1170 print(2)
1171 for{ break L }
1173 } // ERROR "missing return"
1175 func _() int {
1177 select {
1178 case <-c:
1179 print(2)
1180 panic("abc")
1181 case c <- 1:
1182 print(2)
1183 break L
1185 } // ERROR "missing return"
1187 func _() int {
1188 select {
1189 case <-c:
1190 panic("abc")
1191 default:
1192 select{}
1193 break
1195 } // ERROR "missing return"
1197 // switch with default in which all cases terminate is okay
1199 func _() int {
1200 switch x {
1201 case 1:
1202 print(2)
1203 panic(3)
1204 default:
1205 return 4
1209 func _() int {
1210 switch x {
1211 default:
1212 return 4
1213 case 1:
1214 print(2)
1215 panic(3)
1219 func _() int {
1220 switch x {
1221 case 1:
1222 print(2)
1223 fallthrough
1224 default:
1225 return 4
1229 // if no default or some case doesn't terminate, switch is no longer okay
1231 func _() int {
1232 switch {
1234 } // ERROR "missing return"
1237 func _() int {
1238 switch x {
1239 case 1:
1240 print(2)
1241 panic(3)
1242 case 2:
1243 return 4
1245 } // ERROR "missing return"
1247 func _() int {
1248 switch x {
1249 case 2:
1250 return 4
1251 case 1:
1252 print(2)
1253 panic(3)
1255 } // ERROR "missing return"
1257 func _() int {
1258 switch x {
1259 case 1:
1260 print(2)
1261 fallthrough
1262 case 2:
1263 return 4
1265 } // ERROR "missing return"
1267 func _() int {
1268 switch x {
1269 case 1:
1270 print(2)
1271 panic(3)
1273 } // ERROR "missing return"
1275 // if any breaks refer to the switch, switch is no longer okay
1277 func _() int {
1279 switch x {
1280 case 1:
1281 print(2)
1282 panic(3)
1283 break L
1284 default:
1285 return 4
1287 } // ERROR "missing return"
1289 func _() int {
1290 switch x {
1291 default:
1292 return 4
1293 break
1294 case 1:
1295 print(2)
1296 panic(3)
1298 } // ERROR "missing return"
1300 func _() int {
1302 switch x {
1303 case 1:
1304 print(2)
1305 for {
1306 break L
1308 default:
1309 return 4
1311 } // ERROR "missing return"
1313 // type switch with default in which all cases terminate is okay
1315 func _() int {
1316 switch x.(type) {
1317 case int:
1318 print(2)
1319 panic(3)
1320 default:
1321 return 4
1325 func _() int {
1326 switch x.(type) {
1327 default:
1328 return 4
1329 case int:
1330 print(2)
1331 panic(3)
1335 // if no default or some case doesn't terminate, switch is no longer okay
1337 func _() int {
1338 switch {
1340 } // ERROR "missing return"
1343 func _() int {
1344 switch x.(type) {
1345 case int:
1346 print(2)
1347 panic(3)
1348 case float64:
1349 return 4
1351 } // ERROR "missing return"
1353 func _() int {
1354 switch x.(type) {
1355 case float64:
1356 return 4
1357 case int:
1358 print(2)
1359 panic(3)
1361 } // ERROR "missing return"
1363 func _() int {
1364 switch x.(type) {
1365 case int:
1366 print(2)
1367 panic(3)
1369 } // ERROR "missing return"
1371 // if any breaks refer to the switch, switch is no longer okay
1373 func _() int {
1375 switch x.(type) {
1376 case int:
1377 print(2)
1378 panic(3)
1379 break L
1380 default:
1381 return 4
1383 } // ERROR "missing return"
1385 func _() int {
1386 switch x.(type) {
1387 default:
1388 return 4
1389 break
1390 case int:
1391 print(2)
1392 panic(3)
1394 } // ERROR "missing return"
1396 func _() int {
1398 switch x.(type) {
1399 case int:
1400 print(2)
1401 for {
1402 break L
1404 default:
1405 return 4
1407 } // ERROR "missing return"
1409 func _() int {
1410 switch x.(type) {
1411 default:
1412 return 4
1413 case int, float64:
1414 print(2)
1415 panic(3)
1419 // again, with func literals
1421 var _ = func() int {
1422 } // ERROR "missing return"
1424 var _ = func() int {
1425 print(1)
1426 } // ERROR "missing return"
1428 // return is okay
1429 var _ = func() int {
1430 print(1)
1431 return 2
1434 // goto is okay
1435 var _ = func() int {
1437 print(1)
1438 goto L
1441 // panic is okay
1442 var _ = func() int {
1443 print(1)
1444 panic(2)
1447 // but only builtin panic
1448 var _ = func() int {
1449 var panic = func(int) {}
1450 print(1)
1451 panic(2)
1452 } // ERROR "missing return"
1454 // block ending in terminating statement is okay
1455 var _ = func() int {
1457 print(1)
1458 return 2
1462 // block ending in terminating statement is okay
1463 var _ = func() int {
1466 print(1)
1467 goto L
1471 // block ending in terminating statement is okay
1472 var _ = func() int {
1473 print(1)
1475 panic(2)
1479 // adding more code - even though it is dead - now requires a return
1481 var _ = func() int {
1482 print(1)
1483 return 2
1484 print(3)
1485 } // ERROR "missing return"
1487 var _ = func() int {
1489 print(1)
1490 goto L
1491 print(3)
1492 } // ERROR "missing return"
1494 var _ = func() int {
1495 print(1)
1496 panic(2)
1497 print(3)
1498 } // ERROR "missing return"
1500 var _ = func() int {
1502 print(1)
1503 return 2
1504 print(3)
1506 } // ERROR "missing return"
1508 var _ = func() int {
1511 print(1)
1512 goto L
1513 print(3)
1515 } // ERROR "missing return"
1517 var _ = func() int {
1518 print(1)
1520 panic(2)
1521 print(3)
1523 } // ERROR "missing return"
1525 var _ = func() int {
1527 print(1)
1528 return 2
1530 print(3)
1531 } // ERROR "missing return"
1533 var _ = func() int {
1536 print(1)
1537 goto L
1539 print(3)
1540 } // ERROR "missing return"
1542 var _ = func() int {
1543 print(1)
1545 panic(2)
1547 print(3)
1548 } // ERROR "missing return"
1550 // even an empty dead block triggers the message, because it
1551 // becomes the final statement.
1553 var _ = func() int {
1554 print(1)
1555 return 2
1557 } // ERROR "missing return"
1559 var _ = func() int {
1561 print(1)
1562 goto L
1564 } // ERROR "missing return"
1566 var _ = func() int {
1567 print(1)
1568 panic(2)
1570 } // ERROR "missing return"
1572 var _ = func() int {
1574 print(1)
1575 return 2
1578 } // ERROR "missing return"
1580 var _ = func() int {
1583 print(1)
1584 goto L
1587 } // ERROR "missing return"
1589 var _ = func() int {
1590 print(1)
1592 panic(2)
1595 } // ERROR "missing return"
1597 var _ = func() int {
1599 print(1)
1600 return 2
1603 } // ERROR "missing return"
1605 var _ = func() int {
1608 print(1)
1609 goto L
1612 } // ERROR "missing return"
1614 var _ = func() int {
1615 print(1)
1617 panic(2)
1620 } // ERROR "missing return"
1622 // if-else chain with final else and all terminating is okay
1624 var _ = func() int {
1625 print(1)
1626 if x == nil {
1627 panic(2)
1628 } else {
1629 panic(3)
1633 var _ = func() int {
1635 print(1)
1636 if x == nil {
1637 panic(2)
1638 } else {
1639 goto L
1643 var _ = func() int {
1645 print(1)
1646 if x == nil {
1647 panic(2)
1648 } else if x == 1 {
1649 return 0
1650 } else if x != 2 {
1651 panic(3)
1652 } else {
1653 goto L
1657 // if-else chain missing final else is not okay, even if the
1658 // conditions cover every possible case.
1660 var _ = func() int {
1661 print(1)
1662 if x == nil {
1663 panic(2)
1664 } else if x != nil {
1665 panic(3)
1667 } // ERROR "missing return"
1669 var _ = func() int {
1670 print(1)
1671 if x == nil {
1672 panic(2)
1674 } // ERROR "missing return"
1676 var _ = func() int {
1677 print(1)
1678 if x == nil {
1679 panic(2)
1680 } else if x == 1 {
1681 return 0
1682 } else if x != 1 {
1683 panic(3)
1685 } // ERROR "missing return"
1688 // for { loops that never break are okay.
1690 var _ = func() int {
1691 print(1)
1692 for {}
1695 var _ = func() int {
1696 for {
1697 for {
1698 break
1703 var _ = func() int {
1704 for {
1706 for {
1707 break L
1712 // for { loops that break are not okay.
1714 var _ = func() int {
1715 print(1)
1716 for { break }
1717 } // ERROR "missing return"
1719 var _ = func() int {
1720 for {
1721 for {
1723 break
1725 } // ERROR "missing return"
1727 var _ = func() int {
1729 for {
1730 for {
1731 break L
1734 } // ERROR "missing return"
1736 // if there's a condition - even "true" - the loops are no longer syntactically terminating
1738 var _ = func() int {
1739 print(1)
1740 for x == nil {}
1741 } // ERROR "missing return"
1743 var _ = func() int {
1744 for x == nil {
1745 for {
1746 break
1749 } // ERROR "missing return"
1751 var _ = func() int {
1752 for x == nil {
1754 for {
1755 break L
1758 } // ERROR "missing return"
1760 var _ = func() int {
1761 print(1)
1762 for true {}
1763 } // ERROR "missing return"
1765 var _ = func() int {
1766 for true {
1767 for {
1768 break
1771 } // ERROR "missing return"
1773 var _ = func() int {
1774 for true {
1776 for {
1777 break L
1780 } // ERROR "missing return"
1782 // select in which all cases terminate and none break are okay.
1784 var _ = func() int {
1785 print(1)
1786 select{}
1789 var _ = func() int {
1790 print(1)
1791 select {
1792 case <-c:
1793 print(2)
1794 panic("abc")
1798 var _ = func() int {
1799 print(1)
1800 select {
1801 case <-c:
1802 print(2)
1803 for{}
1807 var _ = func() int {
1809 print(1)
1810 select {
1811 case <-c:
1812 print(2)
1813 panic("abc")
1814 case c <- 1:
1815 print(2)
1816 goto L
1820 var _ = func() int {
1821 print(1)
1822 select {
1823 case <-c:
1824 print(2)
1825 panic("abc")
1826 default:
1827 select{}
1831 // if any cases don't terminate, the select isn't okay anymore
1833 var _ = func() int {
1834 print(1)
1835 select {
1836 case <-c:
1837 print(2)
1839 } // ERROR "missing return"
1841 var _ = func() int {
1843 print(1)
1844 select {
1845 case <-c:
1846 print(2)
1847 panic("abc")
1848 goto L
1849 case c <- 1:
1850 print(2)
1852 } // ERROR "missing return"
1855 var _ = func() int {
1856 print(1)
1857 select {
1858 case <-c:
1859 print(2)
1860 panic("abc")
1861 default:
1862 print(2)
1864 } // ERROR "missing return"
1867 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
1869 var _ = func() int {
1870 print(1)
1871 select{ default: break }
1872 } // ERROR "missing return"
1874 var _ = func() int {
1875 print(1)
1876 select {
1877 case <-c:
1878 print(2)
1879 panic("abc")
1880 break
1882 } // ERROR "missing return"
1884 var _ = func() int {
1885 print(1)
1887 select {
1888 case <-c:
1889 print(2)
1890 for{ break L }
1892 } // ERROR "missing return"
1894 var _ = func() int {
1895 print(1)
1897 select {
1898 case <-c:
1899 print(2)
1900 panic("abc")
1901 case c <- 1:
1902 print(2)
1903 break L
1905 } // ERROR "missing return"
1907 var _ = func() int {
1908 print(1)
1909 select {
1910 case <-c:
1911 print(1)
1912 panic("abc")
1913 default:
1914 select{}
1915 break
1917 } // ERROR "missing return"
1919 // switch with default in which all cases terminate is okay
1921 var _ = func() int {
1922 print(1)
1923 switch x {
1924 case 1:
1925 print(2)
1926 panic(3)
1927 default:
1928 return 4
1932 var _ = func() int {
1933 print(1)
1934 switch x {
1935 default:
1936 return 4
1937 case 1:
1938 print(2)
1939 panic(3)
1943 var _ = func() int {
1944 print(1)
1945 switch x {
1946 case 1:
1947 print(2)
1948 fallthrough
1949 default:
1950 return 4
1954 // if no default or some case doesn't terminate, switch is no longer okay
1956 var _ = func() int {
1957 print(1)
1958 switch {
1960 } // ERROR "missing return"
1963 var _ = func() int {
1964 print(1)
1965 switch x {
1966 case 1:
1967 print(2)
1968 panic(3)
1969 case 2:
1970 return 4
1972 } // ERROR "missing return"
1974 var _ = func() int {
1975 print(1)
1976 switch x {
1977 case 2:
1978 return 4
1979 case 1:
1980 print(2)
1981 panic(3)
1983 } // ERROR "missing return"
1985 var _ = func() int {
1986 print(1)
1987 switch x {
1988 case 1:
1989 print(2)
1990 fallthrough
1991 case 2:
1992 return 4
1994 } // ERROR "missing return"
1996 var _ = func() int {
1997 print(1)
1998 switch x {
1999 case 1:
2000 print(2)
2001 panic(3)
2003 } // ERROR "missing return"
2005 // if any breaks refer to the switch, switch is no longer okay
2007 var _ = func() int {
2008 print(1)
2010 switch x {
2011 case 1:
2012 print(2)
2013 panic(3)
2014 break L
2015 default:
2016 return 4
2018 } // ERROR "missing return"
2020 var _ = func() int {
2021 print(1)
2022 switch x {
2023 default:
2024 return 4
2025 break
2026 case 1:
2027 print(2)
2028 panic(3)
2030 } // ERROR "missing return"
2032 var _ = func() int {
2033 print(1)
2035 switch x {
2036 case 1:
2037 print(2)
2038 for {
2039 break L
2041 default:
2042 return 4
2044 } // ERROR "missing return"
2046 // type switch with default in which all cases terminate is okay
2048 var _ = func() int {
2049 print(1)
2050 switch x.(type) {
2051 case int:
2052 print(2)
2053 panic(3)
2054 default:
2055 return 4
2059 var _ = func() int {
2060 print(1)
2061 switch x.(type) {
2062 default:
2063 return 4
2064 case int:
2065 print(2)
2066 panic(3)
2070 // if no default or some case doesn't terminate, switch is no longer okay
2072 var _ = func() int {
2073 print(1)
2074 switch {
2076 } // ERROR "missing return"
2079 var _ = func() int {
2080 print(1)
2081 switch x.(type) {
2082 case int:
2083 print(2)
2084 panic(3)
2085 case float64:
2086 return 4
2088 } // ERROR "missing return"
2090 var _ = func() int {
2091 print(1)
2092 switch x.(type) {
2093 case float64:
2094 return 4
2095 case int:
2096 print(2)
2097 panic(3)
2099 } // ERROR "missing return"
2101 var _ = func() int {
2102 print(1)
2103 switch x.(type) {
2104 case int:
2105 print(2)
2106 panic(3)
2108 } // ERROR "missing return"
2110 // if any breaks refer to the switch, switch is no longer okay
2112 var _ = func() int {
2113 print(1)
2115 switch x.(type) {
2116 case int:
2117 print(2)
2118 panic(3)
2119 break L
2120 default:
2121 return 4
2123 } // ERROR "missing return"
2125 var _ = func() int {
2126 print(1)
2127 switch x.(type) {
2128 default:
2129 return 4
2130 break
2131 case int:
2132 print(2)
2133 panic(3)
2135 } // ERROR "missing return"
2137 var _ = func() int {
2138 print(1)
2140 switch x.(type) {
2141 case int:
2142 print(2)
2143 for {
2144 break L
2146 default:
2147 return 4
2149 } // ERROR "missing return"
2151 // again, but without the leading print(1).
2152 // testing that everything works when the terminating statement is first.
2154 var _ = func() int {
2155 } // ERROR "missing return"
2157 // return is okay
2158 var _ = func() int {
2159 return 2
2162 // goto is okay
2163 var _ = func() int {
2165 goto L
2168 // panic is okay
2169 var _ = func() int {
2170 panic(2)
2173 // but only builtin panic
2174 var _ = func() int {
2175 var panic = func(int) {}
2176 panic(2)
2177 } // ERROR "missing return"
2179 // block ending in terminating statement is okay
2180 var _ = func() int {
2182 return 2
2186 // block ending in terminating statement is okay
2187 var _ = func() int {
2190 goto L
2194 // block ending in terminating statement is okay
2195 var _ = func() int {
2197 panic(2)
2201 // adding more code - even though it is dead - now requires a return
2203 var _ = func() int {
2204 return 2
2205 print(3)
2206 } // ERROR "missing return"
2208 var _ = func() int {
2210 goto L
2211 print(3)
2212 } // ERROR "missing return"
2214 var _ = func() int {
2215 panic(2)
2216 print(3)
2217 } // ERROR "missing return"
2219 var _ = func() int {
2221 return 2
2222 print(3)
2224 } // ERROR "missing return"
2226 var _ = func() int {
2229 goto L
2230 print(3)
2232 } // ERROR "missing return"
2234 var _ = func() int {
2236 panic(2)
2237 print(3)
2239 } // ERROR "missing return"
2241 var _ = func() int {
2243 return 2
2245 print(3)
2246 } // ERROR "missing return"
2248 var _ = func() int {
2251 goto L
2253 print(3)
2254 } // ERROR "missing return"
2256 var _ = func() int {
2258 panic(2)
2260 print(3)
2261 } // ERROR "missing return"
2263 // even an empty dead block triggers the message, because it
2264 // becomes the final statement.
2266 var _ = func() int {
2267 return 2
2269 } // ERROR "missing return"
2271 var _ = func() int {
2273 goto L
2275 } // ERROR "missing return"
2277 var _ = func() int {
2278 panic(2)
2280 } // ERROR "missing return"
2282 var _ = func() int {
2284 return 2
2287 } // ERROR "missing return"
2289 var _ = func() int {
2292 goto L
2295 } // ERROR "missing return"
2297 var _ = func() int {
2299 panic(2)
2302 } // ERROR "missing return"
2304 var _ = func() int {
2306 return 2
2309 } // ERROR "missing return"
2311 var _ = func() int {
2314 goto L
2317 } // ERROR "missing return"
2319 var _ = func() int {
2321 panic(2)
2324 } // ERROR "missing return"
2326 // if-else chain with final else and all terminating is okay
2328 var _ = func() int {
2329 if x == nil {
2330 panic(2)
2331 } else {
2332 panic(3)
2336 var _ = func() int {
2338 if x == nil {
2339 panic(2)
2340 } else {
2341 goto L
2345 var _ = func() int {
2347 if x == nil {
2348 panic(2)
2349 } else if x == 1 {
2350 return 0
2351 } else if x != 2 {
2352 panic(3)
2353 } else {
2354 goto L
2358 // if-else chain missing final else is not okay, even if the
2359 // conditions cover every possible case.
2361 var _ = func() int {
2362 if x == nil {
2363 panic(2)
2364 } else if x != nil {
2365 panic(3)
2367 } // ERROR "missing return"
2369 var _ = func() int {
2370 if x == nil {
2371 panic(2)
2373 } // ERROR "missing return"
2375 var _ = func() int {
2376 if x == nil {
2377 panic(2)
2378 } else if x == 1 {
2379 return 0
2380 } else if x != 1 {
2381 panic(3)
2383 } // ERROR "missing return"
2386 // for { loops that never break are okay.
2388 var _ = func() int {
2389 for {}
2392 var _ = func() int {
2393 for {
2394 for {
2395 break
2400 var _ = func() int {
2401 for {
2403 for {
2404 break L
2409 // for { loops that break are not okay.
2411 var _ = func() int {
2412 for { break }
2413 } // ERROR "missing return"
2415 var _ = func() int {
2416 for {
2417 for {
2419 break
2421 } // ERROR "missing return"
2423 var _ = func() int {
2425 for {
2426 for {
2427 break L
2430 } // ERROR "missing return"
2432 // if there's a condition - even "true" - the loops are no longer syntactically terminating
2434 var _ = func() int {
2435 for x == nil {}
2436 } // ERROR "missing return"
2438 var _ = func() int {
2439 for x == nil {
2440 for {
2441 break
2444 } // ERROR "missing return"
2446 var _ = func() int {
2447 for x == nil {
2449 for {
2450 break L
2453 } // ERROR "missing return"
2455 var _ = func() int {
2456 for true {}
2457 } // ERROR "missing return"
2459 var _ = func() int {
2460 for true {
2461 for {
2462 break
2465 } // ERROR "missing return"
2467 var _ = func() int {
2468 for true {
2470 for {
2471 break L
2474 } // ERROR "missing return"
2476 // select in which all cases terminate and none break are okay.
2478 var _ = func() int {
2479 select{}
2482 var _ = func() int {
2483 select {
2484 case <-c:
2485 print(2)
2486 panic("abc")
2490 var _ = func() int {
2491 select {
2492 case <-c:
2493 print(2)
2494 for{}
2498 var _ = func() int {
2500 select {
2501 case <-c:
2502 print(2)
2503 panic("abc")
2504 case c <- 1:
2505 print(2)
2506 goto L
2510 var _ = func() int {
2511 select {
2512 case <-c:
2513 print(2)
2514 panic("abc")
2515 default:
2516 select{}
2520 // if any cases don't terminate, the select isn't okay anymore
2522 var _ = func() int {
2523 select {
2524 case <-c:
2525 print(2)
2527 } // ERROR "missing return"
2529 var _ = func() int {
2531 select {
2532 case <-c:
2533 print(2)
2534 panic("abc")
2535 goto L
2536 case c <- 1:
2537 print(2)
2539 } // ERROR "missing return"
2542 var _ = func() int {
2543 select {
2544 case <-c:
2545 print(2)
2546 panic("abc")
2547 default:
2548 print(2)
2550 } // ERROR "missing return"
2553 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
2555 var _ = func() int {
2556 select{ default: break }
2557 } // ERROR "missing return"
2559 var _ = func() int {
2560 select {
2561 case <-c:
2562 print(2)
2563 panic("abc")
2564 break
2566 } // ERROR "missing return"
2568 var _ = func() int {
2570 select {
2571 case <-c:
2572 print(2)
2573 for{ break L }
2575 } // ERROR "missing return"
2577 var _ = func() int {
2579 select {
2580 case <-c:
2581 print(2)
2582 panic("abc")
2583 case c <- 1:
2584 print(2)
2585 break L
2587 } // ERROR "missing return"
2589 var _ = func() int {
2590 select {
2591 case <-c:
2592 panic("abc")
2593 default:
2594 select{}
2595 break
2597 } // ERROR "missing return"
2599 // switch with default in which all cases terminate is okay
2601 var _ = func() int {
2602 switch x {
2603 case 1:
2604 print(2)
2605 panic(3)
2606 default:
2607 return 4
2611 var _ = func() int {
2612 switch x {
2613 default:
2614 return 4
2615 case 1:
2616 print(2)
2617 panic(3)
2621 var _ = func() int {
2622 switch x {
2623 case 1:
2624 print(2)
2625 fallthrough
2626 default:
2627 return 4
2631 // if no default or some case doesn't terminate, switch is no longer okay
2633 var _ = func() int {
2634 switch {
2636 } // ERROR "missing return"
2639 var _ = func() int {
2640 switch x {
2641 case 1:
2642 print(2)
2643 panic(3)
2644 case 2:
2645 return 4
2647 } // ERROR "missing return"
2649 var _ = func() int {
2650 switch x {
2651 case 2:
2652 return 4
2653 case 1:
2654 print(2)
2655 panic(3)
2657 } // ERROR "missing return"
2659 var _ = func() int {
2660 switch x {
2661 case 1:
2662 print(2)
2663 fallthrough
2664 case 2:
2665 return 4
2667 } // ERROR "missing return"
2669 var _ = func() int {
2670 switch x {
2671 case 1:
2672 print(2)
2673 panic(3)
2675 } // ERROR "missing return"
2677 // if any breaks refer to the switch, switch is no longer okay
2679 var _ = func() int {
2681 switch x {
2682 case 1:
2683 print(2)
2684 panic(3)
2685 break L
2686 default:
2687 return 4
2689 } // ERROR "missing return"
2691 var _ = func() int {
2692 switch x {
2693 default:
2694 return 4
2695 break
2696 case 1:
2697 print(2)
2698 panic(3)
2700 } // ERROR "missing return"
2702 var _ = func() int {
2704 switch x {
2705 case 1:
2706 print(2)
2707 for {
2708 break L
2710 default:
2711 return 4
2713 } // ERROR "missing return"
2715 // type switch with default in which all cases terminate is okay
2717 var _ = func() int {
2718 switch x.(type) {
2719 case int:
2720 print(2)
2721 panic(3)
2722 default:
2723 return 4
2727 var _ = func() int {
2728 switch x.(type) {
2729 default:
2730 return 4
2731 case int:
2732 print(2)
2733 panic(3)
2737 // if no default or some case doesn't terminate, switch is no longer okay
2739 var _ = func() int {
2740 switch {
2742 } // ERROR "missing return"
2745 var _ = func() int {
2746 switch x.(type) {
2747 case int:
2748 print(2)
2749 panic(3)
2750 case float64:
2751 return 4
2753 } // ERROR "missing return"
2755 var _ = func() int {
2756 switch x.(type) {
2757 case float64:
2758 return 4
2759 case int:
2760 print(2)
2761 panic(3)
2763 } // ERROR "missing return"
2765 var _ = func() int {
2766 switch x.(type) {
2767 case int:
2768 print(2)
2769 panic(3)
2771 } // ERROR "missing return"
2773 // if any breaks refer to the switch, switch is no longer okay
2775 var _ = func() int {
2777 switch x.(type) {
2778 case int:
2779 print(2)
2780 panic(3)
2781 break L
2782 default:
2783 return 4
2785 } // ERROR "missing return"
2787 var _ = func() int {
2788 switch x.(type) {
2789 default:
2790 return 4
2791 break
2792 case int:
2793 print(2)
2794 panic(3)
2796 } // ERROR "missing return"
2798 var _ = func() int {
2800 switch x.(type) {
2801 case int:
2802 print(2)
2803 for {
2804 break L
2806 default:
2807 return 4
2809 } // ERROR "missing return"
2811 var _ = func() int {
2812 switch x.(type) {
2813 default:
2814 return 4
2815 case int, float64:
2816 print(2)
2817 panic(3)
2821 /**/