blob: d643cedf09cc5dae2b7799305c4521927ee67b07 [file] [log] [blame]
Dmitri Gribenko625bb562012-02-14 22:14:32 +00001// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2
3void a(int i);
4int b();
5int c();
6
7void 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.
82void 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)
118void 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
145void 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.
156void 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.
190void 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
234void 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.
253template <typename T>
254void 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
267void test_template_inst(int x) {
268 test_template<int>(x);
269 test_template<double>(x);
270}
271