• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang %s -fsyntax-only -Wignored-qualifiers -Wno-error=return-type -Xclang -verify -fblocks -Wno-unreachable-code -Wno-unused-value
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.
t14()6 int t14() {
7   return; // expected-warning {{non-void function 't14' should return a value}}
8 }
9 
t15()10 void t15() {
11   return 1; // expected-warning {{void function 't15' should not return a value}}
12 }
13 
14 int unknown();
15 
test0()16 void test0() {
17 }
18 
test1()19 int test1() {
20 } // expected-warning {{control reaches end of non-void function}}
21 
test2()22 int test2() {
23   a: goto a;
24 }
25 
test3()26 int test3() {
27   goto a;
28   a: ;
29 } // expected-warning {{control reaches end of non-void function}}
30 
31 
halt()32 void halt() {
33   a: goto a;
34 }
35 
36 void halt2() __attribute__((noreturn));
37 
test4()38 int test4() {
39   halt2();
40 }
41 
test5()42 int test5() {
43   halt2(), (void)1;
44 }
45 
test6()46 int test6() {
47   1, halt2();
48 }
49 
50 int j;
unknown_nohalt()51 int unknown_nohalt() {
52   return j;
53 }
54 
test7()55 int test7() {
56   unknown();
57 } // expected-warning {{control reaches end of non-void function}}
58 
test8()59 int test8() {
60   (void)(1 + unknown());
61 } // expected-warning {{control reaches end of non-void function}}
62 
63 int halt3() __attribute__((noreturn));
64 
test9()65 int test9() {
66   (void)(halt3() + unknown());
67 }
68 
test10()69 int test10() {
70   (void)(unknown() || halt3());
71 } // expected-warning {{control may reach end of non-void function}}
72 
test11()73 int test11() {
74   (void)(unknown() && halt3());
75 } // expected-warning {{control may reach end of non-void function}}
76 
test12()77 int test12() {
78   (void)(halt3() || unknown());
79 }
80 
test13()81 int test13() {
82   (void)(halt3() && unknown());
83 }
84 
test14()85 int test14() {
86   (void)(1 || unknown());
87 } // expected-warning {{control reaches end of non-void function}}
88 
test15()89 int test15() {
90   (void)(0 || unknown());
91 } // expected-warning {{control reaches end of non-void function}}
92 
test16()93 int test16() {
94   (void)(0 && unknown());
95 } // expected-warning {{control reaches end of non-void function}}
96 
test17()97 int test17() {
98   (void)(1 && unknown());
99 } // expected-warning {{control reaches end of non-void function}}
100 
test18()101 int test18() {
102   (void)(unknown_nohalt() && halt3());
103 } // expected-warning {{control may reach end of non-void function}}
104 
test19()105 int test19() {
106   (void)(unknown_nohalt() && unknown());
107 } // expected-warning {{control reaches end of non-void function}}
108 
test20()109 int 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 
test21()117 int test21() {
118   int i;
119   if (i)
120     return 0;
121   else if (1)
122     return 2;
123 }
124 
test22()125 int test22() {
126   int i;
127   switch (i) default: ;
128 } // expected-warning {{control reaches end of non-void function}}
129 
test23()130 int 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 
test24()140 int 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 
test25()152 int test25() {
153   1 ? halt3() : unknown();
154 }
155 
test26()156 int test26() {
157   0 ? halt3() : unknown();
158 } // expected-warning {{control reaches end of non-void function}}
159 
160 int j;
161 void (*fptr)() __attribute__((noreturn));
test27()162 int 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
192 void test28() __attribute__((noreturn));
test28(x)193 void test28(x) { while (1) { } }
194 
195 void exit(int);
test29()196 int test29() {
197   exit(1);
198 }
199 
200 #include <setjmp.h>
201 jmp_buf test30_j;
test30()202 int test30() {
203   if (j)
204     longjmp(test30_j, 1);
205   else
206 #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
207     longjmp(test30_j, 2);
208 #else
209     _longjmp(test30_j, 1);
210 #endif
211 }
212 
213 typedef void test31_t(int status);
214 void test31(test31_t *callback __attribute__((noreturn)));
215 
test32()216 void test32() {
217   ^ (void) { while (1) { } }();
218   ^ (void) { if (j) while (1) { } }();
219   while (1) { }
220 }
221 
test33()222 void test33() {
223   if (j) while (1) { }
224 }
225 
226 // Test that 'static inline' functions are only analyzed for CFG-based warnings
227 // when they are used.
si_has_missing_return()228 static inline int si_has_missing_return() {} // expected-warning{{control reaches end of non-void function}}
si_has_missing_return_2()229 static inline int si_has_missing_return_2() {}; // expected-warning{{control reaches end of non-void function}}
230 static inline int si_forward();
si_has_missing_return_3(int x)231 static inline int si_has_missing_return_3(int x) {
232   if (x)
233    return si_has_missing_return_3(x+1);
234 } // expected-warning{{control may reach end of non-void function}}
235 
test_static_inline(int x)236 int test_static_inline(int x) {
237   si_forward();
238   return x ? si_has_missing_return_2() : si_has_missing_return_3(x);
239 }
si_forward()240 static inline int si_forward() {} // expected-warning{{control reaches end of non-void function}}
241 
242 // Test warnings on ignored qualifiers on return types.
243 const int ignored_c_quals(); // expected-warning{{'const' type qualifier on return type has no effect}}
244 const volatile int ignored_cv_quals(); // expected-warning{{'const volatile' type qualifiers on return type have no effect}}
245 char* const volatile restrict ignored_cvr_quals(); // expected-warning{{'const volatile restrict' type qualifiers on return type have no effect}}
246 
247 // Test that for switch(enum) that if the switch statement covers all the cases
248 // that we don't consider that for -Wreturn-type.
249 enum Cases { C1, C2, C3, C4 };
test_enum_cases(enum Cases C)250 int test_enum_cases(enum Cases C) {
251   switch (C) {
252   case C1: return 1;
253   case C2: return 2;
254   case C4: return 3;
255   case C3: return 4;
256   }
257 } // no-warning
258 
259 // PR12318 - Don't give a may reach end of non-void function warning.
test34(int x)260 int test34(int x) {
261   if (x == 1) {
262     return 3;
263   } else if ( x == 2 || 1) {
264     return 5;
265   }
266 }
267