1*c05d8e5dSAndroid Build Coastguard Worker //===------------------------- catch_ptr_02.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 // UNSUPPORTED: libcxxabi-no-exceptions 11*c05d8e5dSAndroid Build Coastguard Worker 12*c05d8e5dSAndroid Build Coastguard Worker #include <cassert> 13*c05d8e5dSAndroid Build Coastguard Worker 14*c05d8e5dSAndroid Build Coastguard Worker // Clang emits warnings about exceptions of type 'Child' being caught by 15*c05d8e5dSAndroid Build Coastguard Worker // an earlier handler of type 'Base'. Congrats clang, you've just 16*c05d8e5dSAndroid Build Coastguard Worker // diagnosed the behavior under test. 17*c05d8e5dSAndroid Build Coastguard Worker #if defined(__clang__) 18*c05d8e5dSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wexceptions" 19*c05d8e5dSAndroid Build Coastguard Worker #endif 20*c05d8e5dSAndroid Build Coastguard Worker 21*c05d8e5dSAndroid Build Coastguard Worker #if __cplusplus < 201103L 22*c05d8e5dSAndroid Build Coastguard Worker #define DISABLE_NULLPTR_TESTS 23*c05d8e5dSAndroid Build Coastguard Worker #endif 24*c05d8e5dSAndroid Build Coastguard Worker 25*c05d8e5dSAndroid Build Coastguard Worker struct A {}; 26*c05d8e5dSAndroid Build Coastguard Worker A a; 27*c05d8e5dSAndroid Build Coastguard Worker const A ca = A(); 28*c05d8e5dSAndroid Build Coastguard Worker test1()29*c05d8e5dSAndroid Build Coastguard Workervoid test1 () 30*c05d8e5dSAndroid Build Coastguard Worker { 31*c05d8e5dSAndroid Build Coastguard Worker try 32*c05d8e5dSAndroid Build Coastguard Worker { 33*c05d8e5dSAndroid Build Coastguard Worker throw &a; 34*c05d8e5dSAndroid Build Coastguard Worker assert(false); 35*c05d8e5dSAndroid Build Coastguard Worker } 36*c05d8e5dSAndroid Build Coastguard Worker catch ( const A* ) 37*c05d8e5dSAndroid Build Coastguard Worker { 38*c05d8e5dSAndroid Build Coastguard Worker } 39*c05d8e5dSAndroid Build Coastguard Worker catch ( A *) 40*c05d8e5dSAndroid Build Coastguard Worker { 41*c05d8e5dSAndroid Build Coastguard Worker assert (false); 42*c05d8e5dSAndroid Build Coastguard Worker } 43*c05d8e5dSAndroid Build Coastguard Worker } 44*c05d8e5dSAndroid Build Coastguard Worker test2()45*c05d8e5dSAndroid Build Coastguard Workervoid test2 () 46*c05d8e5dSAndroid Build Coastguard Worker { 47*c05d8e5dSAndroid Build Coastguard Worker try 48*c05d8e5dSAndroid Build Coastguard Worker { 49*c05d8e5dSAndroid Build Coastguard Worker throw &a; 50*c05d8e5dSAndroid Build Coastguard Worker assert(false); 51*c05d8e5dSAndroid Build Coastguard Worker } 52*c05d8e5dSAndroid Build Coastguard Worker catch ( A* ) 53*c05d8e5dSAndroid Build Coastguard Worker { 54*c05d8e5dSAndroid Build Coastguard Worker } 55*c05d8e5dSAndroid Build Coastguard Worker catch ( const A *) 56*c05d8e5dSAndroid Build Coastguard Worker { 57*c05d8e5dSAndroid Build Coastguard Worker assert (false); 58*c05d8e5dSAndroid Build Coastguard Worker } 59*c05d8e5dSAndroid Build Coastguard Worker } 60*c05d8e5dSAndroid Build Coastguard Worker test3()61*c05d8e5dSAndroid Build Coastguard Workervoid test3 () 62*c05d8e5dSAndroid Build Coastguard Worker { 63*c05d8e5dSAndroid Build Coastguard Worker try 64*c05d8e5dSAndroid Build Coastguard Worker { 65*c05d8e5dSAndroid Build Coastguard Worker throw &ca; 66*c05d8e5dSAndroid Build Coastguard Worker assert(false); 67*c05d8e5dSAndroid Build Coastguard Worker } 68*c05d8e5dSAndroid Build Coastguard Worker catch ( const A* ) 69*c05d8e5dSAndroid Build Coastguard Worker { 70*c05d8e5dSAndroid Build Coastguard Worker } 71*c05d8e5dSAndroid Build Coastguard Worker catch ( A *) 72*c05d8e5dSAndroid Build Coastguard Worker { 73*c05d8e5dSAndroid Build Coastguard Worker assert (false); 74*c05d8e5dSAndroid Build Coastguard Worker } 75*c05d8e5dSAndroid Build Coastguard Worker } 76*c05d8e5dSAndroid Build Coastguard Worker test4()77*c05d8e5dSAndroid Build Coastguard Workervoid test4 () 78*c05d8e5dSAndroid Build Coastguard Worker { 79*c05d8e5dSAndroid Build Coastguard Worker try 80*c05d8e5dSAndroid Build Coastguard Worker { 81*c05d8e5dSAndroid Build Coastguard Worker throw &ca; 82*c05d8e5dSAndroid Build Coastguard Worker assert(false); 83*c05d8e5dSAndroid Build Coastguard Worker } 84*c05d8e5dSAndroid Build Coastguard Worker catch ( A *) 85*c05d8e5dSAndroid Build Coastguard Worker { 86*c05d8e5dSAndroid Build Coastguard Worker assert (false); 87*c05d8e5dSAndroid Build Coastguard Worker } 88*c05d8e5dSAndroid Build Coastguard Worker catch ( const A* ) 89*c05d8e5dSAndroid Build Coastguard Worker { 90*c05d8e5dSAndroid Build Coastguard Worker } 91*c05d8e5dSAndroid Build Coastguard Worker } 92*c05d8e5dSAndroid Build Coastguard Worker 93*c05d8e5dSAndroid Build Coastguard Worker struct base1 {int x;}; 94*c05d8e5dSAndroid Build Coastguard Worker struct base2 {int x;}; 95*c05d8e5dSAndroid Build Coastguard Worker struct derived : base1, base2 {}; 96*c05d8e5dSAndroid Build Coastguard Worker test5()97*c05d8e5dSAndroid Build Coastguard Workervoid test5 () 98*c05d8e5dSAndroid Build Coastguard Worker { 99*c05d8e5dSAndroid Build Coastguard Worker try 100*c05d8e5dSAndroid Build Coastguard Worker { 101*c05d8e5dSAndroid Build Coastguard Worker throw (derived*)0; 102*c05d8e5dSAndroid Build Coastguard Worker assert(false); 103*c05d8e5dSAndroid Build Coastguard Worker } 104*c05d8e5dSAndroid Build Coastguard Worker catch (base2 *p) { 105*c05d8e5dSAndroid Build Coastguard Worker assert (p == 0); 106*c05d8e5dSAndroid Build Coastguard Worker } 107*c05d8e5dSAndroid Build Coastguard Worker catch (...) 108*c05d8e5dSAndroid Build Coastguard Worker { 109*c05d8e5dSAndroid Build Coastguard Worker assert (false); 110*c05d8e5dSAndroid Build Coastguard Worker } 111*c05d8e5dSAndroid Build Coastguard Worker } 112*c05d8e5dSAndroid Build Coastguard Worker test6()113*c05d8e5dSAndroid Build Coastguard Workervoid test6 () 114*c05d8e5dSAndroid Build Coastguard Worker { 115*c05d8e5dSAndroid Build Coastguard Worker #if !defined(DISABLE_NULLPTR_TESTS) 116*c05d8e5dSAndroid Build Coastguard Worker try 117*c05d8e5dSAndroid Build Coastguard Worker { 118*c05d8e5dSAndroid Build Coastguard Worker throw nullptr; 119*c05d8e5dSAndroid Build Coastguard Worker assert(false); 120*c05d8e5dSAndroid Build Coastguard Worker } 121*c05d8e5dSAndroid Build Coastguard Worker catch (base2 *p) { 122*c05d8e5dSAndroid Build Coastguard Worker assert (p == nullptr); 123*c05d8e5dSAndroid Build Coastguard Worker } 124*c05d8e5dSAndroid Build Coastguard Worker catch (...) 125*c05d8e5dSAndroid Build Coastguard Worker { 126*c05d8e5dSAndroid Build Coastguard Worker assert (false); 127*c05d8e5dSAndroid Build Coastguard Worker } 128*c05d8e5dSAndroid Build Coastguard Worker #endif 129*c05d8e5dSAndroid Build Coastguard Worker } 130*c05d8e5dSAndroid Build Coastguard Worker test7()131*c05d8e5dSAndroid Build Coastguard Workervoid test7 () 132*c05d8e5dSAndroid Build Coastguard Worker { 133*c05d8e5dSAndroid Build Coastguard Worker try 134*c05d8e5dSAndroid Build Coastguard Worker { 135*c05d8e5dSAndroid Build Coastguard Worker throw (derived*)12; 136*c05d8e5dSAndroid Build Coastguard Worker assert(false); 137*c05d8e5dSAndroid Build Coastguard Worker } 138*c05d8e5dSAndroid Build Coastguard Worker catch (base2 *p) { 139*c05d8e5dSAndroid Build Coastguard Worker assert ((unsigned long)p == 12+sizeof(base1)); 140*c05d8e5dSAndroid Build Coastguard Worker } 141*c05d8e5dSAndroid Build Coastguard Worker catch (...) 142*c05d8e5dSAndroid Build Coastguard Worker { 143*c05d8e5dSAndroid Build Coastguard Worker assert (false); 144*c05d8e5dSAndroid Build Coastguard Worker } 145*c05d8e5dSAndroid Build Coastguard Worker } 146*c05d8e5dSAndroid Build Coastguard Worker 147*c05d8e5dSAndroid Build Coastguard Worker 148*c05d8e5dSAndroid Build Coastguard Worker struct vBase {}; 149*c05d8e5dSAndroid Build Coastguard Worker struct vDerived : virtual public vBase {}; 150*c05d8e5dSAndroid Build Coastguard Worker test8()151*c05d8e5dSAndroid Build Coastguard Workervoid test8 () 152*c05d8e5dSAndroid Build Coastguard Worker { 153*c05d8e5dSAndroid Build Coastguard Worker vDerived derived; 154*c05d8e5dSAndroid Build Coastguard Worker try 155*c05d8e5dSAndroid Build Coastguard Worker { 156*c05d8e5dSAndroid Build Coastguard Worker throw &derived; 157*c05d8e5dSAndroid Build Coastguard Worker assert(false); 158*c05d8e5dSAndroid Build Coastguard Worker } 159*c05d8e5dSAndroid Build Coastguard Worker catch (vBase *p) { 160*c05d8e5dSAndroid Build Coastguard Worker assert(p != 0); 161*c05d8e5dSAndroid Build Coastguard Worker } 162*c05d8e5dSAndroid Build Coastguard Worker catch (...) 163*c05d8e5dSAndroid Build Coastguard Worker { 164*c05d8e5dSAndroid Build Coastguard Worker assert (false); 165*c05d8e5dSAndroid Build Coastguard Worker } 166*c05d8e5dSAndroid Build Coastguard Worker } 167*c05d8e5dSAndroid Build Coastguard Worker test9()168*c05d8e5dSAndroid Build Coastguard Workervoid test9 () 169*c05d8e5dSAndroid Build Coastguard Worker { 170*c05d8e5dSAndroid Build Coastguard Worker #if !defined(DISABLE_NULLPTR_TESTS) 171*c05d8e5dSAndroid Build Coastguard Worker try 172*c05d8e5dSAndroid Build Coastguard Worker { 173*c05d8e5dSAndroid Build Coastguard Worker throw nullptr; 174*c05d8e5dSAndroid Build Coastguard Worker assert(false); 175*c05d8e5dSAndroid Build Coastguard Worker } 176*c05d8e5dSAndroid Build Coastguard Worker catch (vBase *p) { 177*c05d8e5dSAndroid Build Coastguard Worker assert(p == 0); 178*c05d8e5dSAndroid Build Coastguard Worker } 179*c05d8e5dSAndroid Build Coastguard Worker catch (...) 180*c05d8e5dSAndroid Build Coastguard Worker { 181*c05d8e5dSAndroid Build Coastguard Worker assert (false); 182*c05d8e5dSAndroid Build Coastguard Worker } 183*c05d8e5dSAndroid Build Coastguard Worker #endif 184*c05d8e5dSAndroid Build Coastguard Worker } 185*c05d8e5dSAndroid Build Coastguard Worker test10()186*c05d8e5dSAndroid Build Coastguard Workervoid test10 () 187*c05d8e5dSAndroid Build Coastguard Worker { 188*c05d8e5dSAndroid Build Coastguard Worker try 189*c05d8e5dSAndroid Build Coastguard Worker { 190*c05d8e5dSAndroid Build Coastguard Worker throw (vDerived*)0; 191*c05d8e5dSAndroid Build Coastguard Worker assert(false); 192*c05d8e5dSAndroid Build Coastguard Worker } 193*c05d8e5dSAndroid Build Coastguard Worker catch (vBase *p) { 194*c05d8e5dSAndroid Build Coastguard Worker assert(p == 0); 195*c05d8e5dSAndroid Build Coastguard Worker } 196*c05d8e5dSAndroid Build Coastguard Worker catch (...) 197*c05d8e5dSAndroid Build Coastguard Worker { 198*c05d8e5dSAndroid Build Coastguard Worker assert (false); 199*c05d8e5dSAndroid Build Coastguard Worker } 200*c05d8e5dSAndroid Build Coastguard Worker } 201*c05d8e5dSAndroid Build Coastguard Worker main()202*c05d8e5dSAndroid Build Coastguard Workerint main() 203*c05d8e5dSAndroid Build Coastguard Worker { 204*c05d8e5dSAndroid Build Coastguard Worker test1(); 205*c05d8e5dSAndroid Build Coastguard Worker test2(); 206*c05d8e5dSAndroid Build Coastguard Worker test3(); 207*c05d8e5dSAndroid Build Coastguard Worker test4(); 208*c05d8e5dSAndroid Build Coastguard Worker test5(); 209*c05d8e5dSAndroid Build Coastguard Worker test6(); 210*c05d8e5dSAndroid Build Coastguard Worker test7(); 211*c05d8e5dSAndroid Build Coastguard Worker test8(); 212*c05d8e5dSAndroid Build Coastguard Worker test9(); 213*c05d8e5dSAndroid Build Coastguard Worker test10(); 214*c05d8e5dSAndroid Build Coastguard Worker } 215