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