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