1// 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
272