]> Cypherpunks.ru repositories - gostls13.git/blob - test/return.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / return.go
1 // errorcheck
2
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.
6
7 // Test compiler diagnosis of function missing return statements.
8 // See issue 65 and golang.org/s/go11return.
9
10 package p
11
12 type T int
13
14 var x interface{}
15 var c chan int
16
17 func external() int // ok
18
19 func _() int {
20 } // ERROR "missing return"
21
22 func _() int {
23         print(1)
24 } // ERROR "missing return"
25
26 // return is okay
27 func _() int {
28         print(1)
29         return 2
30 }
31
32 // goto is okay
33 func _() int {
34 L:
35         print(1)
36         goto L
37 }
38
39 // panic is okay
40 func _() int {
41         print(1)
42         panic(2)
43 }
44
45 // but only builtin panic
46 func _() int {
47         var panic = func(int) {}
48         print(1)
49         panic(2)
50 } // ERROR "missing return"
51
52 // block ending in terminating statement is okay
53 func _() int {
54         {
55                 print(1)
56                 return 2
57         }
58 }
59
60 // block ending in terminating statement is okay
61 func _() int {
62 L:
63         {
64                 print(1)
65                 goto L
66         }
67 }
68
69 // block ending in terminating statement is okay
70 func _() int {
71         print(1)
72         {
73                 panic(2)
74         }
75 }
76
77 // adding more code - even though it is dead - now requires a return
78
79 func _() int {
80         print(1)
81         return 2
82         print(3)
83 } // ERROR "missing return"
84
85 func _() int {
86 L:
87         print(1)
88         goto L
89         print(3)
90 } // ERROR "missing return"
91
92 func _() int {
93         print(1)
94         panic(2)
95         print(3)
96 } // ERROR "missing return"
97
98 func _() int {
99         {
100                 print(1)
101                 return 2
102                 print(3)
103         }
104 } // ERROR "missing return"
105
106 func _() int {
107 L:
108         {
109                 print(1)
110                 goto L
111                 print(3)
112         }
113 } // ERROR "missing return"
114
115 func _() int {
116         print(1)
117         {
118                 panic(2)
119                 print(3)
120         }
121 } // ERROR "missing return"
122
123 func _() int {
124         {
125                 print(1)
126                 return 2
127         }
128         print(3)
129 } // ERROR "missing return"
130
131 func _() int {
132 L:
133         {
134                 print(1)
135                 goto L
136         }
137         print(3)
138 } // ERROR "missing return"
139
140 func _() int {
141         print(1)
142         {
143                 panic(2)
144         }
145         print(3)
146 } // ERROR "missing return"
147
148 // even an empty dead block triggers the message, because it
149 // becomes the final statement.
150
151 func _() int {
152         print(1)
153         return 2
154         {}
155 } // ERROR "missing return"
156
157 func _() int {
158 L:
159         print(1)
160         goto L
161         {}
162 } // ERROR "missing return"
163
164 func _() int {
165         print(1)
166         panic(2)
167         {}
168 } // ERROR "missing return"
169
170 func _() int {
171         {
172                 print(1)
173                 return 2
174                 {}
175         }
176 } // ERROR "missing return"
177
178 func _() int {
179 L:
180         {
181                 print(1)
182                 goto L
183                 {}
184         }
185 } // ERROR "missing return"
186
187 func _() int {
188         print(1)
189         {
190                 panic(2)
191                 {}
192         }
193 } // ERROR "missing return"
194
195 func _() int {
196         {
197                 print(1)
198                 return 2
199         }
200         {}
201 } // ERROR "missing return"
202
203 func _() int {
204 L:
205         {
206                 print(1)
207                 goto L
208         }
209         {}
210 } // ERROR "missing return"
211
212 func _() int {
213         print(1)
214         {
215                 panic(2)
216         }
217         {}
218 } // ERROR "missing return"
219
220 // if-else chain with final else and all terminating is okay
221
222 func _() int {
223         print(1)
224         if x == nil {
225                 panic(2)
226         } else {
227                 panic(3)
228         }
229 }
230
231 func _() int {
232 L:
233         print(1)
234         if x == nil {
235                 panic(2)
236         } else {
237                 goto L
238         }
239 }
240
241 func _() int {
242 L:
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
252         }
253 }
254
255 // if-else chain missing final else is not okay, even if the
256 // conditions cover every possible case.
257
258 func _() int {
259         print(1)
260         if x == nil {
261                 panic(2)
262         } else if x != nil {
263                 panic(3)
264         }
265 } // ERROR "missing return"
266
267 func _() int {
268         print(1)
269         if x == nil {
270                 panic(2)
271         }
272 } // ERROR "missing return"
273
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)
282         }
283 } // ERROR "missing return"
284
285
286 // for { loops that never break are okay.
287
288 func _() int {
289         print(1)
290         for {}
291 }
292
293 func _() int {
294         for {
295                 for {
296                         break
297                 }
298         }
299 }
300
301 func _() int {
302         for {
303                 L:
304                 for {
305                         break L
306                 }
307         }
308 }
309
310 // for { loops that break are not okay.
311
312 func _() int {
313         print(1)
314         for { break }
315 } // ERROR "missing return"
316
317 func _() int {
318         for {
319                 for {
320                 }
321                 break
322         }
323 } // ERROR "missing return"
324
325 func _() int {
326 L:
327         for {
328                 for {
329                         break L
330                 }
331         }
332 } // ERROR "missing return"
333
334 // if there's a condition - even "true" - the loops are no longer syntactically terminating
335
336 func _() int {
337         print(1)
338         for x == nil {}
339 } // ERROR "missing return"
340
341 func _() int {
342         for x == nil {
343                 for {
344                         break
345                 }
346         }
347 } // ERROR "missing return"
348
349 func _() int {
350         for x == nil {
351                 L:
352                 for {
353                         break L
354                 }
355         }       
356 } // ERROR "missing return"
357
358 func _() int {
359         print(1)
360         for true {}
361 } // ERROR "missing return"
362
363 func _() int {
364         for true {
365                 for {
366                         break
367                 }
368         }
369 } // ERROR "missing return"
370
371 func _() int {
372         for true {
373                 L:
374                 for {
375                         break L
376                 }
377         }
378 } // ERROR "missing return"
379
380 // select in which all cases terminate and none break are okay.
381
382 func _() int {
383         print(1)
384         select{}
385 }
386
387 func _() int {
388         print(1)
389         select {
390         case <-c:
391                 print(2)
392                 panic("abc")
393         }
394 }
395
396 func _() int {
397         print(1)
398         select {
399         case <-c:
400                 print(2)
401                 for{}
402         }
403 }
404
405 func _() int {
406 L:
407         print(1)
408         select {
409         case <-c:
410                 print(2)
411                 panic("abc")
412         case c <- 1:
413                 print(2)
414                 goto L
415         }
416 }
417
418 func _() int {
419         print(1)
420         select {
421         case <-c:
422                 print(2)
423                 panic("abc")
424         default:
425                 select{}
426         }
427 }
428
429 // if any cases don't terminate, the select isn't okay anymore
430
431 func _() int {
432         print(1)
433         select {
434         case <-c:
435                 print(2)
436         }
437 } // ERROR "missing return"
438
439 func _() int {
440 L:
441         print(1)
442         select {
443         case <-c:
444                 print(2)
445                 panic("abc")
446                 goto L
447         case c <- 1:
448                 print(2)
449         }
450 } // ERROR "missing return"
451
452
453 func _() int {
454         print(1)
455         select {
456         case <-c:
457                 print(2)
458                 panic("abc")
459         default:
460                 print(2)
461         }
462 } // ERROR "missing return"
463
464
465 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
466
467 func _() int {
468         print(1)
469         select{ default: break }
470 } // ERROR "missing return"
471
472 func _() int {
473         print(1)
474         select {
475         case <-c:
476                 print(2)
477                 panic("abc")
478                 break
479         }
480 } // ERROR "missing return"
481
482 func _() int {
483         print(1)
484 L:
485         select {
486         case <-c:
487                 print(2)
488                 for{ break L }
489         }
490 } // ERROR "missing return"
491
492 func _() int {
493         print(1)
494 L:
495         select {
496         case <-c:
497                 print(2)
498                 panic("abc")
499         case c <- 1:
500                 print(2)
501                 break L
502         }
503 } // ERROR "missing return"
504
505 func _() int {
506         print(1)
507         select {
508         case <-c:
509                 print(1)
510                 panic("abc")
511         default:
512                 select{}
513                 break
514         }
515 } // ERROR "missing return"
516
517 // switch with default in which all cases terminate is okay
518
519 func _() int {
520         print(1)
521         switch x {
522         case 1:
523                 print(2)
524                 panic(3)
525         default:
526                 return 4
527         }
528 }
529
530 func _() int {
531         print(1)
532         switch x {
533         default:
534                 return 4
535         case 1:
536                 print(2)
537                 panic(3)
538         }
539 }
540
541 func _() int {
542         print(1)
543         switch x {
544         case 1:
545                 print(2)
546                 fallthrough
547         default:
548                 return 4
549         }
550 }
551
552 // if no default or some case doesn't terminate, switch is no longer okay
553
554 func _() int {
555         print(1)
556         switch {
557         }
558 } // ERROR "missing return"
559
560
561 func _() int {
562         print(1)
563         switch x {
564         case 1:
565                 print(2)
566                 panic(3)
567         case 2:
568                 return 4
569         }
570 } // ERROR "missing return"
571
572 func _() int {
573         print(1)
574         switch x {
575         case 2:
576                 return 4
577         case 1:
578                 print(2)
579                 panic(3)
580         }
581 } // ERROR "missing return"
582
583 func _() int {
584         print(1)
585         switch x {
586         case 1:
587                 print(2)
588                 fallthrough
589         case 2:
590                 return 4
591         }
592 } // ERROR "missing return"
593
594 func _() int {
595         print(1)
596         switch x {
597         case 1:
598                 print(2)
599                 panic(3)
600         }
601 } // ERROR "missing return"
602
603 // if any breaks refer to the switch, switch is no longer okay
604
605 func _() int {
606         print(1)
607 L:
608         switch x {
609         case 1:
610                 print(2)
611                 panic(3)
612                 break L
613         default:
614                 return 4
615         }
616 } // ERROR "missing return"
617
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)
627         }
628 } // ERROR "missing return"
629
630 func _() int {
631         print(1)
632 L:
633         switch x {
634         case 1:
635                 print(2)
636                 for {
637                         break L
638                 }
639         default:
640                 return 4
641         }
642 } // ERROR "missing return"
643
644 // type switch with default in which all cases terminate is okay
645
646 func _() int {
647         print(1)
648         switch x.(type) {
649         case int:
650                 print(2)
651                 panic(3)
652         default:
653                 return 4
654         }
655 }
656
657 func _() int {
658         print(1)
659         switch x.(type) {
660         default:
661                 return 4
662         case int:
663                 print(2)
664                 panic(3)
665         }
666 }
667
668 // if no default or some case doesn't terminate, switch is no longer okay
669
670 func _() int {
671         print(1)
672         switch {
673         }
674 } // ERROR "missing return"
675
676
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
685         }
686 } // ERROR "missing return"
687
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)
696         }
697 } // ERROR "missing return"
698
699 func _() int {
700         print(1)
701         switch x.(type) {
702         case int:
703                 print(2)
704                 panic(3)
705         }
706 } // ERROR "missing return"
707
708 // if any breaks refer to the switch, switch is no longer okay
709
710 func _() int {
711         print(1)
712 L:
713         switch x.(type) {
714         case int:
715                 print(2)
716                 panic(3)
717                 break L
718         default:
719                 return 4
720         }
721 } // ERROR "missing return"
722
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)
732         }
733 } // ERROR "missing return"
734
735 func _() int {
736         print(1)
737 L:
738         switch x.(type) {
739         case int:
740                 print(2)
741                 for {
742                         break L
743                 }
744         default:
745                 return 4
746         }
747 } // ERROR "missing return"
748
749 // again, but without the leading print(1).
750 // testing that everything works when the terminating statement is first.
751
752 func _() int {
753 } // ERROR "missing return"
754
755 // return is okay
756 func _() int {
757         return 2
758 }
759
760 // goto is okay
761 func _() int {
762 L:
763         goto L
764 }
765
766 // panic is okay
767 func _() int {
768         panic(2)
769 }
770
771 // but only builtin panic
772 func _() int {
773         var panic = func(int) {}
774         panic(2)
775 } // ERROR "missing return"
776
777 // block ending in terminating statement is okay
778 func _() int {
779         {
780                 return 2
781         }
782 }
783
784 // block ending in terminating statement is okay
785 func _() int {
786 L:
787         {
788                 goto L
789         }
790 }
791
792 // block ending in terminating statement is okay
793 func _() int {
794         {
795                 panic(2)
796         }
797 }
798
799 // adding more code - even though it is dead - now requires a return
800
801 func _() int {
802         return 2
803         print(3)
804 } // ERROR "missing return"
805
806 func _() int {
807 L:
808         goto L
809         print(3)
810 } // ERROR "missing return"
811
812 func _() int {
813         panic(2)
814         print(3)
815 } // ERROR "missing return"
816
817 func _() int {
818         {
819                 return 2
820                 print(3)
821         }
822 } // ERROR "missing return"
823
824 func _() int {
825 L:
826         {
827                 goto L
828                 print(3)
829         }
830 } // ERROR "missing return"
831
832 func _() int {
833         {
834                 panic(2)
835                 print(3)
836         }
837 } // ERROR "missing return"
838
839 func _() int {
840         {
841                 return 2
842         }
843         print(3)
844 } // ERROR "missing return"
845
846 func _() int {
847 L:
848         {
849                 goto L
850         }
851         print(3)
852 } // ERROR "missing return"
853
854 func _() int {
855         {
856                 panic(2)
857         }
858         print(3)
859 } // ERROR "missing return"
860
861 // even an empty dead block triggers the message, because it
862 // becomes the final statement.
863
864 func _() int {
865         return 2
866         {}
867 } // ERROR "missing return"
868
869 func _() int {
870 L:
871         goto L
872         {}
873 } // ERROR "missing return"
874
875 func _() int {
876         panic(2)
877         {}
878 } // ERROR "missing return"
879
880 func _() int {
881         {
882                 return 2
883                 {}
884         }
885 } // ERROR "missing return"
886
887 func _() int {
888 L:
889         {
890                 goto L
891                 {}
892         }
893 } // ERROR "missing return"
894
895 func _() int {
896         {
897                 panic(2)
898                 {}
899         }
900 } // ERROR "missing return"
901
902 func _() int {
903         {
904                 return 2
905         }
906         {}
907 } // ERROR "missing return"
908
909 func _() int {
910 L:
911         {
912                 goto L
913         }
914         {}
915 } // ERROR "missing return"
916
917 func _() int {
918         {
919                 panic(2)
920         }
921         {}
922 } // ERROR "missing return"
923
924 // if-else chain with final else and all terminating is okay
925
926 func _() int {
927         if x == nil {
928                 panic(2)
929         } else {
930                 panic(3)
931         }
932 }
933
934 func _() int {
935 L:
936         if x == nil {
937                 panic(2)
938         } else {
939                 goto L
940         }
941 }
942
943 func _() int {
944 L:
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
953         }
954 }
955
956 // if-else chain missing final else is not okay, even if the
957 // conditions cover every possible case.
958
959 func _() int {
960         if x == nil {
961                 panic(2)
962         } else if x != nil {
963                 panic(3)
964         }
965 } // ERROR "missing return"
966
967 func _() int {
968         if x == nil {
969                 panic(2)
970         }
971 } // ERROR "missing return"
972
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)
980         }
981 } // ERROR "missing return"
982
983
984 // for { loops that never break are okay.
985
986 func _() int {
987         for {}
988 }
989
990 func _() int {
991         for {
992                 for {
993                         break
994                 }
995         }
996 }
997
998 func _() int {
999         for {
1000                 L:
1001                 for {
1002                         break L
1003                 }
1004         }
1005 }
1006
1007 // for { loops that break are not okay.
1008
1009 func _() int {
1010         for { break }
1011 } // ERROR "missing return"
1012
1013 func _() int {
1014         for {
1015                 for {
1016                 }
1017                 break
1018         }
1019 } // ERROR "missing return"
1020
1021 func _() int {
1022 L:
1023         for {
1024                 for {
1025                         break L
1026                 }
1027         }
1028 } // ERROR "missing return"
1029
1030 // if there's a condition - even "true" - the loops are no longer syntactically terminating
1031
1032 func _() int {
1033         for x == nil {}
1034 } // ERROR "missing return"
1035
1036 func _() int {
1037         for x == nil {
1038                 for {
1039                         break
1040                 }
1041         }
1042 } // ERROR "missing return"
1043
1044 func _() int {
1045         for x == nil {
1046                 L:
1047                 for {
1048                         break L
1049                 }
1050         }       
1051 } // ERROR "missing return"
1052
1053 func _() int {
1054         for true {}
1055 } // ERROR "missing return"
1056
1057 func _() int {
1058         for true {
1059                 for {
1060                         break
1061                 }
1062         }
1063 } // ERROR "missing return"
1064
1065 func _() int {
1066         for true {
1067                 L:
1068                 for {
1069                         break L
1070                 }
1071         }
1072 } // ERROR "missing return"
1073
1074 // select in which all cases terminate and none break are okay.
1075
1076 func _() int {
1077         select{}
1078 }
1079
1080 func _() int {
1081         select {
1082         case <-c:
1083                 print(2)
1084                 panic("abc")
1085         }
1086 }
1087
1088 func _() int {
1089         select {
1090         case <-c:
1091                 print(2)
1092                 for{}
1093         }
1094 }
1095
1096 func _() int {
1097 L:
1098         select {
1099         case <-c:
1100                 print(2)
1101                 panic("abc")
1102         case c <- 1:
1103                 print(2)
1104                 goto L
1105         }
1106 }
1107
1108 func _() int {
1109         select {
1110         case <-c:
1111                 print(2)
1112                 panic("abc")
1113         default:
1114                 select{}
1115         }
1116 }
1117
1118 // if any cases don't terminate, the select isn't okay anymore
1119
1120 func _() int {
1121         select {
1122         case <-c:
1123                 print(2)
1124         }
1125 } // ERROR "missing return"
1126
1127 func _() int {
1128 L:
1129         select {
1130         case <-c:
1131                 print(2)
1132                 panic("abc")
1133                 goto L
1134         case c <- 1:
1135                 print(2)
1136         }
1137 } // ERROR "missing return"
1138
1139
1140 func _() int {
1141         select {
1142         case <-c:
1143                 print(2)
1144                 panic("abc")
1145         default:
1146                 print(2)
1147         }
1148 } // ERROR "missing return"
1149
1150
1151 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
1152
1153 func _() int {
1154         select{ default: break }
1155 } // ERROR "missing return"
1156
1157 func _() int {
1158         select {
1159         case <-c:
1160                 print(2)
1161                 panic("abc")
1162                 break
1163         }
1164 } // ERROR "missing return"
1165
1166 func _() int {
1167 L:
1168         select {
1169         case <-c:
1170                 print(2)
1171                 for{ break L }
1172         }
1173 } // ERROR "missing return"
1174
1175 func _() int {
1176 L:
1177         select {
1178         case <-c:
1179                 print(2)
1180                 panic("abc")
1181         case c <- 1:
1182                 print(2)
1183                 break L
1184         }
1185 } // ERROR "missing return"
1186
1187 func _() int {
1188         select {
1189         case <-c:
1190                 panic("abc")
1191         default:
1192                 select{}
1193                 break
1194         }
1195 } // ERROR "missing return"
1196
1197 // switch with default in which all cases terminate is okay
1198
1199 func _() int {
1200         switch x {
1201         case 1:
1202                 print(2)
1203                 panic(3)
1204         default:
1205                 return 4
1206         }
1207 }
1208
1209 func _() int {
1210         switch x {
1211         default:
1212                 return 4
1213         case 1:
1214                 print(2)
1215                 panic(3)
1216         }
1217 }
1218
1219 func _() int {
1220         switch x {
1221         case 1:
1222                 print(2)
1223                 fallthrough
1224         default:
1225                 return 4
1226         }
1227 }
1228
1229 // if no default or some case doesn't terminate, switch is no longer okay
1230
1231 func _() int {
1232         switch {
1233         }
1234 } // ERROR "missing return"
1235
1236
1237 func _() int {
1238         switch x {
1239         case 1:
1240                 print(2)
1241                 panic(3)
1242         case 2:
1243                 return 4
1244         }
1245 } // ERROR "missing return"
1246
1247 func _() int {
1248         switch x {
1249         case 2:
1250                 return 4
1251         case 1:
1252                 print(2)
1253                 panic(3)
1254         }
1255 } // ERROR "missing return"
1256
1257 func _() int {
1258         switch x {
1259         case 1:
1260                 print(2)
1261                 fallthrough
1262         case 2:
1263                 return 4
1264         }
1265 } // ERROR "missing return"
1266
1267 func _() int {
1268         switch x {
1269         case 1:
1270                 print(2)
1271                 panic(3)
1272         }
1273 } // ERROR "missing return"
1274
1275 // if any breaks refer to the switch, switch is no longer okay
1276
1277 func _() int {
1278 L:
1279         switch x {
1280         case 1:
1281                 print(2)
1282                 panic(3)
1283                 break L
1284         default:
1285                 return 4
1286         }
1287 } // ERROR "missing return"
1288
1289 func _() int {
1290         switch x {
1291         default:
1292                 return 4
1293                 break
1294         case 1:
1295                 print(2)
1296                 panic(3)
1297         }
1298 } // ERROR "missing return"
1299
1300 func _() int {
1301 L:
1302         switch x {
1303         case 1:
1304                 print(2)
1305                 for {
1306                         break L
1307                 }
1308         default:
1309                 return 4
1310         }
1311 } // ERROR "missing return"
1312
1313 // type switch with default in which all cases terminate is okay
1314
1315 func _() int {
1316         switch x.(type) {
1317         case int:
1318                 print(2)
1319                 panic(3)
1320         default:
1321                 return 4
1322         }
1323 }
1324
1325 func _() int {
1326         switch x.(type) {
1327         default:
1328                 return 4
1329         case int:
1330                 print(2)
1331                 panic(3)
1332         }
1333 }
1334
1335 // if no default or some case doesn't terminate, switch is no longer okay
1336
1337 func _() int {
1338         switch {
1339         }
1340 } // ERROR "missing return"
1341
1342
1343 func _() int {
1344         switch x.(type) {
1345         case int:
1346                 print(2)
1347                 panic(3)
1348         case float64:
1349                 return 4
1350         }
1351 } // ERROR "missing return"
1352
1353 func _() int {
1354         switch x.(type) {
1355         case float64:
1356                 return 4
1357         case int:
1358                 print(2)
1359                 panic(3)
1360         }
1361 } // ERROR "missing return"
1362
1363 func _() int {
1364         switch x.(type) {
1365         case int:
1366                 print(2)
1367                 panic(3)
1368         }
1369 } // ERROR "missing return"
1370
1371 // if any breaks refer to the switch, switch is no longer okay
1372
1373 func _() int {
1374 L:
1375         switch x.(type) {
1376         case int:
1377                 print(2)
1378                 panic(3)
1379                 break L
1380         default:
1381                 return 4
1382         }
1383 } // ERROR "missing return"
1384
1385 func _() int {
1386         switch x.(type) {
1387         default:
1388                 return 4
1389                 break
1390         case int:
1391                 print(2)
1392                 panic(3)
1393         }
1394 } // ERROR "missing return"
1395
1396 func _() int {
1397 L:
1398         switch x.(type) {
1399         case int:
1400                 print(2)
1401                 for {
1402                         break L
1403                 }
1404         default:
1405                 return 4
1406         }
1407 } // ERROR "missing return"
1408
1409 func _() int {
1410         switch x.(type) {
1411         default:
1412                 return 4
1413         case int, float64:
1414                 print(2)
1415                 panic(3)
1416         }
1417 }
1418
1419 // again, with func literals
1420
1421 var _ = func() int {
1422 } // ERROR "missing return"
1423
1424 var _ = func() int {
1425         print(1)
1426 } // ERROR "missing return"
1427
1428 // return is okay
1429 var _ = func() int {
1430         print(1)
1431         return 2
1432 }
1433
1434 // goto is okay
1435 var _ = func() int {
1436 L:
1437         print(1)
1438         goto L
1439 }
1440
1441 // panic is okay
1442 var _ = func() int {
1443         print(1)
1444         panic(2)
1445 }
1446
1447 // but only builtin panic
1448 var _ = func() int {
1449         var panic = func(int) {}
1450         print(1)
1451         panic(2)
1452 } // ERROR "missing return"
1453
1454 // block ending in terminating statement is okay
1455 var _ = func() int {
1456         {
1457                 print(1)
1458                 return 2
1459         }
1460 }
1461
1462 // block ending in terminating statement is okay
1463 var _ = func() int {
1464 L:
1465         {
1466                 print(1)
1467                 goto L
1468         }
1469 }
1470
1471 // block ending in terminating statement is okay
1472 var _ = func() int {
1473         print(1)
1474         {
1475                 panic(2)
1476         }
1477 }
1478
1479 // adding more code - even though it is dead - now requires a return
1480
1481 var _ = func() int {
1482         print(1)
1483         return 2
1484         print(3)
1485 } // ERROR "missing return"
1486
1487 var _ = func() int {
1488 L:
1489         print(1)
1490         goto L
1491         print(3)
1492 } // ERROR "missing return"
1493
1494 var _ = func() int {
1495         print(1)
1496         panic(2)
1497         print(3)
1498 } // ERROR "missing return"
1499
1500 var _ = func() int {
1501         {
1502                 print(1)
1503                 return 2
1504                 print(3)
1505         }
1506 } // ERROR "missing return"
1507
1508 var _ = func() int {
1509 L:
1510         {
1511                 print(1)
1512                 goto L
1513                 print(3)
1514         }
1515 } // ERROR "missing return"
1516
1517 var _ = func() int {
1518         print(1)
1519         {
1520                 panic(2)
1521                 print(3)
1522         }
1523 } // ERROR "missing return"
1524
1525 var _ = func() int {
1526         {
1527                 print(1)
1528                 return 2
1529         }
1530         print(3)
1531 } // ERROR "missing return"
1532
1533 var _ = func() int {
1534 L:
1535         {
1536                 print(1)
1537                 goto L
1538         }
1539         print(3)
1540 } // ERROR "missing return"
1541
1542 var _ = func() int {
1543         print(1)
1544         {
1545                 panic(2)
1546         }
1547         print(3)
1548 } // ERROR "missing return"
1549
1550 // even an empty dead block triggers the message, because it
1551 // becomes the final statement.
1552
1553 var _ = func() int {
1554         print(1)
1555         return 2
1556         {}
1557 } // ERROR "missing return"
1558
1559 var _ = func() int {
1560 L:
1561         print(1)
1562         goto L
1563         {}
1564 } // ERROR "missing return"
1565
1566 var _ = func() int {
1567         print(1)
1568         panic(2)
1569         {}
1570 } // ERROR "missing return"
1571
1572 var _ = func() int {
1573         {
1574                 print(1)
1575                 return 2
1576                 {}
1577         }
1578 } // ERROR "missing return"
1579
1580 var _ = func() int {
1581 L:
1582         {
1583                 print(1)
1584                 goto L
1585                 {}
1586         }
1587 } // ERROR "missing return"
1588
1589 var _ = func() int {
1590         print(1)
1591         {
1592                 panic(2)
1593                 {}
1594         }
1595 } // ERROR "missing return"
1596
1597 var _ = func() int {
1598         {
1599                 print(1)
1600                 return 2
1601         }
1602         {}
1603 } // ERROR "missing return"
1604
1605 var _ = func() int {
1606 L:
1607         {
1608                 print(1)
1609                 goto L
1610         }
1611         {}
1612 } // ERROR "missing return"
1613
1614 var _ = func() int {
1615         print(1)
1616         {
1617                 panic(2)
1618         }
1619         {}
1620 } // ERROR "missing return"
1621
1622 // if-else chain with final else and all terminating is okay
1623
1624 var _ = func() int {
1625         print(1)
1626         if x == nil {
1627                 panic(2)
1628         } else {
1629                 panic(3)
1630         }
1631 }
1632
1633 var _ = func() int {
1634 L:
1635         print(1)
1636         if x == nil {
1637                 panic(2)
1638         } else {
1639                 goto L
1640         }
1641 }
1642
1643 var _ = func() int {
1644 L:
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
1654         }
1655 }
1656
1657 // if-else chain missing final else is not okay, even if the
1658 // conditions cover every possible case.
1659
1660 var _ = func() int {
1661         print(1)
1662         if x == nil {
1663                 panic(2)
1664         } else if x != nil {
1665                 panic(3)
1666         }
1667 } // ERROR "missing return"
1668
1669 var _ = func() int {
1670         print(1)
1671         if x == nil {
1672                 panic(2)
1673         }
1674 } // ERROR "missing return"
1675
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)
1684         }
1685 } // ERROR "missing return"
1686
1687
1688 // for { loops that never break are okay.
1689
1690 var _ = func() int {
1691         print(1)
1692         for {}
1693 }
1694
1695 var _ = func() int {
1696         for {
1697                 for {
1698                         break
1699                 }
1700         }
1701 }
1702
1703 var _ = func() int {
1704         for {
1705                 L:
1706                 for {
1707                         break L
1708                 }
1709         }
1710 }
1711
1712 // for { loops that break are not okay.
1713
1714 var _ = func() int {
1715         print(1)
1716         for { break }
1717 } // ERROR "missing return"
1718
1719 var _ = func() int {
1720         for {
1721                 for {
1722                 }
1723                 break
1724         }
1725 } // ERROR "missing return"
1726
1727 var _ = func() int {
1728 L:
1729         for {
1730                 for {
1731                         break L
1732                 }
1733         }
1734 } // ERROR "missing return"
1735
1736 // if there's a condition - even "true" - the loops are no longer syntactically terminating
1737
1738 var _ = func() int {
1739         print(1)
1740         for x == nil {}
1741 } // ERROR "missing return"
1742
1743 var _ = func() int {
1744         for x == nil {
1745                 for {
1746                         break
1747                 }
1748         }
1749 } // ERROR "missing return"
1750
1751 var _ = func() int {
1752         for x == nil {
1753                 L:
1754                 for {
1755                         break L
1756                 }
1757         }       
1758 } // ERROR "missing return"
1759
1760 var _ = func() int {
1761         print(1)
1762         for true {}
1763 } // ERROR "missing return"
1764
1765 var _ = func() int {
1766         for true {
1767                 for {
1768                         break
1769                 }
1770         }
1771 } // ERROR "missing return"
1772
1773 var _ = func() int {
1774         for true {
1775                 L:
1776                 for {
1777                         break L
1778                 }
1779         }
1780 } // ERROR "missing return"
1781
1782 // select in which all cases terminate and none break are okay.
1783
1784 var _ = func() int {
1785         print(1)
1786         select{}
1787 }
1788
1789 var _ = func() int {
1790         print(1)
1791         select {
1792         case <-c:
1793                 print(2)
1794                 panic("abc")
1795         }
1796 }
1797
1798 var _ = func() int {
1799         print(1)
1800         select {
1801         case <-c:
1802                 print(2)
1803                 for{}
1804         }
1805 }
1806
1807 var _ = func() int {
1808 L:
1809         print(1)
1810         select {
1811         case <-c:
1812                 print(2)
1813                 panic("abc")
1814         case c <- 1:
1815                 print(2)
1816                 goto L
1817         }
1818 }
1819
1820 var _ = func() int {
1821         print(1)
1822         select {
1823         case <-c:
1824                 print(2)
1825                 panic("abc")
1826         default:
1827                 select{}
1828         }
1829 }
1830
1831 // if any cases don't terminate, the select isn't okay anymore
1832
1833 var _ = func() int {
1834         print(1)
1835         select {
1836         case <-c:
1837                 print(2)
1838         }
1839 } // ERROR "missing return"
1840
1841 var _ = func() int {
1842 L:
1843         print(1)
1844         select {
1845         case <-c:
1846                 print(2)
1847                 panic("abc")
1848                 goto L
1849         case c <- 1:
1850                 print(2)
1851         }
1852 } // ERROR "missing return"
1853
1854
1855 var _ = func() int {
1856         print(1)
1857         select {
1858         case <-c:
1859                 print(2)
1860                 panic("abc")
1861         default:
1862                 print(2)
1863         }
1864 } // ERROR "missing return"
1865
1866
1867 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
1868
1869 var _ = func() int {
1870         print(1)
1871         select{ default: break }
1872 } // ERROR "missing return"
1873
1874 var _ = func() int {
1875         print(1)
1876         select {
1877         case <-c:
1878                 print(2)
1879                 panic("abc")
1880                 break
1881         }
1882 } // ERROR "missing return"
1883
1884 var _ = func() int {
1885         print(1)
1886 L:
1887         select {
1888         case <-c:
1889                 print(2)
1890                 for{ break L }
1891         }
1892 } // ERROR "missing return"
1893
1894 var _ = func() int {
1895         print(1)
1896 L:
1897         select {
1898         case <-c:
1899                 print(2)
1900                 panic("abc")
1901         case c <- 1:
1902                 print(2)
1903                 break L
1904         }
1905 } // ERROR "missing return"
1906
1907 var _ = func() int {
1908         print(1)
1909         select {
1910         case <-c:
1911                 print(1)
1912                 panic("abc")
1913         default:
1914                 select{}
1915                 break
1916         }
1917 } // ERROR "missing return"
1918
1919 // switch with default in which all cases terminate is okay
1920
1921 var _ = func() int {
1922         print(1)
1923         switch x {
1924         case 1:
1925                 print(2)
1926                 panic(3)
1927         default:
1928                 return 4
1929         }
1930 }
1931
1932 var _ = func() int {
1933         print(1)
1934         switch x {
1935         default:
1936                 return 4
1937         case 1:
1938                 print(2)
1939                 panic(3)
1940         }
1941 }
1942
1943 var _ = func() int {
1944         print(1)
1945         switch x {
1946         case 1:
1947                 print(2)
1948                 fallthrough
1949         default:
1950                 return 4
1951         }
1952 }
1953
1954 // if no default or some case doesn't terminate, switch is no longer okay
1955
1956 var _ = func() int {
1957         print(1)
1958         switch {
1959         }
1960 } // ERROR "missing return"
1961
1962
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
1971         }
1972 } // ERROR "missing return"
1973
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)
1982         }
1983 } // ERROR "missing return"
1984
1985 var _ = func() int {
1986         print(1)
1987         switch x {
1988         case 1:
1989                 print(2)
1990                 fallthrough
1991         case 2:
1992                 return 4
1993         }
1994 } // ERROR "missing return"
1995
1996 var _ = func() int {
1997         print(1)
1998         switch x {
1999         case 1:
2000                 print(2)
2001                 panic(3)
2002         }
2003 } // ERROR "missing return"
2004
2005 // if any breaks refer to the switch, switch is no longer okay
2006
2007 var _ = func() int {
2008         print(1)
2009 L:
2010         switch x {
2011         case 1:
2012                 print(2)
2013                 panic(3)
2014                 break L
2015         default:
2016                 return 4
2017         }
2018 } // ERROR "missing return"
2019
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)
2029         }
2030 } // ERROR "missing return"
2031
2032 var _ = func() int {
2033         print(1)
2034 L:
2035         switch x {
2036         case 1:
2037                 print(2)
2038                 for {
2039                         break L
2040                 }
2041         default:
2042                 return 4
2043         }
2044 } // ERROR "missing return"
2045
2046 // type switch with default in which all cases terminate is okay
2047
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
2056         }
2057 }
2058
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)
2067         }
2068 }
2069
2070 // if no default or some case doesn't terminate, switch is no longer okay
2071
2072 var _ = func() int {
2073         print(1)
2074         switch {
2075         }
2076 } // ERROR "missing return"
2077
2078
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
2087         }
2088 } // ERROR "missing return"
2089
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)
2098         }
2099 } // ERROR "missing return"
2100
2101 var _ = func() int {
2102         print(1)
2103         switch x.(type) {
2104         case int:
2105                 print(2)
2106                 panic(3)
2107         }
2108 } // ERROR "missing return"
2109
2110 // if any breaks refer to the switch, switch is no longer okay
2111
2112 var _ = func() int {
2113         print(1)
2114 L:
2115         switch x.(type) {
2116         case int:
2117                 print(2)
2118                 panic(3)
2119                 break L
2120         default:
2121                 return 4
2122         }
2123 } // ERROR "missing return"
2124
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)
2134         }
2135 } // ERROR "missing return"
2136
2137 var _ = func() int {
2138         print(1)
2139 L:
2140         switch x.(type) {
2141         case int:
2142                 print(2)
2143                 for {
2144                         break L
2145                 }
2146         default:
2147                 return 4
2148         }
2149 } // ERROR "missing return"
2150
2151 // again, but without the leading print(1).
2152 // testing that everything works when the terminating statement is first.
2153
2154 var _ = func() int {
2155 } // ERROR "missing return"
2156
2157 // return is okay
2158 var _ = func() int {
2159         return 2
2160 }
2161
2162 // goto is okay
2163 var _ = func() int {
2164 L:
2165         goto L
2166 }
2167
2168 // panic is okay
2169 var _ = func() int {
2170         panic(2)
2171 }
2172
2173 // but only builtin panic
2174 var _ = func() int {
2175         var panic = func(int) {}
2176         panic(2)
2177 } // ERROR "missing return"
2178
2179 // block ending in terminating statement is okay
2180 var _ = func() int {
2181         {
2182                 return 2
2183         }
2184 }
2185
2186 // block ending in terminating statement is okay
2187 var _ = func() int {
2188 L:
2189         {
2190                 goto L
2191         }
2192 }
2193
2194 // block ending in terminating statement is okay
2195 var _ = func() int {
2196         {
2197                 panic(2)
2198         }
2199 }
2200
2201 // adding more code - even though it is dead - now requires a return
2202
2203 var _ = func() int {
2204         return 2
2205         print(3)
2206 } // ERROR "missing return"
2207
2208 var _ = func() int {
2209 L:
2210         goto L
2211         print(3)
2212 } // ERROR "missing return"
2213
2214 var _ = func() int {
2215         panic(2)
2216         print(3)
2217 } // ERROR "missing return"
2218
2219 var _ = func() int {
2220         {
2221                 return 2
2222                 print(3)
2223         }
2224 } // ERROR "missing return"
2225
2226 var _ = func() int {
2227 L:
2228         {
2229                 goto L
2230                 print(3)
2231         }
2232 } // ERROR "missing return"
2233
2234 var _ = func() int {
2235         {
2236                 panic(2)
2237                 print(3)
2238         }
2239 } // ERROR "missing return"
2240
2241 var _ = func() int {
2242         {
2243                 return 2
2244         }
2245         print(3)
2246 } // ERROR "missing return"
2247
2248 var _ = func() int {
2249 L:
2250         {
2251                 goto L
2252         }
2253         print(3)
2254 } // ERROR "missing return"
2255
2256 var _ = func() int {
2257         {
2258                 panic(2)
2259         }
2260         print(3)
2261 } // ERROR "missing return"
2262
2263 // even an empty dead block triggers the message, because it
2264 // becomes the final statement.
2265
2266 var _ = func() int {
2267         return 2
2268         {}
2269 } // ERROR "missing return"
2270
2271 var _ = func() int {
2272 L:
2273         goto L
2274         {}
2275 } // ERROR "missing return"
2276
2277 var _ = func() int {
2278         panic(2)
2279         {}
2280 } // ERROR "missing return"
2281
2282 var _ = func() int {
2283         {
2284                 return 2
2285                 {}
2286         }
2287 } // ERROR "missing return"
2288
2289 var _ = func() int {
2290 L:
2291         {
2292                 goto L
2293                 {}
2294         }
2295 } // ERROR "missing return"
2296
2297 var _ = func() int {
2298         {
2299                 panic(2)
2300                 {}
2301         }
2302 } // ERROR "missing return"
2303
2304 var _ = func() int {
2305         {
2306                 return 2
2307         }
2308         {}
2309 } // ERROR "missing return"
2310
2311 var _ = func() int {
2312 L:
2313         {
2314                 goto L
2315         }
2316         {}
2317 } // ERROR "missing return"
2318
2319 var _ = func() int {
2320         {
2321                 panic(2)
2322         }
2323         {}
2324 } // ERROR "missing return"
2325
2326 // if-else chain with final else and all terminating is okay
2327
2328 var _ = func() int {
2329         if x == nil {
2330                 panic(2)
2331         } else {
2332                 panic(3)
2333         }
2334 }
2335
2336 var _ = func() int {
2337 L:
2338         if x == nil {
2339                 panic(2)
2340         } else {
2341                 goto L
2342         }
2343 }
2344
2345 var _ = func() int {
2346 L:
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
2355         }
2356 }
2357
2358 // if-else chain missing final else is not okay, even if the
2359 // conditions cover every possible case.
2360
2361 var _ = func() int {
2362         if x == nil {
2363                 panic(2)
2364         } else if x != nil {
2365                 panic(3)
2366         }
2367 } // ERROR "missing return"
2368
2369 var _ = func() int {
2370         if x == nil {
2371                 panic(2)
2372         }
2373 } // ERROR "missing return"
2374
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)
2382         }
2383 } // ERROR "missing return"
2384
2385
2386 // for { loops that never break are okay.
2387
2388 var _ = func() int {
2389         for {}
2390 }
2391
2392 var _ = func() int {
2393         for {
2394                 for {
2395                         break
2396                 }
2397         }
2398 }
2399
2400 var _ = func() int {
2401         for {
2402                 L:
2403                 for {
2404                         break L
2405                 }
2406         }
2407 }
2408
2409 // for { loops that break are not okay.
2410
2411 var _ = func() int {
2412         for { break }
2413 } // ERROR "missing return"
2414
2415 var _ = func() int {
2416         for {
2417                 for {
2418                 }
2419                 break
2420         }
2421 } // ERROR "missing return"
2422
2423 var _ = func() int {
2424 L:
2425         for {
2426                 for {
2427                         break L
2428                 }
2429         }
2430 } // ERROR "missing return"
2431
2432 // if there's a condition - even "true" - the loops are no longer syntactically terminating
2433
2434 var _ = func() int {
2435         for x == nil {}
2436 } // ERROR "missing return"
2437
2438 var _ = func() int {
2439         for x == nil {
2440                 for {
2441                         break
2442                 }
2443         }
2444 } // ERROR "missing return"
2445
2446 var _ = func() int {
2447         for x == nil {
2448                 L:
2449                 for {
2450                         break L
2451                 }
2452         }       
2453 } // ERROR "missing return"
2454
2455 var _ = func() int {
2456         for true {}
2457 } // ERROR "missing return"
2458
2459 var _ = func() int {
2460         for true {
2461                 for {
2462                         break
2463                 }
2464         }
2465 } // ERROR "missing return"
2466
2467 var _ = func() int {
2468         for true {
2469                 L:
2470                 for {
2471                         break L
2472                 }
2473         }
2474 } // ERROR "missing return"
2475
2476 // select in which all cases terminate and none break are okay.
2477
2478 var _ = func() int {
2479         select{}
2480 }
2481
2482 var _ = func() int {
2483         select {
2484         case <-c:
2485                 print(2)
2486                 panic("abc")
2487         }
2488 }
2489
2490 var _ = func() int {
2491         select {
2492         case <-c:
2493                 print(2)
2494                 for{}
2495         }
2496 }
2497
2498 var _ = func() int {
2499 L:
2500         select {
2501         case <-c:
2502                 print(2)
2503                 panic("abc")
2504         case c <- 1:
2505                 print(2)
2506                 goto L
2507         }
2508 }
2509
2510 var _ = func() int {
2511         select {
2512         case <-c:
2513                 print(2)
2514                 panic("abc")
2515         default:
2516                 select{}
2517         }
2518 }
2519
2520 // if any cases don't terminate, the select isn't okay anymore
2521
2522 var _ = func() int {
2523         select {
2524         case <-c:
2525                 print(2)
2526         }
2527 } // ERROR "missing return"
2528
2529 var _ = func() int {
2530 L:
2531         select {
2532         case <-c:
2533                 print(2)
2534                 panic("abc")
2535                 goto L
2536         case c <- 1:
2537                 print(2)
2538         }
2539 } // ERROR "missing return"
2540
2541
2542 var _ = func() int {
2543         select {
2544         case <-c:
2545                 print(2)
2546                 panic("abc")
2547         default:
2548                 print(2)
2549         }
2550 } // ERROR "missing return"
2551
2552
2553 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
2554
2555 var _ = func() int {
2556         select{ default: break }
2557 } // ERROR "missing return"
2558
2559 var _ = func() int {
2560         select {
2561         case <-c:
2562                 print(2)
2563                 panic("abc")
2564                 break
2565         }
2566 } // ERROR "missing return"
2567
2568 var _ = func() int {
2569 L:
2570         select {
2571         case <-c:
2572                 print(2)
2573                 for{ break L }
2574         }
2575 } // ERROR "missing return"
2576
2577 var _ = func() int {
2578 L:
2579         select {
2580         case <-c:
2581                 print(2)
2582                 panic("abc")
2583         case c <- 1:
2584                 print(2)
2585                 break L
2586         }
2587 } // ERROR "missing return"
2588
2589 var _ = func() int {
2590         select {
2591         case <-c:
2592                 panic("abc")
2593         default:
2594                 select{}
2595                 break
2596         }
2597 } // ERROR "missing return"
2598
2599 // switch with default in which all cases terminate is okay
2600
2601 var _ = func() int {
2602         switch x {
2603         case 1:
2604                 print(2)
2605                 panic(3)
2606         default:
2607                 return 4
2608         }
2609 }
2610
2611 var _ = func() int {
2612         switch x {
2613         default:
2614                 return 4
2615         case 1:
2616                 print(2)
2617                 panic(3)
2618         }
2619 }
2620
2621 var _ = func() int {
2622         switch x {
2623         case 1:
2624                 print(2)
2625                 fallthrough
2626         default:
2627                 return 4
2628         }
2629 }
2630
2631 // if no default or some case doesn't terminate, switch is no longer okay
2632
2633 var _ = func() int {
2634         switch {
2635         }
2636 } // ERROR "missing return"
2637
2638
2639 var _ = func() int {
2640         switch x {
2641         case 1:
2642                 print(2)
2643                 panic(3)
2644         case 2:
2645                 return 4
2646         }
2647 } // ERROR "missing return"
2648
2649 var _ = func() int {
2650         switch x {
2651         case 2:
2652                 return 4
2653         case 1:
2654                 print(2)
2655                 panic(3)
2656         }
2657 } // ERROR "missing return"
2658
2659 var _ = func() int {
2660         switch x {
2661         case 1:
2662                 print(2)
2663                 fallthrough
2664         case 2:
2665                 return 4
2666         }
2667 } // ERROR "missing return"
2668
2669 var _ = func() int {
2670         switch x {
2671         case 1:
2672                 print(2)
2673                 panic(3)
2674         }
2675 } // ERROR "missing return"
2676
2677 // if any breaks refer to the switch, switch is no longer okay
2678
2679 var _ = func() int {
2680 L:
2681         switch x {
2682         case 1:
2683                 print(2)
2684                 panic(3)
2685                 break L
2686         default:
2687                 return 4
2688         }
2689 } // ERROR "missing return"
2690
2691 var _ = func() int {
2692         switch x {
2693         default:
2694                 return 4
2695                 break
2696         case 1:
2697                 print(2)
2698                 panic(3)
2699         }
2700 } // ERROR "missing return"
2701
2702 var _ = func() int {
2703 L:
2704         switch x {
2705         case 1:
2706                 print(2)
2707                 for {
2708                         break L
2709                 }
2710         default:
2711                 return 4
2712         }
2713 } // ERROR "missing return"
2714
2715 // type switch with default in which all cases terminate is okay
2716
2717 var _ = func() int {
2718         switch x.(type) {
2719         case int:
2720                 print(2)
2721                 panic(3)
2722         default:
2723                 return 4
2724         }
2725 }
2726
2727 var _ = func() int {
2728         switch x.(type) {
2729         default:
2730                 return 4
2731         case int:
2732                 print(2)
2733                 panic(3)
2734         }
2735 }
2736
2737 // if no default or some case doesn't terminate, switch is no longer okay
2738
2739 var _ = func() int {
2740         switch {
2741         }
2742 } // ERROR "missing return"
2743
2744
2745 var _ = func() int {
2746         switch x.(type) {
2747         case int:
2748                 print(2)
2749                 panic(3)
2750         case float64:
2751                 return 4
2752         }
2753 } // ERROR "missing return"
2754
2755 var _ = func() int {
2756         switch x.(type) {
2757         case float64:
2758                 return 4
2759         case int:
2760                 print(2)
2761                 panic(3)
2762         }
2763 } // ERROR "missing return"
2764
2765 var _ = func() int {
2766         switch x.(type) {
2767         case int:
2768                 print(2)
2769                 panic(3)
2770         }
2771 } // ERROR "missing return"
2772
2773 // if any breaks refer to the switch, switch is no longer okay
2774
2775 var _ = func() int {
2776 L:
2777         switch x.(type) {
2778         case int:
2779                 print(2)
2780                 panic(3)
2781                 break L
2782         default:
2783                 return 4
2784         }
2785 } // ERROR "missing return"
2786
2787 var _ = func() int {
2788         switch x.(type) {
2789         default:
2790                 return 4
2791                 break
2792         case int:
2793                 print(2)
2794                 panic(3)
2795         }
2796 } // ERROR "missing return"
2797
2798 var _ = func() int {
2799 L:
2800         switch x.(type) {
2801         case int:
2802                 print(2)
2803                 for {
2804                         break L
2805                 }
2806         default:
2807                 return 4
2808         }
2809 } // ERROR "missing return"
2810
2811 var _ = func() int {
2812         switch x.(type) {
2813         default:
2814                 return 4
2815         case int, float64:
2816                 print(2)
2817                 panic(3)
2818         }
2819 }
2820
2821 /**/