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 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. 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) 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 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. 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. 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 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> 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 274 void test_template_inst(int x) { 275 test_template<int>(x); 276 test_template<double>(x); 277 } 278 279 #define IDENTITY(a) a 280 void test7(int x, int y) { 281 if (x) IDENTITY(); // no-warning 282 } 283 284