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