1 // RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code -Wno-unused-value -Wno-covered-switch-default
2
3 int halt() __attribute__((noreturn));
4 int live();
5 int dead();
6
test1()7 void test1() {
8 goto c;
9 d:
10 goto e; // expected-warning {{will never be executed}}
11 c: ;
12 int i;
13 return;
14 goto b; // expected-warning {{will never be executed}}
15 goto a; // expected-warning {{will never be executed}}
16 b:
17 i = 1;
18 a:
19 i = 2;
20 goto f;
21 e:
22 goto d;
23 f: ;
24 }
25
test2()26 void test2() {
27 int i;
28 switch (live()) {
29 case 1:
30 halt(),
31 dead(); // expected-warning {{will never be executed}}
32
33 case 2:
34 live(), halt(),
35 dead(); // expected-warning {{will never be executed}}
36
37 case 3:
38 live()
39 + // expected-warning {{will never be executed}}
40 halt();
41 dead();
42
43 case 4:
44 a4:
45 live(),
46 halt();
47 goto a4; // expected-warning {{will never be executed}}
48
49 case 5:
50 goto a5;
51 c5:
52 dead(); // expected-warning {{will never be executed}}
53 goto b5;
54 a5:
55 live(),
56 halt();
57 b5:
58 goto c5;
59
60 case 6:
61 if (live())
62 goto e6;
63 live(),
64 halt();
65 d6:
66 dead(); // expected-warning {{will never be executed}}
67 goto b6;
68 c6:
69 dead();
70 goto b6;
71 e6:
72 live(),
73 halt();
74 b6:
75 goto c6;
76 case 7:
77 halt()
78 +
79 dead(); // expected-warning {{will never be executed}}
80 - // expected-warning {{will never be executed}}
81 halt();
82 case 8:
83 i // expected-warning {{will never be executed}}
84 +=
85 halt();
86 case 9:
87 halt()
88 ? // expected-warning {{will never be executed}}
89 dead() : dead();
90 case 10:
91 ( // expected-warning {{will never be executed}}
92 float)halt();
93 case 11: {
94 int a[5];
95 live(),
96 a[halt() // expected-warning {{will never be executed}}
97 ];
98 }
99 }
100 }
101
102 enum Cases { C1, C2, C3 };
test_enum_cases(enum Cases C)103 int test_enum_cases(enum Cases C) {
104 switch (C) {
105 case C1:
106 case C2:
107 case C3:
108 return 1;
109 default: {
110 int i = 0; // expected-warning{{will never be executed}}
111 ++i;
112 return i;
113 }
114 }
115 }
116
117 // Handle unreachable code triggered by macro expansions.
118 void __myassert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__));
119
120 #define myassert(e) \
121 (__builtin_expect(!(e), 0) ? __myassert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
122
test_assert()123 void test_assert() {
124 myassert(0 && "unreachable");
125 return; // no-warning
126 }
127
128 // Test case for PR 9774. Tests that dead code in macros aren't warned about.
129 #define MY_MAX(a,b) ((a) >= (b) ? (a) : (b))
PR9774(int * s)130 void PR9774(int *s) {
131 for (int i = 0; i < MY_MAX(2, 3); i++) // no-warning
132 s[i] = 0;
133 }
134
135 // Test case for <rdar://problem/11005770>. We should treat code guarded
136 // by 'x & 0' and 'x * 0' as unreachable.
137 void calledFun();
test_mul_and_zero(int x)138 void test_mul_and_zero(int x) {
139 if (x & 0) calledFun(); // expected-warning {{will never be executed}}
140 if (0 & x) calledFun(); // expected-warning {{will never be executed}}
141 if (x * 0) calledFun(); // expected-warning {{will never be executed}}
142 if (0 * x) calledFun(); // expected-warning {{will never be executed}}
143 }
144