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