xref: /aosp_15_r20/external/clang/test/Sema/warn-unreachable.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks -Wunreachable-code-aggressive -Wno-unused-value -Wno-covered-switch-default -I %S/Inputs
2*67e74705SXin Li 
3*67e74705SXin Li #include "warn-unreachable.h"
4*67e74705SXin Li 
5*67e74705SXin Li int halt() __attribute__((noreturn));
6*67e74705SXin Li int live();
7*67e74705SXin Li int dead();
8*67e74705SXin Li 
test1()9*67e74705SXin Li void test1() {
10*67e74705SXin Li   goto c;
11*67e74705SXin Li   d:
12*67e74705SXin Li   goto e;       // expected-warning {{will never be executed}}
13*67e74705SXin Li   c: ;
14*67e74705SXin Li   int i;
15*67e74705SXin Li   return;
16*67e74705SXin Li   goto b;        // expected-warning {{will never be executed}}
17*67e74705SXin Li   goto a;        // expected-warning {{will never be executed}}
18*67e74705SXin Li   b:
19*67e74705SXin Li   i = 1;
20*67e74705SXin Li   a:
21*67e74705SXin Li   i = 2;
22*67e74705SXin Li   goto f;
23*67e74705SXin Li   e:
24*67e74705SXin Li   goto d;
25*67e74705SXin Li   f: ;
26*67e74705SXin Li }
27*67e74705SXin Li 
test2()28*67e74705SXin Li void test2() {
29*67e74705SXin Li   int i;
30*67e74705SXin Li   switch (live()) {
31*67e74705SXin Li   case 1:
32*67e74705SXin Li     halt(),
33*67e74705SXin Li       dead();   // expected-warning {{will never be executed}}
34*67e74705SXin Li 
35*67e74705SXin Li   case 2:
36*67e74705SXin Li     live(), halt(),
37*67e74705SXin Li       dead();   // expected-warning {{will never be executed}}
38*67e74705SXin Li 
39*67e74705SXin Li   case 3:
40*67e74705SXin Li   live()
41*67e74705SXin Li     +           // expected-warning {{will never be executed}}
42*67e74705SXin Li     halt();
43*67e74705SXin Li   dead();
44*67e74705SXin Li 
45*67e74705SXin Li   case 4:
46*67e74705SXin Li   a4:
47*67e74705SXin Li     live(),
48*67e74705SXin Li       halt();
49*67e74705SXin Li     goto a4;    // expected-warning {{will never be executed}}
50*67e74705SXin Li 
51*67e74705SXin Li   case 5:
52*67e74705SXin Li     goto a5;
53*67e74705SXin Li   c5:
54*67e74705SXin Li     dead();     // expected-warning {{will never be executed}}
55*67e74705SXin Li     goto b5;
56*67e74705SXin Li   a5:
57*67e74705SXin Li     live(),
58*67e74705SXin Li       halt();
59*67e74705SXin Li   b5:
60*67e74705SXin Li     goto c5;
61*67e74705SXin Li 
62*67e74705SXin Li   case 6:
63*67e74705SXin Li     if (live())
64*67e74705SXin Li       goto e6;
65*67e74705SXin Li     live(),
66*67e74705SXin Li       halt();
67*67e74705SXin Li   d6:
68*67e74705SXin Li     dead();     // expected-warning {{will never be executed}}
69*67e74705SXin Li     goto b6;
70*67e74705SXin Li   c6:
71*67e74705SXin Li     dead();
72*67e74705SXin Li     goto b6;
73*67e74705SXin Li   e6:
74*67e74705SXin Li     live(),
75*67e74705SXin Li       halt();
76*67e74705SXin Li   b6:
77*67e74705SXin Li     goto c6;
78*67e74705SXin Li   case 7:
79*67e74705SXin Li     halt()
80*67e74705SXin Li       +
81*67e74705SXin Li       dead();   // expected-warning {{will never be executed}}
82*67e74705SXin Li     -           // expected-warning {{will never be executed}}
83*67e74705SXin Li       halt();
84*67e74705SXin Li   case 8:
85*67e74705SXin Li     i
86*67e74705SXin Li       +=        // expected-warning {{will never be executed}}
87*67e74705SXin Li       halt();
88*67e74705SXin Li   case 9:
89*67e74705SXin Li     halt()
90*67e74705SXin Li       ?         // expected-warning {{will never be executed}}
91*67e74705SXin Li       dead() : dead();
92*67e74705SXin Li   case 10:
93*67e74705SXin Li     (           // expected-warning {{will never be executed}}
94*67e74705SXin Li       float)halt();
95*67e74705SXin Li   case 11: {
96*67e74705SXin Li     int a[5];
97*67e74705SXin Li     live(),
98*67e74705SXin Li       a[halt()
99*67e74705SXin Li         ];      // expected-warning {{will never be executed}}
100*67e74705SXin Li   }
101*67e74705SXin Li   }
102*67e74705SXin Li }
103*67e74705SXin Li 
104*67e74705SXin Li enum Cases { C1, C2, C3 };
test_enum_cases(enum Cases C)105*67e74705SXin Li int test_enum_cases(enum Cases C) {
106*67e74705SXin Li   switch (C) {
107*67e74705SXin Li     case C1:
108*67e74705SXin Li     case C2:
109*67e74705SXin Li     case C3:
110*67e74705SXin Li       return 1;
111*67e74705SXin Li     default: {
112*67e74705SXin Li       int i = 0; // no-warning
113*67e74705SXin Li       ++i;
114*67e74705SXin Li       return i;
115*67e74705SXin Li     }
116*67e74705SXin Li   }
117*67e74705SXin Li }
118*67e74705SXin Li 
119*67e74705SXin Li // Handle unreachable code triggered by macro expansions.
120*67e74705SXin Li void __myassert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__));
121*67e74705SXin Li 
122*67e74705SXin Li #define myassert(e) \
123*67e74705SXin Li     (__builtin_expect(!(e), 0) ? __myassert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
124*67e74705SXin Li 
test_assert()125*67e74705SXin Li void test_assert() {
126*67e74705SXin Li   myassert(0 && "unreachable");
127*67e74705SXin Li   return; // no-warning
128*67e74705SXin Li }
129*67e74705SXin Li 
130*67e74705SXin Li // Test case for PR 9774.  Tests that dead code in macros aren't warned about.
131*67e74705SXin Li #define MY_MAX(a,b)     ((a) >= (b) ? (a) : (b))
PR9774(int * s)132*67e74705SXin Li void PR9774(int *s) {
133*67e74705SXin Li     for (int i = 0; i < MY_MAX(2, 3); i++) // no-warning
134*67e74705SXin Li         s[i] = 0;
135*67e74705SXin Li }
136*67e74705SXin Li 
137*67e74705SXin Li // Test case for <rdar://problem/11005770>.  We should treat code guarded
138*67e74705SXin Li // by 'x & 0' and 'x * 0' as unreachable.
139*67e74705SXin Li int calledFun();
test_mul_and_zero(int x)140*67e74705SXin Li void test_mul_and_zero(int x) {
141*67e74705SXin Li   if (x & 0) calledFun(); // expected-warning {{will never be executed}}
142*67e74705SXin Li   if (0 & x) calledFun(); // expected-warning {{will never be executed}}
143*67e74705SXin Li   if (x * 0) calledFun(); // expected-warning {{will never be executed}}
144*67e74705SXin Li   if (0 * x) calledFun(); // expected-warning {{will never be executed}}
145*67e74705SXin Li }
146*67e74705SXin Li 
147*67e74705SXin Li void raze() __attribute__((noreturn));
148*67e74705SXin Li void warn_here();
149*67e74705SXin Li 
test_break_preceded_by_noreturn(int i)150*67e74705SXin Li int test_break_preceded_by_noreturn(int i) {
151*67e74705SXin Li   switch (i) {
152*67e74705SXin Li     case 1:
153*67e74705SXin Li       raze();
154*67e74705SXin Li       break; // expected-warning {{'break' will never be executed}}
155*67e74705SXin Li     case 2:
156*67e74705SXin Li       raze();
157*67e74705SXin Li       break; // expected-warning {{'break' will never be executed}}
158*67e74705SXin Li       warn_here(); // expected-warning {{will never be executed}}
159*67e74705SXin Li     case 3:
160*67e74705SXin Li       return 1;
161*67e74705SXin Li       break; // expected-warning {{will never be executed}}
162*67e74705SXin Li     default:
163*67e74705SXin Li       break;
164*67e74705SXin Li       break; // expected-warning {{will never be executed}}
165*67e74705SXin Li   }
166*67e74705SXin Li   return i;
167*67e74705SXin Li }
168*67e74705SXin Li 
169*67e74705SXin Li // Don't warn about unreachable 'default' cases, as that is covered
170*67e74705SXin Li // by -Wcovered-switch-default.
171*67e74705SXin Li typedef enum { Value1 = 1 } MyEnum;
unreachable_default(MyEnum e)172*67e74705SXin Li void unreachable_default(MyEnum e) {
173*67e74705SXin Li   switch (e) {
174*67e74705SXin Li   case Value1:
175*67e74705SXin Li     calledFun();
176*67e74705SXin Li     break;
177*67e74705SXin Li   case 2: // expected-warning {{case value not in enumerated type 'MyEnum'}}
178*67e74705SXin Li     calledFun();
179*67e74705SXin Li     break;
180*67e74705SXin Li   default:
181*67e74705SXin Li     calledFun(); // no-warning
182*67e74705SXin Li     break;
183*67e74705SXin Li   }
184*67e74705SXin Li }
unreachable_in_default(MyEnum e)185*67e74705SXin Li void unreachable_in_default(MyEnum e) {
186*67e74705SXin Li   switch (e) {
187*67e74705SXin Li   default:
188*67e74705SXin Li     raze();
189*67e74705SXin Li     calledFun(); // expected-warning {{will never be executed}}
190*67e74705SXin Li     break;
191*67e74705SXin Li   }
192*67e74705SXin Li }
193*67e74705SXin Li 
194*67e74705SXin Li // Don't warn about trivial dead returns.
trivial_dead_return()195*67e74705SXin Li int trivial_dead_return() {
196*67e74705SXin Li   raze();
197*67e74705SXin Li   return ((0)); // expected-warning {{'return' will never be executed}}
198*67e74705SXin Li }
199*67e74705SXin Li 
trivial_dead_return_void()200*67e74705SXin Li void trivial_dead_return_void() {
201*67e74705SXin Li   raze();
202*67e74705SXin Li   return; // expected-warning {{'return' will never be executed}}
203*67e74705SXin Li }
204*67e74705SXin Li 
trivial_dead_return_enum()205*67e74705SXin Li MyEnum trivial_dead_return_enum() {
206*67e74705SXin Li   raze();
207*67e74705SXin Li   return Value1; // expected-warning {{'return' will never be executed}}
208*67e74705SXin Li }
209*67e74705SXin Li 
trivial_dead_return_enum_2(int x)210*67e74705SXin Li MyEnum trivial_dead_return_enum_2(int x) {
211*67e74705SXin Li   switch (x) {
212*67e74705SXin Li     case 1: return 1;
213*67e74705SXin Li     case 2: return 2;
214*67e74705SXin Li     case 3: return 3;
215*67e74705SXin Li     default: return 4;
216*67e74705SXin Li   }
217*67e74705SXin Li 
218*67e74705SXin Li   return 2; // expected-warning {{will never be executed}}
219*67e74705SXin Li }
220*67e74705SXin Li 
trivial_dead_return_cstr()221*67e74705SXin Li const char *trivial_dead_return_cstr() {
222*67e74705SXin Li   raze();
223*67e74705SXin Li   return ""; // expected-warning {{return' will never be executed}}
224*67e74705SXin Li }
225*67e74705SXin Li 
trivial_dead_return_char()226*67e74705SXin Li char trivial_dead_return_char() {
227*67e74705SXin Li   raze();
228*67e74705SXin Li   return ' '; // expected-warning {{return' will never be executed}}
229*67e74705SXin Li }
230*67e74705SXin Li 
nontrivial_dead_return_enum_2(int x)231*67e74705SXin Li MyEnum nontrivial_dead_return_enum_2(int x) {
232*67e74705SXin Li   switch (x) {
233*67e74705SXin Li     case 1: return 1;
234*67e74705SXin Li     case 2: return 2;
235*67e74705SXin Li     case 3: return 3;
236*67e74705SXin Li     default: return 4;
237*67e74705SXin Li   }
238*67e74705SXin Li 
239*67e74705SXin Li   return calledFun(); // expected-warning {{will never be executed}}
240*67e74705SXin Li }
241*67e74705SXin Li 
242*67e74705SXin Li enum X { A, B, C };
243*67e74705SXin Li 
covered_switch(enum X x)244*67e74705SXin Li int covered_switch(enum X x) {
245*67e74705SXin Li   switch (x) {
246*67e74705SXin Li   case A: return 1;
247*67e74705SXin Li   case B: return 2;
248*67e74705SXin Li   case C: return 3;
249*67e74705SXin Li   }
250*67e74705SXin Li   return 4; // no-warning
251*67e74705SXin Li }
252*67e74705SXin Li 
253*67e74705SXin Li // Test unreachable code depending on configuration values
254*67e74705SXin Li #define CONFIG_CONSTANT 1
test_config_constant(int x)255*67e74705SXin Li int test_config_constant(int x) {
256*67e74705SXin Li   if (!CONFIG_CONSTANT) {
257*67e74705SXin Li     calledFun(); // no-warning
258*67e74705SXin Li     return 1;
259*67e74705SXin Li   }
260*67e74705SXin Li   if (!1) { // expected-note {{silence by adding parentheses to mark code as explicitly dead}}
261*67e74705SXin Li     calledFun(); // expected-warning {{will never be executed}}
262*67e74705SXin Li     return 1;
263*67e74705SXin Li   }
264*67e74705SXin Li   if (sizeof(int) > sizeof(char)) {
265*67e74705SXin Li     calledFun(); // no-warning
266*67e74705SXin Li     return 1;
267*67e74705SXin Li   }
268*67e74705SXin Li   if (x > 10)
269*67e74705SXin Li     return CONFIG_CONSTANT ? calledFun() : calledFun(); // no-warning
270*67e74705SXin Li   else
271*67e74705SXin Li     return 1 ? // expected-note {{silence by adding parentheses to mark code as explicitly dead}}
272*67e74705SXin Li       calledFun() :
273*67e74705SXin Li       calledFun(); // expected-warning {{will never be executed}}
274*67e74705SXin Li }
275*67e74705SXin Li 
sizeof_int(int x,int y)276*67e74705SXin Li int sizeof_int(int x, int y) {
277*67e74705SXin Li   if (sizeof(long) == sizeof(int))
278*67e74705SXin Li     return 1; // no-warning
279*67e74705SXin Li   if (sizeof(long) != sizeof(int))
280*67e74705SXin Li     return 0; // no-warning
281*67e74705SXin Li   if (x && y && sizeof(long) < sizeof(char))
282*67e74705SXin Li     return 0; // no-warning
283*67e74705SXin Li   return 2; // no-warning
284*67e74705SXin Li }
285*67e74705SXin Li 
286*67e74705SXin Li enum MyEnum2 {
287*67e74705SXin Li   ME_A = CONFIG_CONSTANT,
288*67e74705SXin Li   ME_B = 1
289*67e74705SXin Li };
290*67e74705SXin Li 
test_MyEnum()291*67e74705SXin Li int test_MyEnum() {
292*67e74705SXin Li   if (!ME_A)
293*67e74705SXin Li     return 1; // no-warning
294*67e74705SXin Li   if (ME_A)
295*67e74705SXin Li     return 2; // no-warning
296*67e74705SXin Li   if (ME_B)
297*67e74705SXin Li     return 3;
298*67e74705SXin Li   if (!ME_B) // expected-warning {{will never be executed}}
299*67e74705SXin Li     return 4; // expected-warning {{will never be executed}}
300*67e74705SXin Li   return 5;
301*67e74705SXin Li }
302*67e74705SXin Li 
303*67e74705SXin Li // Test for idiomatic do..while.
test_do_while(int x)304*67e74705SXin Li int test_do_while(int x) {
305*67e74705SXin Li   do {
306*67e74705SXin Li     if (x == calledFun())
307*67e74705SXin Li       break;
308*67e74705SXin Li     ++x;
309*67e74705SXin Li     break;
310*67e74705SXin Li   }
311*67e74705SXin Li   while (0); // no-warning
312*67e74705SXin Li   return x;
313*67e74705SXin Li }
314*67e74705SXin Li 
test_do_while_nontrivial_cond(int x)315*67e74705SXin Li int test_do_while_nontrivial_cond(int x) {
316*67e74705SXin Li   do {
317*67e74705SXin Li     if (x == calledFun())
318*67e74705SXin Li       break;
319*67e74705SXin Li     ++x;
320*67e74705SXin Li     break;
321*67e74705SXin Li   }
322*67e74705SXin Li   while (calledFun()); // expected-warning {{will never be executed}}
323*67e74705SXin Li   return x;
324*67e74705SXin Li }
325*67e74705SXin Li 
326*67e74705SXin Li // Diagnostic control: -Wunreachable-code-return.
327*67e74705SXin Li 
328*67e74705SXin Li #pragma clang diagnostic push
329*67e74705SXin Li #pragma clang diagnostic ignored "-Wunreachable-code-return"
330*67e74705SXin Li 
trivial_dead_return_void_SUPPRESSED()331*67e74705SXin Li void trivial_dead_return_void_SUPPRESSED() {
332*67e74705SXin Li   raze();
333*67e74705SXin Li   return; // no-warning
334*67e74705SXin Li }
335*67e74705SXin Li 
trivial_dead_return_enum_SUPPRESSED()336*67e74705SXin Li MyEnum trivial_dead_return_enum_SUPPRESSED() {
337*67e74705SXin Li   raze();
338*67e74705SXin Li   return Value1; // no-warning
339*67e74705SXin Li }
340*67e74705SXin Li 
341*67e74705SXin Li #pragma clang diagnostic pop
342*67e74705SXin Li 
343*67e74705SXin Li // Diagnostic control: -Wunreachable-code-break.
344*67e74705SXin Li 
345*67e74705SXin Li #pragma clang diagnostic push
346*67e74705SXin Li #pragma clang diagnostic ignored "-Wunreachable-code-break"
347*67e74705SXin Li 
test_break_preceded_by_noreturn_SUPPRESSED(int i)348*67e74705SXin Li int test_break_preceded_by_noreturn_SUPPRESSED(int i) {
349*67e74705SXin Li   switch (i) {
350*67e74705SXin Li     case 1:
351*67e74705SXin Li       raze();
352*67e74705SXin Li       break; // no-warning
353*67e74705SXin Li     case 2:
354*67e74705SXin Li       raze();
355*67e74705SXin Li       break; // no-warning
356*67e74705SXin Li       warn_here(); // expected-warning {{will never be executed}}
357*67e74705SXin Li     case 3:
358*67e74705SXin Li       return 1;
359*67e74705SXin Li       break; // no-warning
360*67e74705SXin Li     default:
361*67e74705SXin Li       break;
362*67e74705SXin Li       break; // no-warning
363*67e74705SXin Li   }
364*67e74705SXin Li   return i;
365*67e74705SXin Li }
366*67e74705SXin Li 
367*67e74705SXin Li #pragma clang diagnostic pop
368*67e74705SXin Li 
369*67e74705SXin Li // Test "silencing" with parentheses.
test_with_paren_silencing(int x)370*67e74705SXin Li void test_with_paren_silencing(int x) {
371*67e74705SXin Li   if (0) calledFun(); // expected-warning {{will never be executed}} expected-note {{silence by adding parentheses to mark code as explicitly dead}}
372*67e74705SXin Li   if ((0)) calledFun(); // no-warning
373*67e74705SXin Li 
374*67e74705SXin Li   if (1) // expected-note {{silence by adding parentheses to mark code as explicitly dead}}
375*67e74705SXin Li     calledFun();
376*67e74705SXin Li   else
377*67e74705SXin Li     calledFun(); // expected-warning {{will never be executed}}
378*67e74705SXin Li 
379*67e74705SXin Li   if ((1))
380*67e74705SXin Li     calledFun();
381*67e74705SXin Li   else
382*67e74705SXin Li     calledFun(); // no-warning
383*67e74705SXin Li 
384*67e74705SXin Li   if (!1) // expected-note {{silence by adding parentheses to mark code as explicitly dead}}
385*67e74705SXin Li     calledFun(); // expected-warning {{code will never be executed}}
386*67e74705SXin Li   else
387*67e74705SXin Li     calledFun();
388*67e74705SXin Li 
389*67e74705SXin Li   if ((!1))
390*67e74705SXin Li     calledFun(); // no-warning
391*67e74705SXin Li   else
392*67e74705SXin Li     calledFun();
393*67e74705SXin Li 
394*67e74705SXin Li   if (!(1))
395*67e74705SXin Li     calledFun(); // no-warning
396*67e74705SXin Li   else
397*67e74705SXin Li     calledFun();
398*67e74705SXin Li }
399