198 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 3// This test checks for the various conversions and casting operations4// with address-space-qualified pointers.5 6struct A { virtual ~A() {} };7struct B : A { };8 9typedef void *void_ptr;10typedef void __attribute__((address_space(1))) *void_ptr_1;11typedef void __attribute__((address_space(2))) *void_ptr_2;12 13typedef int *int_ptr;14typedef int __attribute__((address_space(1))) *int_ptr_1;15typedef int __attribute__((address_space(2))) *int_ptr_2;16 17typedef A *A_ptr;18typedef A __attribute__((address_space(1))) *A_ptr_1;19typedef A __attribute__((address_space(2))) *A_ptr_2;20 21typedef B *B_ptr;22typedef B __attribute__((address_space(1))) *B_ptr_1;23typedef B __attribute__((address_space(2))) *B_ptr_2;24 25void test_const_cast(int_ptr ip, int_ptr_1 ip1, int_ptr_2 ip2,26 A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,27 const int *cip, 28 const int __attribute__((address_space(1))) *cip1) {29 // Cannot use const_cast to cast between address spaces, add an30 // address space, or remove an address space.31 (void)const_cast<int_ptr>(ip1); // expected-error{{is not allowed}}32 (void)const_cast<int_ptr>(ip2); // expected-error{{is not allowed}}33 (void)const_cast<int_ptr_1>(ip); // expected-error{{is not allowed}}34 (void)const_cast<int_ptr_1>(ip2); // expected-error{{is not allowed}}35 (void)const_cast<int_ptr_2>(ip); // expected-error{{is not allowed}}36 (void)const_cast<int_ptr_2>(ip1); // expected-error{{is not allowed}}37 38 (void)const_cast<A_ptr>(ap1); // expected-error{{is not allowed}}39 (void)const_cast<A_ptr>(ap2); // expected-error{{is not allowed}}40 (void)const_cast<A_ptr_1>(ap); // expected-error{{is not allowed}}41 (void)const_cast<A_ptr_1>(ap2); // expected-error{{is not allowed}}42 (void)const_cast<A_ptr_2>(ap); // expected-error{{is not allowed}}43 (void)const_cast<A_ptr_2>(ap1); // expected-error{{is not allowed}}44 45 // It's acceptable to cast away constness.46 (void)const_cast<int_ptr>(cip);47 (void)const_cast<int_ptr_1>(cip1);48}49 50void test_static_cast(void_ptr vp, void_ptr_1 vp1, void_ptr_2 vp2,51 A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,52 B_ptr bp, B_ptr_1 bp1, B_ptr_2 bp2) {53 // Well-formed upcast54 (void)static_cast<A_ptr>(bp);55 (void)static_cast<A_ptr_1>(bp1);56 (void)static_cast<A_ptr_2>(bp2);57 58 // Well-formed downcast59 (void)static_cast<B_ptr>(ap);60 (void)static_cast<B_ptr_1>(ap1);61 (void)static_cast<B_ptr_2>(ap2);62 63 // Well-formed cast to/from void64 (void)static_cast<void_ptr>(ap);65 (void)static_cast<void_ptr_1>(ap1);66 (void)static_cast<void_ptr_2>(ap2);67 (void)static_cast<A_ptr>(vp);68 (void)static_cast<A_ptr_1>(vp1);69 (void)static_cast<A_ptr_2>(vp2);70 71 // Ill-formed upcasts72 (void)static_cast<A_ptr>(bp1); // expected-error{{is not allowed}}73 (void)static_cast<A_ptr>(bp2); // expected-error{{is not allowed}}74 (void)static_cast<A_ptr_1>(bp); // expected-error{{is not allowed}}75 (void)static_cast<A_ptr_1>(bp2); // expected-error{{is not allowed}}76 (void)static_cast<A_ptr_2>(bp); // expected-error{{is not allowed}}77 (void)static_cast<A_ptr_2>(bp1); // expected-error{{is not allowed}}78 79 // Ill-formed downcasts80 (void)static_cast<B_ptr>(ap1); // expected-error{{casts away qualifiers}}81 (void)static_cast<B_ptr>(ap2); // expected-error{{casts away qualifiers}}82 (void)static_cast<B_ptr_1>(ap); // expected-error{{casts away qualifiers}}83 (void)static_cast<B_ptr_1>(ap2); // expected-error{{casts away qualifiers}}84 (void)static_cast<B_ptr_2>(ap); // expected-error{{casts away qualifiers}}85 (void)static_cast<B_ptr_2>(ap1); // expected-error{{casts away qualifiers}}86 87 // Ill-formed cast to/from void88 (void)static_cast<void_ptr>(ap1); // expected-error{{is not allowed}}89 (void)static_cast<void_ptr>(ap2); // expected-error{{is not allowed}}90 (void)static_cast<void_ptr_1>(ap); // expected-error{{is not allowed}}91 (void)static_cast<void_ptr_1>(ap2); // expected-error{{is not allowed}}92 (void)static_cast<void_ptr_2>(ap); // expected-error{{is not allowed}}93 (void)static_cast<void_ptr_2>(ap1); // expected-error{{is not allowed}}94 (void)static_cast<A_ptr>(vp1); // expected-error{{casts away qualifiers}}95 (void)static_cast<A_ptr>(vp2); // expected-error{{casts away qualifiers}}96 (void)static_cast<A_ptr_1>(vp); // expected-error{{casts away qualifiers}}97 (void)static_cast<A_ptr_1>(vp2); // expected-error{{casts away qualifiers}}98 (void)static_cast<A_ptr_2>(vp); // expected-error{{casts away qualifiers}}99 (void)static_cast<A_ptr_2>(vp1); // expected-error{{casts away qualifiers}}100}101 102void test_dynamic_cast(A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,103 B_ptr bp, B_ptr_1 bp1, B_ptr_2 bp2) {104 // Well-formed upcast105 (void)dynamic_cast<A_ptr>(bp);106 (void)dynamic_cast<A_ptr_1>(bp1);107 (void)dynamic_cast<A_ptr_2>(bp2);108 109 // Well-formed downcast110 (void)dynamic_cast<B_ptr>(ap);111 (void)dynamic_cast<B_ptr_1>(ap1);112 (void)dynamic_cast<B_ptr_2>(ap2);113 114 // Ill-formed upcasts115 (void)dynamic_cast<A_ptr>(bp1); // expected-error{{casts away qualifiers}}116 (void)dynamic_cast<A_ptr>(bp2); // expected-error{{casts away qualifiers}}117 (void)dynamic_cast<A_ptr_1>(bp); // expected-error{{casts away qualifiers}}118 (void)dynamic_cast<A_ptr_1>(bp2); // expected-error{{casts away qualifiers}}119 (void)dynamic_cast<A_ptr_2>(bp); // expected-error{{casts away qualifiers}}120 (void)dynamic_cast<A_ptr_2>(bp1); // expected-error{{casts away qualifiers}}121 122 // Ill-formed downcasts123 (void)dynamic_cast<B_ptr>(ap1); // expected-error{{casts away qualifiers}}124 (void)dynamic_cast<B_ptr>(ap2); // expected-error{{casts away qualifiers}}125 (void)dynamic_cast<B_ptr_1>(ap); // expected-error{{casts away qualifiers}}126 (void)dynamic_cast<B_ptr_1>(ap2); // expected-error{{casts away qualifiers}}127 (void)dynamic_cast<B_ptr_2>(ap); // expected-error{{casts away qualifiers}}128 (void)dynamic_cast<B_ptr_2>(ap1); // expected-error{{casts away qualifiers}}129}130 131void test_reinterpret_cast(void_ptr vp, void_ptr_1 vp1, void_ptr_2 vp2,132 A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,133 B_ptr bp, B_ptr_1 bp1, B_ptr_2 bp2,134 const void __attribute__((address_space(1))) * cvp1) {135 // reinterpret_cast can't be used to cast to a different address space unless they are matching (i.e. overlapping).136 (void)reinterpret_cast<A_ptr>(ap1); // expected-error{{reinterpret_cast from 'A_ptr_1' (aka '__attribute__((address_space(1))) A *') to 'A_ptr' (aka 'A *') is not allowed}}137 (void)reinterpret_cast<A_ptr>(ap2); // expected-error{{reinterpret_cast from 'A_ptr_2' (aka '__attribute__((address_space(2))) A *') to 'A_ptr' (aka 'A *') is not allowed}}138 (void)reinterpret_cast<A_ptr>(bp);139 (void)reinterpret_cast<A_ptr>(bp1); // expected-error{{reinterpret_cast from 'B_ptr_1' (aka '__attribute__((address_space(1))) B *') to 'A_ptr' (aka 'A *') is not allowed}}140 (void)reinterpret_cast<A_ptr>(bp2); // expected-error{{reinterpret_cast from 'B_ptr_2' (aka '__attribute__((address_space(2))) B *') to 'A_ptr' (aka 'A *') is not allowed}}141 (void)reinterpret_cast<A_ptr>(vp);142 (void)reinterpret_cast<A_ptr>(vp1); // expected-error{{reinterpret_cast from 'void_ptr_1' (aka '__attribute__((address_space(1))) void *') to 'A_ptr' (aka 'A *') is not allowed}}143 (void)reinterpret_cast<A_ptr>(vp2); // expected-error{{reinterpret_cast from 'void_ptr_2' (aka '__attribute__((address_space(2))) void *') to 'A_ptr' (aka 'A *') is not allowed}}144 (void)reinterpret_cast<A_ptr_1>(ap); // expected-error{{reinterpret_cast from 'A_ptr' (aka 'A *') to 'A_ptr_1' (aka '__attribute__((address_space(1))) A *') is not allowed}}145 (void)reinterpret_cast<A_ptr_1>(ap2); // expected-error{{reinterpret_cast from 'A_ptr_2' (aka '__attribute__((address_space(2))) A *') to 'A_ptr_1' (aka '__attribute__((address_space(1))) A *') is not allowed}}146 (void)reinterpret_cast<A_ptr_1>(bp); // expected-error{{reinterpret_cast from 'B_ptr' (aka 'B *') to 'A_ptr_1' (aka '__attribute__((address_space(1))) A *') is not allowed}}147 (void)reinterpret_cast<A_ptr_1>(bp1);148 (void)reinterpret_cast<A_ptr_1>(bp2); // expected-error{{reinterpret_cast from 'B_ptr_2' (aka '__attribute__((address_space(2))) B *') to 'A_ptr_1' (aka '__attribute__((address_space(1))) A *') is not allowed}}149 (void)reinterpret_cast<A_ptr_1>(vp); // expected-error{{reinterpret_cast from 'void_ptr' (aka 'void *') to 'A_ptr_1' (aka '__attribute__((address_space(1))) A *') is not allowed}}150 (void)reinterpret_cast<A_ptr_1>(vp1);151 (void)reinterpret_cast<A_ptr_1>(vp2); // expected-error{{reinterpret_cast from 'void_ptr_2' (aka '__attribute__((address_space(2))) void *') to 'A_ptr_1' (aka '__attribute__((address_space(1))) A *') is not allowed}}152 153 // ... but don't try to cast away constness!154 (void)reinterpret_cast<A_ptr_2>(cvp1); // expected-error{{casts away qualifiers}}155}156 157void test_cstyle_cast(void_ptr vp, void_ptr_1 vp1, void_ptr_2 vp2,158 A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,159 B_ptr bp, B_ptr_1 bp1, B_ptr_2 bp2,160 const void __attribute__((address_space(1))) *cvp1) {161 // C-style casts are the wild west of casts.162 (void)(A_ptr)(ap1);163 (void)(A_ptr)(ap2);164 (void)(A_ptr)(bp);165 (void)(A_ptr)(bp1);166 (void)(A_ptr)(bp2);167 (void)(A_ptr)(vp);168 (void)(A_ptr)(vp1);169 (void)(A_ptr)(vp2);170 (void)(A_ptr_1)(ap);171 (void)(A_ptr_1)(ap2);172 (void)(A_ptr_1)(bp);173 (void)(A_ptr_1)(bp1);174 (void)(A_ptr_1)(bp2);175 (void)(A_ptr_1)(vp);176 (void)(A_ptr_1)(vp1);177 (void)(A_ptr_1)(vp2);178 (void)(A_ptr_2)(cvp1);179}180 181void test_implicit_conversion(void_ptr vp, void_ptr_1 vp1, void_ptr_2 vp2,182 A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,183 B_ptr bp, B_ptr_1 bp1, B_ptr_2 bp2) {184 // Well-formed conversions185 void_ptr vpA = ap;186 void_ptr_1 vp_1A = ap1;187 void_ptr_2 vp_2A = ap2;188 A_ptr ap_A = bp;189 A_ptr_1 ap_A1 = bp1;190 A_ptr_2 ap_A2 = bp2;191 192 // Ill-formed conversions193 void_ptr vpB = ap1; // expected-error{{cannot initialize a variable of type}}194 void_ptr_1 vp_1B = ap2; // expected-error{{cannot initialize a variable of type}}195 A_ptr ap_B = bp1; // expected-error{{cannot initialize a variable of type}}196 A_ptr_1 ap_B1 = bp2; // expected-error{{cannot initialize a variable of type}}197}198