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 Workerstruct 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 Workervoid 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 Workerstruct 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 Workervoid 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 Workerstruct 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 Workervoid 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 Workerstruct C2 { virtual ~C2() {} Pad1 _; }; ~C3t4::C3103*c05d8e5dSAndroid Build Coastguard Workerstruct 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 Workervoid 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 Workerstruct Dummy { virtual ~Dummy() {} Pad1 _; }; ~Srct5::Src127*c05d8e5dSAndroid Build Coastguard Workerstruct 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 Workervoid 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 Workerint 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