| // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s |
| |
| void a(int i); |
| int b(); |
| int c(); |
| |
| #define MACRO_A 0 |
| |
| void test1(int x, int y) { |
| while(true) { |
| if (x); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| |
| // Check that we handle conditions that start or end with a macro |
| // correctly. |
| if (x == MACRO_A); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| if (MACRO_A == x); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| |
| int i; |
| // PR11329 |
| 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}} |
| a(i); |
| b(); |
| } |
| |
| 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}} |
| { |
| a(i); |
| } |
| |
| 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}} |
| { |
| a(i); |
| } |
| |
| int arr[3] = { 1, 2, 3 }; |
| 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}} |
| a(i); |
| |
| 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}} |
| a(i); |
| |
| while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| a(i); |
| |
| while (b() == 0); { // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| a(i); |
| } |
| |
| while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| { |
| a(i); |
| } |
| |
| while (b() == 0 || |
| c() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| { |
| a(i); |
| } |
| |
| do; // expected-note{{to match this 'do'}} |
| b(); // expected-error{{expected 'while' in do/while loop}} |
| while (b()); // no-warning |
| c(); |
| |
| do; // expected-note{{to match this 'do'}} |
| b(); // expected-error{{expected 'while' in do/while loop}} |
| while (b()); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| c(); |
| |
| switch(x) // no-warning |
| { |
| switch(y); // expected-warning{{switch statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| { |
| case 0: |
| a(10); |
| break; |
| default: |
| a(20); |
| break; |
| } |
| } |
| } |
| } |
| |
| /// There should be no warning when null statement is placed on its own line. |
| void test2(int x, int y) { |
| if (x) // no-warning |
| ; // no-warning |
| |
| int i; |
| for (i = 0; i < x; i++) // no-warning |
| ; // no-warning |
| |
| for (i = 0; |
| i < x; |
| i++) // no-warning |
| ; // no-warning |
| |
| int arr[3] = { 1, 2, 3 }; |
| for (int j : arr) // no-warning |
| ; // no-warning |
| |
| while (b() == 0) // no-warning |
| ; // no-warning |
| |
| while (b() == 0 || |
| c() == 0) // no-warning |
| ; // no-warning |
| |
| switch(x) |
| { |
| switch(y) // no-warning |
| ; // no-warning |
| } |
| |
| // Last `for' or `while' statement in compound statement shouldn't warn. |
| while(b() == 0); // no-warning |
| } |
| |
| /// There should be no warning for a null statement resulting from an empty macro. |
| #define EMPTY(a) |
| void test3(int x, int y) { |
| if (x) EMPTY(x); // no-warning |
| |
| int i; |
| for (i = 0; i < x; i++) EMPTY(i); // no-warning |
| |
| for (i = 0; |
| i < x; |
| i++) EMPTY(i); // no-warning |
| |
| int arr[3] = { 1, 2, 3 }; |
| for (int j : arr) EMPTY(j); // no-warning |
| |
| for (int j : |
| arr) EMPTY(j); // no-warning |
| |
| while (b() == 0) EMPTY(i); // no-warning |
| |
| while (b() == 0 || |
| c() == 0) EMPTY(i); // no-warning |
| |
| switch (x) { |
| switch (y) |
| EMPTY(i); // no-warning |
| } |
| } |
| |
| void test4(int x) |
| { |
| // Idiom used in some metaprogramming constructs. |
| switch (x) default:; // no-warning |
| |
| // Frequent idiom used in macros. |
| do {} while (false); // no-warning |
| } |
| |
| /// There should be no warning for a common for/while idiom when it is obvious |
| /// from indentation that next statement wasn't meant to be a body. |
| void test5(int x, int y) { |
| int i; |
| 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}} |
| a(i); |
| |
| for (i = 0; i < x; i++); // no-warning |
| a(i); |
| |
| 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}} |
| a(i); |
| |
| for (i = 0; |
| i < x; |
| i++); // no-warning |
| a(i); |
| |
| while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| a(i); |
| |
| while (b() == 0); // no-warning |
| a(i); |
| |
| while (b() == 0 || |
| c() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| a(i); |
| |
| while (b() == 0 || |
| c() == 0); // no-warning |
| a(i); |
| } |
| |
| /// There should be no warning for a statement with a non-null body. |
| void test6(int x, int y) { |
| if (x) {} // no-warning |
| |
| if (x) |
| a(x); // no-warning |
| |
| int i; |
| for (i = 0; i < x; i++) // no-warning |
| a(i); // no-warning |
| |
| for (i = 0; i < x; i++) { // no-warning |
| a(i); // no-warning |
| } |
| |
| for (i = 0; |
| i < x; |
| i++) // no-warning |
| a(i); // no-warning |
| |
| int arr[3] = { 1, 2, 3 }; |
| for (int j : arr) // no-warning |
| a(j); |
| |
| for (int j : arr) {} // no-warning |
| |
| while (b() == 0) // no-warning |
| a(i); // no-warning |
| |
| while (b() == 0) {} // no-warning |
| |
| switch(x) // no-warning |
| { |
| switch(y) // no-warning |
| { |
| case 0: |
| a(10); |
| break; |
| default: |
| a(20); |
| break; |
| } |
| } |
| } |
| |
| void test_errors(int x) { |
| if (1) |
| aa; // expected-error{{use of undeclared identifier}} |
| // no empty body warning. |
| |
| int i; |
| for (i = 0; i < x; i++) |
| bb; // expected-error{{use of undeclared identifier}} |
| |
| int arr[3] = { 1, 2, 3 }; |
| for (int j : arr) |
| cc; // expected-error{{use of undeclared identifier}} |
| |
| while (b() == 0) |
| dd; // expected-error{{use of undeclared identifier}} |
| } |
| |
| // Warnings for statements in templates shouldn't be duplicated for all |
| // instantiations. |
| template <typename T> |
| void test_template(int x) { |
| if (x); // expected-warning{{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| |
| if (x) |
| EMPTY(x); // no-warning |
| |
| int arr[3] = { 1, 2, 3 }; |
| 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}} |
| |
| while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}} |
| a(x); |
| } |
| |
| void test_template_inst(int x) { |
| test_template<int>(x); |
| test_template<double>(x); |
| } |
| |
| #define IDENTITY(a) a |
| void test7(int x, int y) { |
| if (x) IDENTITY(); // no-warning |
| } |
| |