return.c revision 4d9d51ae3b868268082f94d84d0dff4c0b1ad435
1// RUN: clang-cc %s -fsyntax-only -verify 2 3// clang emits the following warning by default. 4// With GCC, -pedantic, -Wreturn-type or -Wall are required to produce the 5// following warning. 6int t14() { 7 return; // expected-warning {{non-void function 't14' should return a value}} 8} 9 10void t15() { 11 return 1; // expected-warning {{void function 't15' should not return a value}} 12} 13 14int unknown(); 15 16void test0() { 17} 18 19int test1() { 20} // expected-warning {{control reaches end of non-void function}} 21 22int test2() { 23 a: goto a; 24} 25 26int test3() { 27 goto a; 28 a: ; 29} // expected-warning {{control reaches end of non-void function}} 30 31 32void halt() { 33 a: goto a; 34} 35 36void halt2() __attribute__((noreturn)); 37 38int test4() { 39 halt2(); 40} 41 42int test5() { 43 halt2(), (void)1; 44} 45 46int test6() { 47 1, halt2(); 48} 49 50int j; 51int unknown_nohalt() { 52 return j; 53} 54 55int test7() { 56 unknown(); 57} // expected-warning {{control reaches end of non-void function}} 58 59int test8() { 60 (void)(1 + unknown()); 61} // expected-warning {{control reaches end of non-void function}} 62 63int halt3() __attribute__((noreturn)); 64 65int test9() { 66 (void)(halt3() + unknown()); 67} 68 69int test10() { 70 (void)(unknown() || halt3()); 71} // expected-warning {{control may reach end of non-void function}} 72 73int test11() { 74 (void)(unknown() && halt3()); 75} // expected-warning {{control may reach end of non-void function}} 76 77int test12() { 78 (void)(halt3() || unknown()); 79} 80 81int test13() { 82 (void)(halt3() && unknown()); 83} 84 85int test14() { 86 (void)(1 || unknown()); 87} // expected-warning {{control reaches end of non-void function}} 88 89int test15() { 90 (void)(0 || unknown()); 91} // expected-warning {{control reaches end of non-void function}} 92 93int test16() { 94 (void)(0 && unknown()); 95} // expected-warning {{control reaches end of non-void function}} 96 97int test17() { 98 (void)(1 && unknown()); 99} // expected-warning {{control reaches end of non-void function}} 100 101int test18() { 102 (void)(unknown_nohalt() && halt3()); 103} // expected-warning {{control may reach end of non-void function}} 104 105int test19() { 106 (void)(unknown_nohalt() && unknown()); 107} // expected-warning {{control reaches end of non-void function}} 108 109int test20() { 110 int i; 111 if (i) 112 return 0; 113 else if (0) 114 return 2; 115} // expected-warning {{control may reach end of non-void function}} 116 117int test21() { 118 int i; 119 if (i) 120 return 0; 121 else if (1) 122 return 2; 123} 124 125int test22() { 126 int i; 127 switch (i) default: ; 128} // expected-warning {{control reaches end of non-void function}} 129 130int test23() { 131 int i; 132 switch (i) { 133 case 0: 134 return 0; 135 case 2: 136 return 2; 137 } 138} // expected-warning {{control may reach end of non-void function}} 139 140int test24() { 141 int i; 142 switch (i) { 143 case 0: 144 return 0; 145 case 2: 146 return 2; 147 default: 148 return -1; 149 } 150} 151 152int test25() { 153 1 ? halt3() : unknown(); 154} 155 156int test26() { 157 0 ? halt3() : unknown(); 158} // expected-warning {{control reaches end of non-void function}} 159 160int j; 161void (*fptr)() __attribute__((noreturn)); 162int test27() { 163 switch (j) { 164 case 1: 165 do { } while (1); 166 break; 167 case 2: 168 for (;;) ; 169 break; 170 case 3: 171 for (;1;) ; 172 for (;0;) { 173 goto done; 174 } 175 return 1; 176 case 4: 177 while (0) { goto done; } 178 return 1; 179 case 5: 180 while (1) { return 1; } 181 break; 182 case 6: 183 fptr(); 184 break; 185 default: 186 return 1; 187 } 188 done: ; 189} 190 191// PR4624 192void test28() __attribute__((noreturn)); 193void test28(x) { while (1) { } } 194 195void exit(int); 196int test29() { 197 exit(1); 198} 199 200#include <setjmp.h> 201jmp_buf test30_j; 202int test30() { 203 if (j) 204 longjmp(test30_j, 1); 205 else 206 _longjmp(test30_j, 1); 207} 208 209typedef void test31_t(int status); 210void test31(test31_t *callback __attribute__((noreturn))); 211 212void test32() { 213 ^ (void) { while (1) { } }(); 214 ^ (void) { if (j) while (1) { } }(); 215 while (1) { } 216} 217 218void test33() { 219 if (j) while (1) { } 220} 221