]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaCXX/warn-empty-body.cpp
Vendor import of clang release_34 branch r197841 (effectively, 3.4 RC3):
[FreeBSD/FreeBSD.git] / test / SemaCXX / warn-empty-body.cpp
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 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.
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)
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
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.
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.
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
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>
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
267 void test_template_inst(int x) {
268   test_template<int>(x);
269   test_template<double>(x);
270 }
271
272 #define IDENTITY(a) a
273 void test7(int x, int y) {
274   if (x) IDENTITY(); // no-warning
275 }
276