3 // Copyright 2013 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
7 // Test compiler diagnosis of function missing return statements.
8 // See issue 65 and golang.org/s/go11return.
17 func external() int // ok
20 } // ERROR "missing return"
24 } // ERROR "missing return"
45 // but only builtin panic
47 var panic = func(int) {}
50 } // ERROR "missing return"
52 // block ending in terminating statement is okay
60 // block ending in terminating statement is okay
69 // block ending in terminating statement is okay
77 // adding more code - even though it is dead - now requires a return
83 } // ERROR "missing return"
90 } // ERROR "missing return"
96 } // ERROR "missing return"
104 } // ERROR "missing return"
113 } // ERROR "missing return"
121 } // ERROR "missing return"
129 } // ERROR "missing return"
138 } // ERROR "missing return"
146 } // ERROR "missing return"
148 // even an empty dead block triggers the message, because it
149 // becomes the final statement.
155 } // ERROR "missing return"
162 } // ERROR "missing return"
168 } // ERROR "missing return"
176 } // ERROR "missing return"
185 } // ERROR "missing return"
193 } // ERROR "missing return"
201 } // ERROR "missing return"
210 } // ERROR "missing return"
218 } // ERROR "missing return"
220 // if-else chain with final else and all terminating is okay
255 // if-else chain missing final else is not okay, even if the
256 // conditions cover every possible case.
265 } // ERROR "missing return"
272 } // ERROR "missing return"
284 } // ERROR "missing return"
287 // for { loops that never break are okay.
311 // for { loops that break are not okay.
316 } // ERROR "missing return"
324 } // ERROR "missing return"
333 } // ERROR "missing return"
335 // if there's a condition - even "true" - the loops are no longer syntactically terminating
340 } // ERROR "missing return"
348 } // ERROR "missing return"
357 } // ERROR "missing return"
362 } // ERROR "missing return"
370 } // ERROR "missing return"
379 } // ERROR "missing return"
381 // select in which all cases terminate and none break are okay.
430 // if any cases don't terminate, the select isn't okay anymore
438 } // ERROR "missing return"
451 } // ERROR "missing return"
463 } // ERROR "missing return"
466 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
470 select{ default: break }
471 } // ERROR "missing return"
481 } // ERROR "missing return"
491 } // ERROR "missing return"
504 } // ERROR "missing return"
516 } // ERROR "missing return"
518 // switch with default in which all cases terminate is okay
553 // if no default or some case doesn't terminate, switch is no longer okay
559 } // ERROR "missing return"
571 } // ERROR "missing return"
582 } // ERROR "missing return"
593 } // ERROR "missing return"
602 } // ERROR "missing return"
604 // if any breaks refer to the switch, switch is no longer okay
617 } // ERROR "missing return"
629 } // ERROR "missing return"
643 } // ERROR "missing return"
645 // type switch with default in which all cases terminate is okay
669 // if no default or some case doesn't terminate, switch is no longer okay
675 } // ERROR "missing return"
687 } // ERROR "missing return"
698 } // ERROR "missing return"
707 } // ERROR "missing return"
709 // if any breaks refer to the switch, switch is no longer okay
722 } // ERROR "missing return"
734 } // ERROR "missing return"
748 } // ERROR "missing return"
750 // again, but without the leading print(1).
751 // testing that everything works when the terminating statement is first.
754 } // ERROR "missing return"
772 // but only builtin panic
774 var panic = func(int) {}
776 } // ERROR "missing return"
778 // block ending in terminating statement is okay
785 // block ending in terminating statement is okay
793 // block ending in terminating statement is okay
800 // adding more code - even though it is dead - now requires a return
805 } // ERROR "missing return"
811 } // ERROR "missing return"
816 } // ERROR "missing return"
823 } // ERROR "missing return"
831 } // ERROR "missing return"
838 } // ERROR "missing return"
845 } // ERROR "missing return"
853 } // ERROR "missing return"
860 } // ERROR "missing return"
862 // even an empty dead block triggers the message, because it
863 // becomes the final statement.
868 } // ERROR "missing return"
874 } // ERROR "missing return"
879 } // ERROR "missing return"
886 } // ERROR "missing return"
894 } // ERROR "missing return"
901 } // ERROR "missing return"
908 } // ERROR "missing return"
916 } // ERROR "missing return"
923 } // ERROR "missing return"
925 // if-else chain with final else and all terminating is okay
957 // if-else chain missing final else is not okay, even if the
958 // conditions cover every possible case.
966 } // ERROR "missing return"
972 } // ERROR "missing return"
983 } // ERROR "missing return"
986 // for { loops that never break are okay.
1009 // for { loops that break are not okay.
1013 } // ERROR "missing return"
1021 } // ERROR "missing return"
1030 } // ERROR "missing return"
1032 // if there's a condition - even "true" - the loops are no longer syntactically terminating
1036 } // ERROR "missing return"
1044 } // ERROR "missing return"
1053 } // ERROR "missing return"
1057 } // ERROR "missing return"
1065 } // ERROR "missing return"
1074 } // ERROR "missing return"
1076 // select in which all cases terminate and none break are okay.
1120 // if any cases don't terminate, the select isn't okay anymore
1127 } // ERROR "missing return"
1139 } // ERROR "missing return"
1150 } // ERROR "missing return"
1153 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
1156 select{ default: break }
1157 } // ERROR "missing return"
1166 } // ERROR "missing return"
1175 } // ERROR "missing return"
1187 } // ERROR "missing return"
1197 } // ERROR "missing return"
1199 // switch with default in which all cases terminate is okay
1231 // if no default or some case doesn't terminate, switch is no longer okay
1236 } // ERROR "missing return"
1247 } // ERROR "missing return"
1257 } // ERROR "missing return"
1267 } // ERROR "missing return"
1275 } // ERROR "missing return"
1277 // if any breaks refer to the switch, switch is no longer okay
1289 } // ERROR "missing return"
1300 } // ERROR "missing return"
1313 } // ERROR "missing return"
1315 // type switch with default in which all cases terminate is okay
1337 // if no default or some case doesn't terminate, switch is no longer okay
1342 } // ERROR "missing return"
1353 } // ERROR "missing return"
1363 } // ERROR "missing return"
1371 } // ERROR "missing return"
1373 // if any breaks refer to the switch, switch is no longer okay
1385 } // ERROR "missing return"
1396 } // ERROR "missing return"
1409 } // ERROR "missing return"
1411 // again, with func literals
1413 var _ = func() int {
1414 } // ERROR "missing return"
1416 var _ = func() int {
1418 } // ERROR "missing return"
1421 var _ = func() int {
1427 var _ = func() int {
1434 var _ = func() int {
1439 // but only builtin panic
1440 var _ = func() int {
1441 var panic = func(int) {}
1444 } // ERROR "missing return"
1446 // block ending in terminating statement is okay
1447 var _ = func() int {
1454 // block ending in terminating statement is okay
1455 var _ = func() int {
1463 // block ending in terminating statement is okay
1464 var _ = func() int {
1471 // adding more code - even though it is dead - now requires a return
1473 var _ = func() int {
1477 } // ERROR "missing return"
1479 var _ = func() int {
1484 } // ERROR "missing return"
1486 var _ = func() int {
1490 } // ERROR "missing return"
1492 var _ = func() int {
1498 } // ERROR "missing return"
1500 var _ = func() int {
1507 } // ERROR "missing return"
1509 var _ = func() int {
1515 } // ERROR "missing return"
1517 var _ = func() int {
1523 } // ERROR "missing return"
1525 var _ = func() int {
1532 } // ERROR "missing return"
1534 var _ = func() int {
1540 } // ERROR "missing return"
1542 // even an empty dead block triggers the message, because it
1543 // becomes the final statement.
1545 var _ = func() int {
1549 } // ERROR "missing return"
1551 var _ = func() int {
1556 } // ERROR "missing return"
1558 var _ = func() int {
1562 } // ERROR "missing return"
1564 var _ = func() int {
1570 } // ERROR "missing return"
1572 var _ = func() int {
1579 } // ERROR "missing return"
1581 var _ = func() int {
1587 } // ERROR "missing return"
1589 var _ = func() int {
1595 } // ERROR "missing return"
1597 var _ = func() int {
1604 } // ERROR "missing return"
1606 var _ = func() int {
1612 } // ERROR "missing return"
1614 // if-else chain with final else and all terminating is okay
1616 var _ = func() int {
1625 var _ = func() int {
1635 var _ = func() int {
1649 // if-else chain missing final else is not okay, even if the
1650 // conditions cover every possible case.
1652 var _ = func() int {
1656 } else if x != nil {
1659 } // ERROR "missing return"
1661 var _ = func() int {
1666 } // ERROR "missing return"
1668 var _ = func() int {
1678 } // ERROR "missing return"
1681 // for { loops that never break are okay.
1683 var _ = func() int {
1688 var _ = func() int {
1696 var _ = func() int {
1705 // for { loops that break are not okay.
1707 var _ = func() int {
1710 } // ERROR "missing return"
1712 var _ = func() int {
1718 } // ERROR "missing return"
1720 var _ = func() int {
1727 } // ERROR "missing return"
1729 // if there's a condition - even "true" - the loops are no longer syntactically terminating
1731 var _ = func() int {
1734 } // ERROR "missing return"
1736 var _ = func() int {
1742 } // ERROR "missing return"
1744 var _ = func() int {
1751 } // ERROR "missing return"
1753 var _ = func() int {
1756 } // ERROR "missing return"
1758 var _ = func() int {
1764 } // ERROR "missing return"
1766 var _ = func() int {
1773 } // ERROR "missing return"
1775 // select in which all cases terminate and none break are okay.
1777 var _ = func() int {
1782 var _ = func() int {
1791 var _ = func() int {
1800 var _ = func() int {
1813 var _ = func() int {
1824 // if any cases don't terminate, the select isn't okay anymore
1826 var _ = func() int {
1832 } // ERROR "missing return"
1834 var _ = func() int {
1845 } // ERROR "missing return"
1848 var _ = func() int {
1857 } // ERROR "missing return"
1860 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
1862 var _ = func() int {
1864 select{ default: break }
1865 } // ERROR "missing return"
1867 var _ = func() int {
1875 } // ERROR "missing return"
1877 var _ = func() int {
1885 } // ERROR "missing return"
1887 var _ = func() int {
1898 } // ERROR "missing return"
1900 var _ = func() int {
1910 } // ERROR "missing return"
1912 // switch with default in which all cases terminate is okay
1914 var _ = func() int {
1925 var _ = func() int {
1936 var _ = func() int {
1947 // if no default or some case doesn't terminate, switch is no longer okay
1949 var _ = func() int {
1953 } // ERROR "missing return"
1956 var _ = func() int {
1965 } // ERROR "missing return"
1967 var _ = func() int {
1976 } // ERROR "missing return"
1978 var _ = func() int {
1987 } // ERROR "missing return"
1989 var _ = func() int {
1996 } // ERROR "missing return"
1998 // if any breaks refer to the switch, switch is no longer okay
2000 var _ = func() int {
2011 } // ERROR "missing return"
2013 var _ = func() int {
2023 } // ERROR "missing return"
2025 var _ = func() int {
2037 } // ERROR "missing return"
2039 // type switch with default in which all cases terminate is okay
2041 var _ = func() int {
2052 var _ = func() int {
2063 // if no default or some case doesn't terminate, switch is no longer okay
2065 var _ = func() int {
2069 } // ERROR "missing return"
2072 var _ = func() int {
2081 } // ERROR "missing return"
2083 var _ = func() int {
2092 } // ERROR "missing return"
2094 var _ = func() int {
2101 } // ERROR "missing return"
2103 // if any breaks refer to the switch, switch is no longer okay
2105 var _ = func() int {
2116 } // ERROR "missing return"
2118 var _ = func() int {
2128 } // ERROR "missing return"
2130 var _ = func() int {
2142 } // ERROR "missing return"
2144 // again, but without the leading print(1).
2145 // testing that everything works when the terminating statement is first.
2147 var _ = func() int {
2148 } // ERROR "missing return"
2151 var _ = func() int {
2156 var _ = func() int {
2162 var _ = func() int {
2166 // but only builtin panic
2167 var _ = func() int {
2168 var panic = func(int) {}
2170 } // ERROR "missing return"
2172 // block ending in terminating statement is okay
2173 var _ = func() int {
2179 // block ending in terminating statement is okay
2180 var _ = func() int {
2187 // block ending in terminating statement is okay
2188 var _ = func() int {
2194 // adding more code - even though it is dead - now requires a return
2196 var _ = func() int {
2199 } // ERROR "missing return"
2201 var _ = func() int {
2205 } // ERROR "missing return"
2207 var _ = func() int {
2210 } // ERROR "missing return"
2212 var _ = func() int {
2217 } // ERROR "missing return"
2219 var _ = func() int {
2225 } // ERROR "missing return"
2227 var _ = func() int {
2232 } // ERROR "missing return"
2234 var _ = func() int {
2239 } // ERROR "missing return"
2241 var _ = func() int {
2247 } // ERROR "missing return"
2249 var _ = func() int {
2254 } // ERROR "missing return"
2256 // even an empty dead block triggers the message, because it
2257 // becomes the final statement.
2259 var _ = func() int {
2262 } // ERROR "missing return"
2264 var _ = func() int {
2268 } // ERROR "missing return"
2270 var _ = func() int {
2273 } // ERROR "missing return"
2275 var _ = func() int {
2280 } // ERROR "missing return"
2282 var _ = func() int {
2288 } // ERROR "missing return"
2290 var _ = func() int {
2295 } // ERROR "missing return"
2297 var _ = func() int {
2302 } // ERROR "missing return"
2304 var _ = func() int {
2310 } // ERROR "missing return"
2312 var _ = func() int {
2317 } // ERROR "missing return"
2319 // if-else chain with final else and all terminating is okay
2321 var _ = func() int {
2329 var _ = func() int {
2338 var _ = func() int {
2351 // if-else chain missing final else is not okay, even if the
2352 // conditions cover every possible case.
2354 var _ = func() int {
2357 } else if x != nil {
2360 } // ERROR "missing return"
2362 var _ = func() int {
2366 } // ERROR "missing return"
2368 var _ = func() int {
2377 } // ERROR "missing return"
2380 // for { loops that never break are okay.
2382 var _ = func() int {
2386 var _ = func() int {
2394 var _ = func() int {
2403 // for { loops that break are not okay.
2405 var _ = func() int {
2407 } // ERROR "missing return"
2409 var _ = func() int {
2415 } // ERROR "missing return"
2417 var _ = func() int {
2424 } // ERROR "missing return"
2426 // if there's a condition - even "true" - the loops are no longer syntactically terminating
2428 var _ = func() int {
2430 } // ERROR "missing return"
2432 var _ = func() int {
2438 } // ERROR "missing return"
2440 var _ = func() int {
2447 } // ERROR "missing return"
2449 var _ = func() int {
2451 } // ERROR "missing return"
2453 var _ = func() int {
2459 } // ERROR "missing return"
2461 var _ = func() int {
2468 } // ERROR "missing return"
2470 // select in which all cases terminate and none break are okay.
2472 var _ = func() int {
2476 var _ = func() int {
2484 var _ = func() int {
2492 var _ = func() int {
2504 var _ = func() int {
2514 // if any cases don't terminate, the select isn't okay anymore
2516 var _ = func() int {
2521 } // ERROR "missing return"
2523 var _ = func() int {
2533 } // ERROR "missing return"
2536 var _ = func() int {
2544 } // ERROR "missing return"
2547 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
2549 var _ = func() int {
2550 select{ default: break }
2551 } // ERROR "missing return"
2553 var _ = func() int {
2560 } // ERROR "missing return"
2562 var _ = func() int {
2569 } // ERROR "missing return"
2571 var _ = func() int {
2581 } // ERROR "missing return"
2583 var _ = func() int {
2591 } // ERROR "missing return"
2593 // switch with default in which all cases terminate is okay
2595 var _ = func() int {
2605 var _ = func() int {
2615 var _ = func() int {
2625 // if no default or some case doesn't terminate, switch is no longer okay
2627 var _ = func() int {
2630 } // ERROR "missing return"
2633 var _ = func() int {
2641 } // ERROR "missing return"
2643 var _ = func() int {
2651 } // ERROR "missing return"
2653 var _ = func() int {
2661 } // ERROR "missing return"
2663 var _ = func() int {
2669 } // ERROR "missing return"
2671 // if any breaks refer to the switch, switch is no longer okay
2673 var _ = func() int {
2683 } // ERROR "missing return"
2685 var _ = func() int {
2694 } // ERROR "missing return"
2696 var _ = func() int {
2707 } // ERROR "missing return"
2709 // type switch with default in which all cases terminate is okay
2711 var _ = func() int {
2721 var _ = func() int {
2731 // if no default or some case doesn't terminate, switch is no longer okay
2733 var _ = func() int {
2736 } // ERROR "missing return"
2739 var _ = func() int {
2747 } // ERROR "missing return"
2749 var _ = func() int {
2757 } // ERROR "missing return"
2759 var _ = func() int {
2765 } // ERROR "missing return"
2767 // if any breaks refer to the switch, switch is no longer okay
2769 var _ = func() int {
2779 } // ERROR "missing return"
2781 var _ = func() int {
2790 } // ERROR "missing return"
2792 var _ = func() int {
2803 } // ERROR "missing return"