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