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"
283 } // ERROR "missing return"
286 // for { loops that never break are okay.
310 // for { loops that break are not okay.
315 } // ERROR "missing return"
323 } // ERROR "missing return"
332 } // ERROR "missing return"
334 // if there's a condition - even "true" - the loops are no longer syntactically terminating
339 } // ERROR "missing return"
347 } // ERROR "missing return"
356 } // ERROR "missing return"
361 } // ERROR "missing return"
369 } // ERROR "missing return"
378 } // ERROR "missing return"
380 // select in which all cases terminate and none break are okay.
429 // if any cases don't terminate, the select isn't okay anymore
437 } // ERROR "missing return"
450 } // ERROR "missing return"
462 } // ERROR "missing return"
465 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
469 select{ default: break }
470 } // ERROR "missing return"
480 } // ERROR "missing return"
490 } // ERROR "missing return"
503 } // ERROR "missing return"
515 } // ERROR "missing return"
517 // switch with default in which all cases terminate is okay
552 // if no default or some case doesn't terminate, switch is no longer okay
558 } // ERROR "missing return"
570 } // ERROR "missing return"
581 } // ERROR "missing return"
592 } // ERROR "missing return"
601 } // ERROR "missing return"
603 // if any breaks refer to the switch, switch is no longer okay
616 } // ERROR "missing return"
628 } // ERROR "missing return"
642 } // ERROR "missing return"
644 // type switch with default in which all cases terminate is okay
668 // if no default or some case doesn't terminate, switch is no longer okay
674 } // ERROR "missing return"
686 } // ERROR "missing return"
697 } // ERROR "missing return"
706 } // ERROR "missing return"
708 // if any breaks refer to the switch, switch is no longer okay
721 } // ERROR "missing return"
733 } // ERROR "missing return"
747 } // ERROR "missing return"
749 // again, but without the leading print(1).
750 // testing that everything works when the terminating statement is first.
753 } // ERROR "missing return"
771 // but only builtin panic
773 var panic = func(int) {}
775 } // ERROR "missing return"
777 // block ending in terminating statement is okay
784 // block ending in terminating statement is okay
792 // block ending in terminating statement is okay
799 // adding more code - even though it is dead - now requires a return
804 } // ERROR "missing return"
810 } // ERROR "missing return"
815 } // ERROR "missing return"
822 } // ERROR "missing return"
830 } // ERROR "missing return"
837 } // ERROR "missing return"
844 } // ERROR "missing return"
852 } // ERROR "missing return"
859 } // ERROR "missing return"
861 // even an empty dead block triggers the message, because it
862 // becomes the final statement.
867 } // ERROR "missing return"
873 } // ERROR "missing return"
878 } // ERROR "missing return"
885 } // ERROR "missing return"
893 } // ERROR "missing return"
900 } // ERROR "missing return"
907 } // ERROR "missing return"
915 } // ERROR "missing return"
922 } // ERROR "missing return"
924 // if-else chain with final else and all terminating is okay
956 // if-else chain missing final else is not okay, even if the
957 // conditions cover every possible case.
965 } // ERROR "missing return"
971 } // ERROR "missing return"
981 } // ERROR "missing return"
984 // for { loops that never break are okay.
1007 // for { loops that break are not okay.
1011 } // ERROR "missing return"
1019 } // ERROR "missing return"
1028 } // ERROR "missing return"
1030 // if there's a condition - even "true" - the loops are no longer syntactically terminating
1034 } // ERROR "missing return"
1042 } // ERROR "missing return"
1051 } // ERROR "missing return"
1055 } // ERROR "missing return"
1063 } // ERROR "missing return"
1072 } // ERROR "missing return"
1074 // select in which all cases terminate and none break are okay.
1118 // if any cases don't terminate, the select isn't okay anymore
1125 } // ERROR "missing return"
1137 } // ERROR "missing return"
1148 } // ERROR "missing return"
1151 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
1154 select{ default: break }
1155 } // ERROR "missing return"
1164 } // ERROR "missing return"
1173 } // ERROR "missing return"
1185 } // ERROR "missing return"
1195 } // ERROR "missing return"
1197 // switch with default in which all cases terminate is okay
1229 // if no default or some case doesn't terminate, switch is no longer okay
1234 } // ERROR "missing return"
1245 } // ERROR "missing return"
1255 } // ERROR "missing return"
1265 } // ERROR "missing return"
1273 } // ERROR "missing return"
1275 // if any breaks refer to the switch, switch is no longer okay
1287 } // ERROR "missing return"
1298 } // ERROR "missing return"
1311 } // ERROR "missing return"
1313 // type switch with default in which all cases terminate is okay
1335 // if no default or some case doesn't terminate, switch is no longer okay
1340 } // ERROR "missing return"
1351 } // ERROR "missing return"
1361 } // ERROR "missing return"
1369 } // ERROR "missing return"
1371 // if any breaks refer to the switch, switch is no longer okay
1383 } // ERROR "missing return"
1394 } // ERROR "missing return"
1407 } // ERROR "missing return"
1419 // again, with func literals
1421 var _
= func() int {
1422 } // ERROR "missing return"
1424 var _
= func() int {
1426 } // ERROR "missing return"
1429 var _
= func() int {
1435 var _
= func() int {
1442 var _
= func() int {
1447 // but only builtin panic
1448 var _
= func() int {
1449 var panic = func(int) {}
1452 } // ERROR "missing return"
1454 // block ending in terminating statement is okay
1455 var _
= func() int {
1462 // block ending in terminating statement is okay
1463 var _
= func() int {
1471 // block ending in terminating statement is okay
1472 var _
= func() int {
1479 // adding more code - even though it is dead - now requires a return
1481 var _
= func() int {
1485 } // ERROR "missing return"
1487 var _
= func() int {
1492 } // ERROR "missing return"
1494 var _
= func() int {
1498 } // ERROR "missing return"
1500 var _
= func() int {
1506 } // ERROR "missing return"
1508 var _
= func() int {
1515 } // ERROR "missing return"
1517 var _
= func() int {
1523 } // ERROR "missing return"
1525 var _
= func() int {
1531 } // ERROR "missing return"
1533 var _
= func() int {
1540 } // ERROR "missing return"
1542 var _
= func() int {
1548 } // ERROR "missing return"
1550 // even an empty dead block triggers the message, because it
1551 // becomes the final statement.
1553 var _
= func() int {
1557 } // ERROR "missing return"
1559 var _
= func() int {
1564 } // ERROR "missing return"
1566 var _
= func() int {
1570 } // ERROR "missing return"
1572 var _
= func() int {
1578 } // ERROR "missing return"
1580 var _
= func() int {
1587 } // ERROR "missing return"
1589 var _
= func() int {
1595 } // ERROR "missing return"
1597 var _
= func() int {
1603 } // ERROR "missing return"
1605 var _
= func() int {
1612 } // ERROR "missing return"
1614 var _
= func() int {
1620 } // ERROR "missing return"
1622 // if-else chain with final else and all terminating is okay
1624 var _
= func() int {
1633 var _
= func() int {
1643 var _
= func() int {
1657 // if-else chain missing final else is not okay, even if the
1658 // conditions cover every possible case.
1660 var _
= func() int {
1664 } else if x
!= nil {
1667 } // ERROR "missing return"
1669 var _
= func() int {
1674 } // ERROR "missing return"
1676 var _
= func() int {
1685 } // ERROR "missing return"
1688 // for { loops that never break are okay.
1690 var _
= func() int {
1695 var _
= func() int {
1703 var _
= func() int {
1712 // for { loops that break are not okay.
1714 var _
= func() int {
1717 } // ERROR "missing return"
1719 var _
= func() int {
1725 } // ERROR "missing return"
1727 var _
= func() int {
1734 } // ERROR "missing return"
1736 // if there's a condition - even "true" - the loops are no longer syntactically terminating
1738 var _
= func() int {
1741 } // ERROR "missing return"
1743 var _
= func() int {
1749 } // ERROR "missing return"
1751 var _
= func() int {
1758 } // ERROR "missing return"
1760 var _
= func() int {
1763 } // ERROR "missing return"
1765 var _
= func() int {
1771 } // ERROR "missing return"
1773 var _
= func() int {
1780 } // ERROR "missing return"
1782 // select in which all cases terminate and none break are okay.
1784 var _
= func() int {
1789 var _
= func() int {
1798 var _
= func() int {
1807 var _
= func() int {
1820 var _
= func() int {
1831 // if any cases don't terminate, the select isn't okay anymore
1833 var _
= func() int {
1839 } // ERROR "missing return"
1841 var _
= func() int {
1852 } // ERROR "missing return"
1855 var _
= func() int {
1864 } // ERROR "missing return"
1867 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
1869 var _
= func() int {
1871 select{ default: break }
1872 } // ERROR "missing return"
1874 var _
= func() int {
1882 } // ERROR "missing return"
1884 var _
= func() int {
1892 } // ERROR "missing return"
1894 var _
= func() int {
1905 } // ERROR "missing return"
1907 var _
= func() int {
1917 } // ERROR "missing return"
1919 // switch with default in which all cases terminate is okay
1921 var _
= func() int {
1932 var _
= func() int {
1943 var _
= func() int {
1954 // if no default or some case doesn't terminate, switch is no longer okay
1956 var _
= func() int {
1960 } // ERROR "missing return"
1963 var _
= func() int {
1972 } // ERROR "missing return"
1974 var _
= func() int {
1983 } // ERROR "missing return"
1985 var _
= func() int {
1994 } // ERROR "missing return"
1996 var _
= func() int {
2003 } // ERROR "missing return"
2005 // if any breaks refer to the switch, switch is no longer okay
2007 var _
= func() int {
2018 } // ERROR "missing return"
2020 var _
= func() int {
2030 } // ERROR "missing return"
2032 var _
= func() int {
2044 } // ERROR "missing return"
2046 // type switch with default in which all cases terminate is okay
2048 var _
= func() int {
2059 var _
= func() int {
2070 // if no default or some case doesn't terminate, switch is no longer okay
2072 var _
= func() int {
2076 } // ERROR "missing return"
2079 var _
= func() int {
2088 } // ERROR "missing return"
2090 var _
= func() int {
2099 } // ERROR "missing return"
2101 var _
= func() int {
2108 } // ERROR "missing return"
2110 // if any breaks refer to the switch, switch is no longer okay
2112 var _
= func() int {
2123 } // ERROR "missing return"
2125 var _
= func() int {
2135 } // ERROR "missing return"
2137 var _
= func() int {
2149 } // ERROR "missing return"
2151 // again, but without the leading print(1).
2152 // testing that everything works when the terminating statement is first.
2154 var _
= func() int {
2155 } // ERROR "missing return"
2158 var _
= func() int {
2163 var _
= func() int {
2169 var _
= func() int {
2173 // but only builtin panic
2174 var _
= func() int {
2175 var panic = func(int) {}
2177 } // ERROR "missing return"
2179 // block ending in terminating statement is okay
2180 var _
= func() int {
2186 // block ending in terminating statement is okay
2187 var _
= func() int {
2194 // block ending in terminating statement is okay
2195 var _
= func() int {
2201 // adding more code - even though it is dead - now requires a return
2203 var _
= func() int {
2206 } // ERROR "missing return"
2208 var _
= func() int {
2212 } // ERROR "missing return"
2214 var _
= func() int {
2217 } // ERROR "missing return"
2219 var _
= func() int {
2224 } // ERROR "missing return"
2226 var _
= func() int {
2232 } // ERROR "missing return"
2234 var _
= func() int {
2239 } // ERROR "missing return"
2241 var _
= func() int {
2246 } // ERROR "missing return"
2248 var _
= func() int {
2254 } // ERROR "missing return"
2256 var _
= func() int {
2261 } // ERROR "missing return"
2263 // even an empty dead block triggers the message, because it
2264 // becomes the final statement.
2266 var _
= func() int {
2269 } // ERROR "missing return"
2271 var _
= func() int {
2275 } // ERROR "missing return"
2277 var _
= func() int {
2280 } // ERROR "missing return"
2282 var _
= func() int {
2287 } // ERROR "missing return"
2289 var _
= func() int {
2295 } // ERROR "missing return"
2297 var _
= func() int {
2302 } // ERROR "missing return"
2304 var _
= func() int {
2309 } // ERROR "missing return"
2311 var _
= func() int {
2317 } // ERROR "missing return"
2319 var _
= func() int {
2324 } // ERROR "missing return"
2326 // if-else chain with final else and all terminating is okay
2328 var _
= func() int {
2336 var _
= func() int {
2345 var _
= func() int {
2358 // if-else chain missing final else is not okay, even if the
2359 // conditions cover every possible case.
2361 var _
= func() int {
2364 } else if x
!= nil {
2367 } // ERROR "missing return"
2369 var _
= func() int {
2373 } // ERROR "missing return"
2375 var _
= func() int {
2383 } // ERROR "missing return"
2386 // for { loops that never break are okay.
2388 var _
= func() int {
2392 var _
= func() int {
2400 var _
= func() int {
2409 // for { loops that break are not okay.
2411 var _
= func() int {
2413 } // ERROR "missing return"
2415 var _
= func() int {
2421 } // ERROR "missing return"
2423 var _
= func() int {
2430 } // ERROR "missing return"
2432 // if there's a condition - even "true" - the loops are no longer syntactically terminating
2434 var _
= func() int {
2436 } // ERROR "missing return"
2438 var _
= func() int {
2444 } // ERROR "missing return"
2446 var _
= func() int {
2453 } // ERROR "missing return"
2455 var _
= func() int {
2457 } // ERROR "missing return"
2459 var _
= func() int {
2465 } // ERROR "missing return"
2467 var _
= func() int {
2474 } // ERROR "missing return"
2476 // select in which all cases terminate and none break are okay.
2478 var _
= func() int {
2482 var _
= func() int {
2490 var _
= func() int {
2498 var _
= func() int {
2510 var _
= func() int {
2520 // if any cases don't terminate, the select isn't okay anymore
2522 var _
= func() int {
2527 } // ERROR "missing return"
2529 var _
= func() int {
2539 } // ERROR "missing return"
2542 var _
= func() int {
2550 } // ERROR "missing return"
2553 // if any breaks refer to the select, the select isn't okay anymore, even if they're dead
2555 var _
= func() int {
2556 select{ default: break }
2557 } // ERROR "missing return"
2559 var _
= func() int {
2566 } // ERROR "missing return"
2568 var _
= func() int {
2575 } // ERROR "missing return"
2577 var _
= func() int {
2587 } // ERROR "missing return"
2589 var _
= func() int {
2597 } // ERROR "missing return"
2599 // switch with default in which all cases terminate is okay
2601 var _
= func() int {
2611 var _
= func() int {
2621 var _
= func() int {
2631 // if no default or some case doesn't terminate, switch is no longer okay
2633 var _
= func() int {
2636 } // ERROR "missing return"
2639 var _
= func() int {
2647 } // ERROR "missing return"
2649 var _
= func() int {
2657 } // ERROR "missing return"
2659 var _
= func() int {
2667 } // ERROR "missing return"
2669 var _
= func() int {
2675 } // ERROR "missing return"
2677 // if any breaks refer to the switch, switch is no longer okay
2679 var _
= func() int {
2689 } // ERROR "missing return"
2691 var _
= func() int {
2700 } // ERROR "missing return"
2702 var _
= func() int {
2713 } // ERROR "missing return"
2715 // type switch with default in which all cases terminate is okay
2717 var _
= func() int {
2727 var _
= func() int {
2737 // if no default or some case doesn't terminate, switch is no longer okay
2739 var _
= func() int {
2742 } // ERROR "missing return"
2745 var _
= func() int {
2753 } // ERROR "missing return"
2755 var _
= func() int {
2763 } // ERROR "missing return"
2765 var _
= func() int {
2771 } // ERROR "missing return"
2773 // if any breaks refer to the switch, switch is no longer okay
2775 var _
= func() int {
2785 } // ERROR "missing return"
2787 var _
= func() int {
2796 } // ERROR "missing return"
2798 var _
= func() int {
2809 } // ERROR "missing return"
2811 var _
= func() int {