composite-pointer-type.cpp revision ecb640d51ba596941d9fcb9a3c5dd19dd1af7209
130eed0fc54c3ac046a7cf9e41aaf75c2a177640bDouglas Gregor// RUN: clang-cc -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} 46