1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 class Base { }; 4 class Derived1 : public Base { }; 5 class Derived2 : public Base { }; 6 7 void f0(volatile Base *b, Derived1 *d1, const Derived2 *d2) { 8 if (b > d1) 9 return; 10 if (d1 <= b) 11 return; 12 if (b > d2) 13 return; 14 if (d1 >= d2) // expected-error{{comparison of distinct}} 15 return; 16 } 17 18 void f1(volatile Base *b, Derived1 *d1, const Derived2 *d2) { 19 if (b == d1) 20 return; 21 if (d1 == b) 22 return; 23 if (b != d2) 24 return; 25 if (d1 == d2) // expected-error{{comparison of distinct}} 26 return; 27 } 28 29 // PR4691 30 int ptrcmp1(void *a, int *b) { 31 return a < b; 32 } 33 int ptrcmp2(long *a, int *b) { 34 return a < b; // expected-error{{distinct}} 35 } 36 37 // PR5509 - Multi-level pointers 38 int f2() { 39 typedef int *IntPtr; 40 typedef IntPtr *IntPtrPtr; 41 typedef IntPtr const *IntPtrConstPtr; 42 IntPtrConstPtr i = 0; 43 IntPtrPtr j = 0; 44 return i != j; 45 } 46 47 // PR5763 48 typedef double Matrix4[4][4]; 49 50 bool f(Matrix4 m1, const Matrix4 m2) { 51 return m1 != m2; 52 } 53 54 // PR6346 55 bool f1(bool b, void **p, const void **q) { 56 if (p == q) // expected-warning{{comparison of distinct pointer types ('void **' and 'const void **') uses non-standard composite pointer type 'const void *const *'}} 57 return false; 58 59 return b? p : q; // expected-warning{{incompatible operand types ('void **' and 'const void **') use non-standard composite pointer type 'const void *const *'}} 60 } 61