xref: /aosp_15_r20/external/libcxxabi/test/dynamic_cast.pass.cpp (revision c05d8e5dc3e10f6ce4317e8bc22cc4a25f55fa94)
1*c05d8e5dSAndroid Build Coastguard Worker //===------------------------- dynamic_cast.pass.cpp ----------------------===//
2*c05d8e5dSAndroid Build Coastguard Worker //
3*c05d8e5dSAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*c05d8e5dSAndroid Build Coastguard Worker //
5*c05d8e5dSAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
6*c05d8e5dSAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
7*c05d8e5dSAndroid Build Coastguard Worker //
8*c05d8e5dSAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*c05d8e5dSAndroid Build Coastguard Worker 
10*c05d8e5dSAndroid Build Coastguard Worker #include <cassert>
11*c05d8e5dSAndroid Build Coastguard Worker 
12*c05d8e5dSAndroid Build Coastguard Worker // This test explicitly tests dynamic cast with types that have inaccessible
13*c05d8e5dSAndroid Build Coastguard Worker // bases.
14*c05d8e5dSAndroid Build Coastguard Worker #if defined(__clang__)
15*c05d8e5dSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Winaccessible-base"
16*c05d8e5dSAndroid Build Coastguard Worker #endif
17*c05d8e5dSAndroid Build Coastguard Worker 
18*c05d8e5dSAndroid Build Coastguard Worker typedef char Pad1[43981];
19*c05d8e5dSAndroid Build Coastguard Worker typedef char Pad2[34981];
20*c05d8e5dSAndroid Build Coastguard Worker typedef char Pad3[93481];
21*c05d8e5dSAndroid Build Coastguard Worker typedef char Pad4[13489];
22*c05d8e5dSAndroid Build Coastguard Worker typedef char Pad5[81349];
23*c05d8e5dSAndroid Build Coastguard Worker typedef char Pad6[34819];
24*c05d8e5dSAndroid Build Coastguard Worker typedef char Pad7[3489];
25*c05d8e5dSAndroid Build Coastguard Worker 
26*c05d8e5dSAndroid Build Coastguard Worker namespace t1
27*c05d8e5dSAndroid Build Coastguard Worker {
28*c05d8e5dSAndroid Build Coastguard Worker 
29*c05d8e5dSAndroid Build Coastguard Worker // PR33425
~C3t1::C330*c05d8e5dSAndroid Build Coastguard Worker struct C3 { virtual ~C3() {} Pad1 _; };
31*c05d8e5dSAndroid Build Coastguard Worker struct C5 : protected virtual C3 { Pad2 _; };
32*c05d8e5dSAndroid Build Coastguard Worker struct C6 : virtual C5 { Pad3 _; };
33*c05d8e5dSAndroid Build Coastguard Worker struct C7 : virtual C3 { Pad4 _; };
34*c05d8e5dSAndroid Build Coastguard Worker struct C9 : C6, C7 { Pad5 _; };
35*c05d8e5dSAndroid Build Coastguard Worker 
36*c05d8e5dSAndroid Build Coastguard Worker C9 c9;
37*c05d8e5dSAndroid Build Coastguard Worker C3 *c3 = &c9;
38*c05d8e5dSAndroid Build Coastguard Worker 
test()39*c05d8e5dSAndroid Build Coastguard Worker void test()
40*c05d8e5dSAndroid Build Coastguard Worker {
41*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<C3*>(c3) == static_cast<C3*>(&c9));
42*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<C5*>(c3) == static_cast<C5*>(&c9));
43*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<C6*>(c3) == static_cast<C6*>(&c9));
44*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<C7*>(c3) == static_cast<C7*>(&c9));
45*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<C9*>(c3) == static_cast<C9*>(&c9));
46*c05d8e5dSAndroid Build Coastguard Worker }
47*c05d8e5dSAndroid Build Coastguard Worker 
48*c05d8e5dSAndroid Build Coastguard Worker }  // t1
49*c05d8e5dSAndroid Build Coastguard Worker 
50*c05d8e5dSAndroid Build Coastguard Worker namespace t2
51*c05d8e5dSAndroid Build Coastguard Worker {
52*c05d8e5dSAndroid Build Coastguard Worker 
53*c05d8e5dSAndroid Build Coastguard Worker // PR33425
~Srct2::Src54*c05d8e5dSAndroid Build Coastguard Worker struct Src { virtual ~Src() {} Pad1 _; };
55*c05d8e5dSAndroid Build Coastguard Worker struct Mask : protected virtual Src { Pad2 _; };
56*c05d8e5dSAndroid Build Coastguard Worker struct Dest : Mask { Pad3 _; };
57*c05d8e5dSAndroid Build Coastguard Worker struct Root : Dest, virtual Src { Pad4 _; };
58*c05d8e5dSAndroid Build Coastguard Worker 
59*c05d8e5dSAndroid Build Coastguard Worker Root root;
60*c05d8e5dSAndroid Build Coastguard Worker Src *src = &root;
61*c05d8e5dSAndroid Build Coastguard Worker 
test()62*c05d8e5dSAndroid Build Coastguard Worker void test()
63*c05d8e5dSAndroid Build Coastguard Worker {
64*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Src*>(src) == static_cast<Src*>(&root));
65*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Mask*>(src) == static_cast<Mask*>(&root));
66*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Dest*>(src) == static_cast<Dest*>(&root));
67*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Root*>(src) == static_cast<Root*>(&root));
68*c05d8e5dSAndroid Build Coastguard Worker }
69*c05d8e5dSAndroid Build Coastguard Worker 
70*c05d8e5dSAndroid Build Coastguard Worker }  // t2
71*c05d8e5dSAndroid Build Coastguard Worker 
72*c05d8e5dSAndroid Build Coastguard Worker namespace t3
73*c05d8e5dSAndroid Build Coastguard Worker {
74*c05d8e5dSAndroid Build Coastguard Worker 
75*c05d8e5dSAndroid Build Coastguard Worker // PR33487
~Class1t3::Class176*c05d8e5dSAndroid Build Coastguard Worker struct Class1 { virtual ~Class1() {} Pad1 _; };
77*c05d8e5dSAndroid Build Coastguard Worker struct Shared : virtual Class1 { Pad2 _; };
78*c05d8e5dSAndroid Build Coastguard Worker struct Class6 : virtual Shared { Pad3 _; };
79*c05d8e5dSAndroid Build Coastguard Worker struct Left : Class6 { Pad4 _; };
80*c05d8e5dSAndroid Build Coastguard Worker struct Right : Class6 { Pad5 _; };
81*c05d8e5dSAndroid Build Coastguard Worker struct Main : Left, Right { Pad6 _; };
82*c05d8e5dSAndroid Build Coastguard Worker 
83*c05d8e5dSAndroid Build Coastguard Worker Main m;
84*c05d8e5dSAndroid Build Coastguard Worker Class1 *c1 = &m;
85*c05d8e5dSAndroid Build Coastguard Worker 
test()86*c05d8e5dSAndroid Build Coastguard Worker void test()
87*c05d8e5dSAndroid Build Coastguard Worker {
88*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Class1*>(c1) == static_cast<Class1*>(&m));
89*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Shared*>(c1) == static_cast<Shared*>(&m));
90*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Class6*>(c1) == 0);
91*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Left*>(c1) == static_cast<Left*>(&m));
92*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Right*>(c1) == static_cast<Right*>(&m));
93*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Main*>(c1) == static_cast<Main*>(&m));
94*c05d8e5dSAndroid Build Coastguard Worker }
95*c05d8e5dSAndroid Build Coastguard Worker 
96*c05d8e5dSAndroid Build Coastguard Worker }  // t3
97*c05d8e5dSAndroid Build Coastguard Worker 
98*c05d8e5dSAndroid Build Coastguard Worker namespace t4
99*c05d8e5dSAndroid Build Coastguard Worker {
100*c05d8e5dSAndroid Build Coastguard Worker 
101*c05d8e5dSAndroid Build Coastguard Worker // PR33439
~C2t4::C2102*c05d8e5dSAndroid Build Coastguard Worker struct C2 { virtual ~C2() {} Pad1 _; };
~C3t4::C3103*c05d8e5dSAndroid Build Coastguard Worker struct C3 { virtual ~C3() {} Pad2 _; };
104*c05d8e5dSAndroid Build Coastguard Worker struct C4 : C3 { Pad3 _; };
105*c05d8e5dSAndroid Build Coastguard Worker struct C8 : C2, virtual C4 { Pad4 _; };
106*c05d8e5dSAndroid Build Coastguard Worker struct C9 : C4, C8 { Pad5 _; };
107*c05d8e5dSAndroid Build Coastguard Worker 
108*c05d8e5dSAndroid Build Coastguard Worker C9 c9;
109*c05d8e5dSAndroid Build Coastguard Worker C2 *c2 = &c9;
110*c05d8e5dSAndroid Build Coastguard Worker 
test()111*c05d8e5dSAndroid Build Coastguard Worker void test()
112*c05d8e5dSAndroid Build Coastguard Worker {
113*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<C2*>(c2) == static_cast<C2*>(&c9));
114*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<C3*>(c2) == 0);
115*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<C4*>(c2) == 0);
116*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<C8*>(c2) == static_cast<C8*>(&c9));
117*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<C9*>(c2) == static_cast<C9*>(&c9));
118*c05d8e5dSAndroid Build Coastguard Worker }
119*c05d8e5dSAndroid Build Coastguard Worker 
120*c05d8e5dSAndroid Build Coastguard Worker }  // t4
121*c05d8e5dSAndroid Build Coastguard Worker 
122*c05d8e5dSAndroid Build Coastguard Worker namespace t5
123*c05d8e5dSAndroid Build Coastguard Worker {
124*c05d8e5dSAndroid Build Coastguard Worker 
125*c05d8e5dSAndroid Build Coastguard Worker // PR33439
~Dummyt5::Dummy126*c05d8e5dSAndroid Build Coastguard Worker struct Dummy { virtual ~Dummy() {} Pad1 _; };
~Srct5::Src127*c05d8e5dSAndroid Build Coastguard Worker struct Src { virtual ~Src() {} Pad2 _; };
128*c05d8e5dSAndroid Build Coastguard Worker struct Dest : Dummy { Pad3 _; };
129*c05d8e5dSAndroid Build Coastguard Worker struct A1 : Dest { Pad4 _; };
130*c05d8e5dSAndroid Build Coastguard Worker struct A2 : Dest { Pad5 _; };
131*c05d8e5dSAndroid Build Coastguard Worker struct Root : Src, A1, A2 { Pad6 _; };
132*c05d8e5dSAndroid Build Coastguard Worker 
133*c05d8e5dSAndroid Build Coastguard Worker Root root;
134*c05d8e5dSAndroid Build Coastguard Worker Src *src = &root;
135*c05d8e5dSAndroid Build Coastguard Worker 
test()136*c05d8e5dSAndroid Build Coastguard Worker void test()
137*c05d8e5dSAndroid Build Coastguard Worker {
138*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Dummy*>(src) == 0);
139*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Src*>(src) == static_cast<Src*>(&root));
140*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<Dest*>(src) == 0);
141*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<A1*>(src) == static_cast<A1*>(&root));
142*c05d8e5dSAndroid Build Coastguard Worker     assert(dynamic_cast<A2*>(src) == static_cast<A2*>(&root));
143*c05d8e5dSAndroid Build Coastguard Worker }
144*c05d8e5dSAndroid Build Coastguard Worker 
145*c05d8e5dSAndroid Build Coastguard Worker }  // t5
146*c05d8e5dSAndroid Build Coastguard Worker 
main()147*c05d8e5dSAndroid Build Coastguard Worker int main()
148*c05d8e5dSAndroid Build Coastguard Worker {
149*c05d8e5dSAndroid Build Coastguard Worker     t1::test();
150*c05d8e5dSAndroid Build Coastguard Worker     t2::test();
151*c05d8e5dSAndroid Build Coastguard Worker     t3::test();
152*c05d8e5dSAndroid Build Coastguard Worker     t4::test();
153*c05d8e5dSAndroid Build Coastguard Worker     t5::test();
154*c05d8e5dSAndroid Build Coastguard Worker }
155