Home | History | Annotate | Download | only in SemaCXX
      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