1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2
3 void a(int i);
4 int b();
5 int c();
6
7 #define MACRO_A 0
8
test1(int x,int y)9 void test1(int x, int y) {
10 while(true) {
11 if (x); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
12
13 // Check that we handle conditions that start or end with a macro
14 // correctly.
15 if (x == MACRO_A); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
16 if (MACRO_A == x); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
17
18 int i;
19 // PR11329
20 for (i = 0; i < x; i++); { // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
21 a(i);
22 b();
23 }
24
25 for (i = 0; i < x; i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
26 {
27 a(i);
28 }
29
30 for (i = 0;
31 i < x;
32 i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
33 {
34 a(i);
35 }
36
37 int arr[3] = { 1, 2, 3 };
38 for (int j : arr); // expected-warning{{range-based for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
39 a(i);
40
41 for (int j :
42 arr); // expected-warning{{range-based for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
43 a(i);
44
45 while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
46 a(i);
47
48 while (b() == 0); { // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
49 a(i);
50 }
51
52 while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
53 {
54 a(i);
55 }
56
57 while (b() == 0 ||
58 c() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
59 {
60 a(i);
61 }
62
63 do; // expected-note{{to match this 'do'}}
64 b(); // expected-error{{expected 'while' in do/while loop}}
65 while (b()); // no-warning
66 c();
67
68 do; // expected-note{{to match this 'do'}}
69 b(); // expected-error{{expected 'while' in do/while loop}}
70 while (b()); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
71 c();
72
73 switch(x) // no-warning
74 {
75 switch(y); // expected-warning{{switch statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
76 {
77 case 0:
78 a(10);
79 break;
80 default:
81 a(20);
82 break;
83 }
84 }
85 }
86 }
87
88 /// There should be no warning when null statement is placed on its own line.
test2(int x,int y)89 void test2(int x, int y) {
90 if (x) // no-warning
91 ; // no-warning
92
93 int i;
94 for (i = 0; i < x; i++) // no-warning
95 ; // no-warning
96
97 for (i = 0;
98 i < x;
99 i++) // no-warning
100 ; // no-warning
101
102 int arr[3] = { 1, 2, 3 };
103 for (int j : arr) // no-warning
104 ; // no-warning
105
106 while (b() == 0) // no-warning
107 ; // no-warning
108
109 while (b() == 0 ||
110 c() == 0) // no-warning
111 ; // no-warning
112
113 switch(x)
114 {
115 switch(y) // no-warning
116 ; // no-warning
117 }
118
119 // Last `for' or `while' statement in compound statement shouldn't warn.
120 while(b() == 0); // no-warning
121 }
122
123 /// There should be no warning for a null statement resulting from an empty macro.
124 #define EMPTY(a)
test3(int x,int y)125 void test3(int x, int y) {
126 if (x) EMPTY(x); // no-warning
127
128 int i;
129 for (i = 0; i < x; i++) EMPTY(i); // no-warning
130
131 for (i = 0;
132 i < x;
133 i++) EMPTY(i); // no-warning
134
135 int arr[3] = { 1, 2, 3 };
136 for (int j : arr) EMPTY(j); // no-warning
137
138 for (int j :
139 arr) EMPTY(j); // no-warning
140
141 while (b() == 0) EMPTY(i); // no-warning
142
143 while (b() == 0 ||
144 c() == 0) EMPTY(i); // no-warning
145
146 switch (x) {
147 switch (y)
148 EMPTY(i); // no-warning
149 }
150 }
151
test4(int x)152 void test4(int x)
153 {
154 // Idiom used in some metaprogramming constructs.
155 switch (x) default:; // no-warning
156
157 // Frequent idiom used in macros.
158 do {} while (false); // no-warning
159 }
160
161 /// There should be no warning for a common for/while idiom when it is obvious
162 /// from indentation that next statement wasn't meant to be a body.
test5(int x,int y)163 void test5(int x, int y) {
164 int i;
165 for (i = 0; i < x; i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
166 a(i);
167
168 for (i = 0; i < x; i++); // no-warning
169 a(i);
170
171 for (i = 0;
172 i < x;
173 i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
174 a(i);
175
176 for (i = 0;
177 i < x;
178 i++); // no-warning
179 a(i);
180
181 while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
182 a(i);
183
184 while (b() == 0); // no-warning
185 a(i);
186
187 while (b() == 0 ||
188 c() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
189 a(i);
190
191 while (b() == 0 ||
192 c() == 0); // no-warning
193 a(i);
194 }
195
196 /// There should be no warning for a statement with a non-null body.
test6(int x,int y)197 void test6(int x, int y) {
198 if (x) {} // no-warning
199
200 if (x)
201 a(x); // no-warning
202
203 int i;
204 for (i = 0; i < x; i++) // no-warning
205 a(i); // no-warning
206
207 for (i = 0; i < x; i++) { // no-warning
208 a(i); // no-warning
209 }
210
211 for (i = 0;
212 i < x;
213 i++) // no-warning
214 a(i); // no-warning
215
216 int arr[3] = { 1, 2, 3 };
217 for (int j : arr) // no-warning
218 a(j);
219
220 for (int j : arr) {} // no-warning
221
222 while (b() == 0) // no-warning
223 a(i); // no-warning
224
225 while (b() == 0) {} // no-warning
226
227 switch(x) // no-warning
228 {
229 switch(y) // no-warning
230 {
231 case 0:
232 a(10);
233 break;
234 default:
235 a(20);
236 break;
237 }
238 }
239 }
240
test_errors(int x)241 void test_errors(int x) {
242 if (1)
243 aa; // expected-error{{use of undeclared identifier}}
244 // no empty body warning.
245
246 int i;
247 for (i = 0; i < x; i++)
248 bb; // expected-error{{use of undeclared identifier}}
249
250 int arr[3] = { 1, 2, 3 };
251 for (int j : arr)
252 cc; // expected-error{{use of undeclared identifier}}
253
254 while (b() == 0)
255 dd; // expected-error{{use of undeclared identifier}}
256 }
257
258 // Warnings for statements in templates shouldn't be duplicated for all
259 // instantiations.
260 template <typename T>
test_template(int x)261 void test_template(int x) {
262 if (x); // expected-warning{{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
263
264 if (x)
265 EMPTY(x); // no-warning
266
267 int arr[3] = { 1, 2, 3 };
268 for (int j : arr); // expected-warning{{range-based for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
269
270 while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
271 a(x);
272 }
273
test_template_inst(int x)274 void test_template_inst(int x) {
275 test_template<int>(x);
276 test_template<double>(x);
277 }
278
279 #define IDENTITY(a) a
test7(int x,int y)280 void test7(int x, int y) {
281 if (x) IDENTITY(); // no-warning
282 }
283
284