| // 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}} |
| } |
| } |