284 lines
7.5 KiB
C++
284 lines
7.5 KiB
C++
// 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
|
|
}
|
|
|