// Force x86-64 because some of our heuristics are actually based // on integer sizes. // RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -verify -std=c++11 %s namespace RuntimeBehavior { // Avoid emitting tautological compare warnings when the code already has // compile time checks on variable sizes. const int kintmax = 2147483647; void test0(short x) { if (sizeof(x) < sizeof(int) || x < kintmax) {} if (x < kintmax) {} // expected-warning@-1{{comparison of constant 2147483647 with expression of type 'short' is always true}} } void test1(short x) { if (x < kintmax) {} // expected-warning@-1{{comparison of constant 2147483647 with expression of type 'short' is always true}} if (sizeof(x) < sizeof(int)) return; if (x < kintmax) {} } } namespace ArrayCompare { #define GetValue(ptr) ((ptr != 0) ? ptr[0] : 0) extern int a[] __attribute__((weak)); int b[] = {8,13,21}; struct { int x[10]; } c; const char str[] = "text"; void ignore() { if (a == 0) {} if (a != 0) {} (void)GetValue(b); } void test() { if (b == 0) {} // expected-warning@-1{{comparison of array 'b' equal to a null pointer is always false}} if (b != 0) {} // expected-warning@-1{{comparison of array 'b' not equal to a null pointer is always true}} if (0 == b) {} // expected-warning@-1{{comparison of array 'b' equal to a null pointer is always false}} if (0 != b) {} // expected-warning@-1{{comparison of array 'b' not equal to a null pointer is always true}} if (c.x == 0) {} // expected-warning@-1{{comparison of array 'c.x' equal to a null pointer is always false}} if (c.x != 0) {} // expected-warning@-1{{comparison of array 'c.x' not equal to a null pointer is always true}} if (str == 0) {} // expected-warning@-1{{comparison of array 'str' equal to a null pointer is always false}} if (str != 0) {} // expected-warning@-1{{comparison of array 'str' not equal to a null pointer is always true}} } } namespace FunctionCompare { #define CallFunction(f) ((f != 0) ? f() : 0) extern void a() __attribute__((weak)); void fun1(); int fun2(); int* fun3(); int* fun4(int); class S { public: static int foo(); }; void ignore() { if (a == 0) {} if (0 != a) {} (void)CallFunction(fun2); } void test() { if (fun1 == 0) {} // expected-warning@-1{{comparison of function 'fun1' equal to a null pointer is always false}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} if (fun2 == 0) {} // expected-warning@-1{{comparison of function 'fun2' equal to a null pointer is always false}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} // expected-note@-3{{suffix with parentheses to turn this into a function call}} if (fun3 == 0) {} // expected-warning@-1{{comparison of function 'fun3' equal to a null pointer is always false}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} // expected-note@-3{{suffix with parentheses to turn this into a function call}} if (fun4 == 0) {} // expected-warning@-1{{comparison of function 'fun4' equal to a null pointer is always false}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} if (nullptr != fun1) {} // expected-warning@-1{{comparison of function 'fun1' not equal to a null pointer is always true}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} if (nullptr != fun2) {} // expected-warning@-1{{comparison of function 'fun2' not equal to a null pointer is always true}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} if (nullptr != fun3) {} // expected-warning@-1{{comparison of function 'fun3' not equal to a null pointer is always true}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} // expected-note@-3{{suffix with parentheses to turn this into a function call}} if (nullptr != fun4) {} // expected-warning@-1{{comparison of function 'fun4' not equal to a null pointer is always true}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} if (S::foo == 0) {} // expected-warning@-1{{comparison of function 'S::foo' equal to a null pointer is always false}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} // expected-note@-3{{suffix with parentheses to turn this into a function call}} } } namespace PointerCompare { extern int a __attribute__((weak)); int b; static int c; class S { public: static int a; int b; }; void ignored() { if (&a == 0) {} } void test() { S s; if (&b == 0) {} // expected-warning@-1{{comparison of address of 'b' equal to a null pointer is always false}} if (&c == 0) {} // expected-warning@-1{{comparison of address of 'c' equal to a null pointer is always false}} if (&s.a == 0) {} // expected-warning@-1{{comparison of address of 's.a' equal to a null pointer is always false}} if (&s.b == 0) {} // expected-warning@-1{{comparison of address of 's.b' equal to a null pointer is always false}} if (&S::a == 0) {} // expected-warning@-1{{comparison of address of 'S::a' equal to a null pointer is always false}} } } namespace macros { #define assert(x) if (x) {} int array[5]; void fun(); int x; void test() { assert(array == 0); // expected-warning@-1{{comparison of array 'array' equal to a null pointer is always false}} assert(array != 0); // expected-warning@-1{{comparison of array 'array' not equal to a null pointer is always true}} assert(array == 0 && "expecting null pointer"); // expected-warning@-1{{comparison of array 'array' equal to a null pointer is always false}} assert(array != 0 && "expecting non-null pointer"); // expected-warning@-1{{comparison of array 'array' not equal to a null pointer is always true}} assert(fun == 0); // expected-warning@-1{{comparison of function 'fun' equal to a null pointer is always false}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} assert(fun != 0); // expected-warning@-1{{comparison of function 'fun' not equal to a null pointer is always true}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} assert(fun == 0 && "expecting null pointer"); // expected-warning@-1{{comparison of function 'fun' equal to a null pointer is always false}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} assert(fun != 0 && "expecting non-null pointer"); // expected-warning@-1{{comparison of function 'fun' not equal to a null pointer is always true}} // expected-note@-2{{prefix with the address-of operator to silence this warning}} assert(&x == 0); // expected-warning@-1{{comparison of address of 'x' equal to a null pointer is always false}} assert(&x != 0); // expected-warning@-1{{comparison of address of 'x' not equal to a null pointer is always true}} assert(&x == 0 && "expecting null pointer"); // expected-warning@-1{{comparison of address of 'x' equal to a null pointer is always false}} assert(&x != 0 && "expecting non-null pointer"); // expected-warning@-1{{comparison of address of 'x' not equal to a null pointer is always true}} } }