179 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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}}
 | |
|   }
 | |
| }
 |