1 // Force x86-64 because some of our heuristics are actually based 2 // on integer sizes. 3 4 // RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -verify -std=c++11 %s 5 6 namespace RuntimeBehavior { 7 // Avoid emitting tautological compare warnings when the code already has 8 // compile time checks on variable sizes. 9 10 const int kintmax = 2147483647; test0(short x)11 void test0(short x) { 12 if (sizeof(x) < sizeof(int) || x < kintmax) {} 13 14 if (x < kintmax) {} 15 // expected-warning@-1{{comparison of constant 2147483647 with expression of type 'short' is always true}} 16 } 17 test1(short x)18 void test1(short x) { 19 if (x < kintmax) {} 20 // expected-warning@-1{{comparison of constant 2147483647 with expression of type 'short' is always true}} 21 22 if (sizeof(x) < sizeof(int)) 23 return; 24 25 if (x < kintmax) {} 26 } 27 } 28 29 namespace ArrayCompare { 30 #define GetValue(ptr) ((ptr != 0) ? ptr[0] : 0) 31 extern int a[] __attribute__((weak)); 32 int b[] = {8,13,21}; 33 struct { 34 int x[10]; 35 } c; 36 const char str[] = "text"; ignore()37 void ignore() { 38 if (a == 0) {} 39 if (a != 0) {} 40 (void)GetValue(b); 41 } test()42 void test() { 43 if (b == 0) {} 44 // expected-warning@-1{{comparison of array 'b' equal to a null pointer is always false}} 45 if (b != 0) {} 46 // expected-warning@-1{{comparison of array 'b' not equal to a null pointer is always true}} 47 if (0 == b) {} 48 // expected-warning@-1{{comparison of array 'b' equal to a null pointer is always false}} 49 if (0 != b) {} 50 // expected-warning@-1{{comparison of array 'b' not equal to a null pointer is always true}} 51 if (c.x == 0) {} 52 // expected-warning@-1{{comparison of array 'c.x' equal to a null pointer is always false}} 53 if (c.x != 0) {} 54 // expected-warning@-1{{comparison of array 'c.x' not equal to a null pointer is always true}} 55 if (str == 0) {} 56 // expected-warning@-1{{comparison of array 'str' equal to a null pointer is always false}} 57 if (str != 0) {} 58 // expected-warning@-1{{comparison of array 'str' not equal to a null pointer is always true}} 59 } 60 } 61 62 namespace FunctionCompare { 63 #define CallFunction(f) ((f != 0) ? f() : 0) 64 extern void a() __attribute__((weak)); 65 void fun1(); 66 int fun2(); 67 int* fun3(); 68 int* fun4(int); 69 class S { 70 public: 71 static int foo(); 72 }; ignore()73 void ignore() { 74 if (a == 0) {} 75 if (0 != a) {} 76 (void)CallFunction(fun2); 77 } test()78 void test() { 79 if (fun1 == 0) {} 80 // expected-warning@-1{{comparison of function 'fun1' equal to a null pointer is always false}} 81 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 82 if (fun2 == 0) {} 83 // expected-warning@-1{{comparison of function 'fun2' equal to a null pointer is always false}} 84 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 85 // expected-note@-3{{suffix with parentheses to turn this into a function call}} 86 if (fun3 == 0) {} 87 // expected-warning@-1{{comparison of function 'fun3' equal to a null pointer is always false}} 88 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 89 // expected-note@-3{{suffix with parentheses to turn this into a function call}} 90 if (fun4 == 0) {} 91 // expected-warning@-1{{comparison of function 'fun4' equal to a null pointer is always false}} 92 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 93 if (nullptr != fun1) {} 94 // expected-warning@-1{{comparison of function 'fun1' not equal to a null pointer is always true}} 95 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 96 if (nullptr != fun2) {} 97 // expected-warning@-1{{comparison of function 'fun2' not equal to a null pointer is always true}} 98 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 99 if (nullptr != fun3) {} 100 // expected-warning@-1{{comparison of function 'fun3' not equal to a null pointer is always true}} 101 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 102 // expected-note@-3{{suffix with parentheses to turn this into a function call}} 103 if (nullptr != fun4) {} 104 // expected-warning@-1{{comparison of function 'fun4' not equal to a null pointer is always true}} 105 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 106 if (S::foo == 0) {} 107 // expected-warning@-1{{comparison of function 'S::foo' equal to a null pointer is always false}} 108 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 109 // expected-note@-3{{suffix with parentheses to turn this into a function call}} 110 } 111 } 112 113 namespace PointerCompare { 114 extern int a __attribute__((weak)); 115 int b; 116 static int c; 117 class S { 118 public: 119 static int a; 120 int b; 121 }; ignored()122 void ignored() { 123 if (&a == 0) {} 124 } test()125 void test() { 126 S s; 127 if (&b == 0) {} 128 // expected-warning@-1{{comparison of address of 'b' equal to a null pointer is always false}} 129 if (&c == 0) {} 130 // expected-warning@-1{{comparison of address of 'c' equal to a null pointer is always false}} 131 if (&s.a == 0) {} 132 // expected-warning@-1{{comparison of address of 's.a' equal to a null pointer is always false}} 133 if (&s.b == 0) {} 134 // expected-warning@-1{{comparison of address of 's.b' equal to a null pointer is always false}} 135 if (&S::a == 0) {} 136 // expected-warning@-1{{comparison of address of 'S::a' equal to a null pointer is always false}} 137 } 138 } 139 140 namespace macros { 141 #define assert(x) if (x) {} 142 int array[5]; 143 void fun(); 144 int x; 145 test()146 void test() { 147 assert(array == 0); 148 // expected-warning@-1{{comparison of array 'array' equal to a null pointer is always false}} 149 assert(array != 0); 150 // expected-warning@-1{{comparison of array 'array' not equal to a null pointer is always true}} 151 assert(array == 0 && "expecting null pointer"); 152 // expected-warning@-1{{comparison of array 'array' equal to a null pointer is always false}} 153 assert(array != 0 && "expecting non-null pointer"); 154 // expected-warning@-1{{comparison of array 'array' not equal to a null pointer is always true}} 155 156 assert(fun == 0); 157 // expected-warning@-1{{comparison of function 'fun' equal to a null pointer is always false}} 158 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 159 assert(fun != 0); 160 // expected-warning@-1{{comparison of function 'fun' not equal to a null pointer is always true}} 161 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 162 assert(fun == 0 && "expecting null pointer"); 163 // expected-warning@-1{{comparison of function 'fun' equal to a null pointer is always false}} 164 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 165 assert(fun != 0 && "expecting non-null pointer"); 166 // expected-warning@-1{{comparison of function 'fun' not equal to a null pointer is always true}} 167 // expected-note@-2{{prefix with the address-of operator to silence this warning}} 168 169 assert(&x == 0); 170 // expected-warning@-1{{comparison of address of 'x' equal to a null pointer is always false}} 171 assert(&x != 0); 172 // expected-warning@-1{{comparison of address of 'x' not equal to a null pointer is always true}} 173 assert(&x == 0 && "expecting null pointer"); 174 // expected-warning@-1{{comparison of address of 'x' equal to a null pointer is always false}} 175 assert(&x != 0 && "expecting non-null pointer"); 176 // expected-warning@-1{{comparison of address of 'x' not equal to a null pointer is always true}} 177 } 178 } 179