1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 
3 class Base { };
4 class Derived1 : public Base { };
5 class Derived2 : public Base { };
6 
f0(volatile Base * b,Derived1 * d1,const Derived2 * d2)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 
f1(volatile Base * b,Derived1 * d1,const Derived2 * d2)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
ptrcmp1(void * a,int * b)30 int ptrcmp1(void *a, int *b) {
31   return a < b;
32 }
ptrcmp2(long * a,int * b)33 int ptrcmp2(long *a, int *b) {
34   return a < b; // expected-error{{distinct}}
35 }
36 
37 // PR5509 - Multi-level pointers
f2()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 
f(Matrix4 m1,const Matrix4 m2)50 bool f(Matrix4 m1, const Matrix4 m2) {
51   return m1 != m2;
52 }
53 
54 // PR6346
f1(bool b,void ** p,const void ** q)55 bool f1(bool b, void **p, const void **q) {
56   if (p == q)
57     return false;
58 
59   return b? p : q;
60 }
61