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