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