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