| 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) |
| 57 | return false; |
| 58 | |
| 59 | return b? p : q; |
| 60 | } |
| 61 | |