composite-pointer-type.cpp revision 03028a90c18c484ab477e6535441ec5825a7328a
13573b2c84372d9484296fa658f5276f6c09acb92Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
230eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor
330eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregorclass Base { };
430eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregorclass Derived1 : public Base { };
530eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregorclass Derived2 : public Base { };
630eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor
730eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregorvoid f0(volatile Base *b, Derived1 *d1, const Derived2 *d2) {
830eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor  if (b > d1)
930eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor    return;
1030eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor  if (d1 <= b)
1130eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor    return;
1230eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor  if (b > d2)
1330eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor    return;
1430eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor  if (d1 >= d2) // expected-error{{comparison of distinct}}
1530eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor    return;
1630eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor}
1730eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor
1830eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregorvoid f1(volatile Base *b, Derived1 *d1, const Derived2 *d2) {
1930eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor  if (b == d1)
2030eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor    return;
2130eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor  if (d1 == b)
2230eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor    return;
2330eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor  if (b != d2)
2430eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor    return;
2530eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor  if (d1 == d2) // expected-error{{comparison of distinct}}
2630eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor    return;
2730eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor}
2870be4dba458f2870791654cd83b6b97567f94e2eDouglas Gregor
2970be4dba458f2870791654cd83b6b97567f94e2eDouglas Gregor// PR4691
3070be4dba458f2870791654cd83b6b97567f94e2eDouglas Gregorint ptrcmp1(void *a, int *b) {
3170be4dba458f2870791654cd83b6b97567f94e2eDouglas Gregor  return a < b;
3270be4dba458f2870791654cd83b6b97567f94e2eDouglas Gregor}
3370be4dba458f2870791654cd83b6b97567f94e2eDouglas Gregorint ptrcmp2(long *a, int *b) {
3470be4dba458f2870791654cd83b6b97567f94e2eDouglas Gregor  return a < b; // expected-error{{distinct}}
35a4996b889ffe46f13e7f81d14a31bc22342ed368Daniel Dunbar}
36ecb640d51ba596941d9fcb9a3c5dd19dd1af7209Sebastian Redl
37ecb640d51ba596941d9fcb9a3c5dd19dd1af7209Sebastian Redl// PR5509 - Multi-level pointers
38ecb640d51ba596941d9fcb9a3c5dd19dd1af7209Sebastian Redlint f2() {
39ecb640d51ba596941d9fcb9a3c5dd19dd1af7209Sebastian Redl  typedef int *IntPtr;
40ecb640d51ba596941d9fcb9a3c5dd19dd1af7209Sebastian Redl  typedef IntPtr *IntPtrPtr;
41ecb640d51ba596941d9fcb9a3c5dd19dd1af7209Sebastian Redl  typedef IntPtr const *IntPtrConstPtr;
42ecb640d51ba596941d9fcb9a3c5dd19dd1af7209Sebastian Redl  IntPtrConstPtr i = 0;
43ecb640d51ba596941d9fcb9a3c5dd19dd1af7209Sebastian Redl  IntPtrPtr j = 0;
44ecb640d51ba596941d9fcb9a3c5dd19dd1af7209Sebastian Redl  return i != j;
45ecb640d51ba596941d9fcb9a3c5dd19dd1af7209Sebastian Redl}
46c11e7abaa01c7bcae2bed62cd184c18ea00ebfafDouglas Gregor
47c11e7abaa01c7bcae2bed62cd184c18ea00ebfafDouglas Gregor// PR5763
48c11e7abaa01c7bcae2bed62cd184c18ea00ebfafDouglas Gregortypedef double Matrix4[4][4];
49c11e7abaa01c7bcae2bed62cd184c18ea00ebfafDouglas Gregor
50c11e7abaa01c7bcae2bed62cd184c18ea00ebfafDouglas Gregorbool f(Matrix4 m1, const Matrix4 m2) {
51c11e7abaa01c7bcae2bed62cd184c18ea00ebfafDouglas Gregor  return m1 != m2;
52c11e7abaa01c7bcae2bed62cd184c18ea00ebfafDouglas Gregor}
535dfd9b7757839cadd1228e609ac9e098c4a3e279Douglas Gregor
545dfd9b7757839cadd1228e609ac9e098c4a3e279Douglas Gregor// PR6346
555dfd9b7757839cadd1228e609ac9e098c4a3e279Douglas Gregorbool f1(bool b, void **p, const void **q) {
5603028a90c18c484ab477e6535441ec5825a7328aChris Lattner  if (p == q) // expected-warning{{comparison of distinct pointer types ('void **' and 'const void **') uses non-standard composite pointer type 'const void *const *'}}
575dfd9b7757839cadd1228e609ac9e098c4a3e279Douglas Gregor    return false;
585dfd9b7757839cadd1228e609ac9e098c4a3e279Douglas Gregor
5903028a90c18c484ab477e6535441ec5825a7328aChris Lattner  return b? p : q; // expected-warning{{incompatible operand types ('void **' and 'const void **') use non-standard composite pointer type 'const void *const *'}}
605dfd9b7757839cadd1228e609ac9e098c4a3e279Douglas Gregor}
61