1*c05d8e5dSAndroid Build Coastguard Worker //===--------------------- inherited_exception.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 // This test case checks specifically the cases under C++ ABI 15.3.1, and 15.3.2 11*c05d8e5dSAndroid Build Coastguard Worker // 12*c05d8e5dSAndroid Build Coastguard Worker // C++ ABI 15.3: 13*c05d8e5dSAndroid Build Coastguard Worker // A handler is a match for an exception object of type E if 14*c05d8e5dSAndroid Build Coastguard Worker // / * The handler is of type cv T or cv T& and E and T are the same type \ 15*c05d8e5dSAndroid Build Coastguard Worker // | (ignoring the top-level cv-qualifiers), or | 16*c05d8e5dSAndroid Build Coastguard Worker // | * the handler is of type cv T or cv T& and T is an unambiguous base | 17*c05d8e5dSAndroid Build Coastguard Worker // \ class of E, or / 18*c05d8e5dSAndroid Build Coastguard Worker // * the handler is of type cv1 T* cv2 and E is a pointer type that can 19*c05d8e5dSAndroid Build Coastguard Worker // be converted to the type of the handler by either or both of 20*c05d8e5dSAndroid Build Coastguard Worker // o a standard pointer conversion (4.10 [conv.ptr]) not involving 21*c05d8e5dSAndroid Build Coastguard Worker // conversions to private or protected or ambiguous classes 22*c05d8e5dSAndroid Build Coastguard Worker // o a qualification conversion 23*c05d8e5dSAndroid Build Coastguard Worker // * the handler is a pointer or pointer to member type and E is 24*c05d8e5dSAndroid Build Coastguard Worker // std::nullptr_t 25*c05d8e5dSAndroid Build Coastguard Worker // 26*c05d8e5dSAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 27*c05d8e5dSAndroid Build Coastguard Worker 28*c05d8e5dSAndroid Build Coastguard Worker // UNSUPPORTED: libcxxabi-no-exceptions 29*c05d8e5dSAndroid Build Coastguard Worker 30*c05d8e5dSAndroid Build Coastguard Worker // Clang emits warnings about exceptions of type 'Child' being caught by 31*c05d8e5dSAndroid Build Coastguard Worker // an earlier handler of type 'Base'. Congrats clang, you've just 32*c05d8e5dSAndroid Build Coastguard Worker // diagnosed the behavior under test. 33*c05d8e5dSAndroid Build Coastguard Worker #if defined(__clang__) 34*c05d8e5dSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wexceptions" 35*c05d8e5dSAndroid Build Coastguard Worker #endif 36*c05d8e5dSAndroid Build Coastguard Worker 37*c05d8e5dSAndroid Build Coastguard Worker #include <assert.h> 38*c05d8e5dSAndroid Build Coastguard Worker 39*c05d8e5dSAndroid Build Coastguard Worker struct Base { 40*c05d8e5dSAndroid Build Coastguard Worker int b1; 41*c05d8e5dSAndroid Build Coastguard Worker }; 42*c05d8e5dSAndroid Build Coastguard Worker 43*c05d8e5dSAndroid Build Coastguard Worker struct Base2 { 44*c05d8e5dSAndroid Build Coastguard Worker int b2; 45*c05d8e5dSAndroid Build Coastguard Worker }; 46*c05d8e5dSAndroid Build Coastguard Worker 47*c05d8e5dSAndroid Build Coastguard Worker struct Child : public Base, public Base2 { 48*c05d8e5dSAndroid Build Coastguard Worker int c; 49*c05d8e5dSAndroid Build Coastguard Worker }; 50*c05d8e5dSAndroid Build Coastguard Worker f1()51*c05d8e5dSAndroid Build Coastguard Workervoid f1() { 52*c05d8e5dSAndroid Build Coastguard Worker Child child; 53*c05d8e5dSAndroid Build Coastguard Worker child.b1 = 10; 54*c05d8e5dSAndroid Build Coastguard Worker child.b2 = 11; 55*c05d8e5dSAndroid Build Coastguard Worker child.c = 12; 56*c05d8e5dSAndroid Build Coastguard Worker throw child; 57*c05d8e5dSAndroid Build Coastguard Worker } 58*c05d8e5dSAndroid Build Coastguard Worker f2()59*c05d8e5dSAndroid Build Coastguard Workervoid f2() { 60*c05d8e5dSAndroid Build Coastguard Worker Child child; 61*c05d8e5dSAndroid Build Coastguard Worker child.b1 = 10; 62*c05d8e5dSAndroid Build Coastguard Worker child.b2 = 11; 63*c05d8e5dSAndroid Build Coastguard Worker child.c = 12; 64*c05d8e5dSAndroid Build Coastguard Worker throw static_cast<Base2&>(child); 65*c05d8e5dSAndroid Build Coastguard Worker } 66*c05d8e5dSAndroid Build Coastguard Worker f3()67*c05d8e5dSAndroid Build Coastguard Workervoid f3() { 68*c05d8e5dSAndroid Build Coastguard Worker static Child child; 69*c05d8e5dSAndroid Build Coastguard Worker child.b1 = 10; 70*c05d8e5dSAndroid Build Coastguard Worker child.b2 = 11; 71*c05d8e5dSAndroid Build Coastguard Worker child.c = 12; 72*c05d8e5dSAndroid Build Coastguard Worker throw static_cast<Base2*>(&child); 73*c05d8e5dSAndroid Build Coastguard Worker } 74*c05d8e5dSAndroid Build Coastguard Worker main()75*c05d8e5dSAndroid Build Coastguard Workerint main() 76*c05d8e5dSAndroid Build Coastguard Worker { 77*c05d8e5dSAndroid Build Coastguard Worker try 78*c05d8e5dSAndroid Build Coastguard Worker { 79*c05d8e5dSAndroid Build Coastguard Worker f1(); 80*c05d8e5dSAndroid Build Coastguard Worker assert(false); 81*c05d8e5dSAndroid Build Coastguard Worker } 82*c05d8e5dSAndroid Build Coastguard Worker catch (const Child& c) 83*c05d8e5dSAndroid Build Coastguard Worker { 84*c05d8e5dSAndroid Build Coastguard Worker assert(true); 85*c05d8e5dSAndroid Build Coastguard Worker } 86*c05d8e5dSAndroid Build Coastguard Worker catch (const Base& b) 87*c05d8e5dSAndroid Build Coastguard Worker { 88*c05d8e5dSAndroid Build Coastguard Worker assert(false); 89*c05d8e5dSAndroid Build Coastguard Worker } 90*c05d8e5dSAndroid Build Coastguard Worker catch (...) 91*c05d8e5dSAndroid Build Coastguard Worker { 92*c05d8e5dSAndroid Build Coastguard Worker assert(false); 93*c05d8e5dSAndroid Build Coastguard Worker } 94*c05d8e5dSAndroid Build Coastguard Worker 95*c05d8e5dSAndroid Build Coastguard Worker try 96*c05d8e5dSAndroid Build Coastguard Worker { 97*c05d8e5dSAndroid Build Coastguard Worker f1(); 98*c05d8e5dSAndroid Build Coastguard Worker assert(false); 99*c05d8e5dSAndroid Build Coastguard Worker } 100*c05d8e5dSAndroid Build Coastguard Worker catch (const Base& c) 101*c05d8e5dSAndroid Build Coastguard Worker { 102*c05d8e5dSAndroid Build Coastguard Worker assert(true); 103*c05d8e5dSAndroid Build Coastguard Worker } 104*c05d8e5dSAndroid Build Coastguard Worker catch (const Child& b) 105*c05d8e5dSAndroid Build Coastguard Worker { 106*c05d8e5dSAndroid Build Coastguard Worker assert(false); 107*c05d8e5dSAndroid Build Coastguard Worker } 108*c05d8e5dSAndroid Build Coastguard Worker catch (...) 109*c05d8e5dSAndroid Build Coastguard Worker { 110*c05d8e5dSAndroid Build Coastguard Worker assert(false); 111*c05d8e5dSAndroid Build Coastguard Worker } 112*c05d8e5dSAndroid Build Coastguard Worker 113*c05d8e5dSAndroid Build Coastguard Worker try 114*c05d8e5dSAndroid Build Coastguard Worker { 115*c05d8e5dSAndroid Build Coastguard Worker f1(); 116*c05d8e5dSAndroid Build Coastguard Worker assert(false); 117*c05d8e5dSAndroid Build Coastguard Worker } 118*c05d8e5dSAndroid Build Coastguard Worker catch (const Base2& c) 119*c05d8e5dSAndroid Build Coastguard Worker { 120*c05d8e5dSAndroid Build Coastguard Worker assert(true); 121*c05d8e5dSAndroid Build Coastguard Worker } 122*c05d8e5dSAndroid Build Coastguard Worker catch (const Child& b) 123*c05d8e5dSAndroid Build Coastguard Worker { 124*c05d8e5dSAndroid Build Coastguard Worker assert(false); 125*c05d8e5dSAndroid Build Coastguard Worker } 126*c05d8e5dSAndroid Build Coastguard Worker catch (...) 127*c05d8e5dSAndroid Build Coastguard Worker { 128*c05d8e5dSAndroid Build Coastguard Worker assert(false); 129*c05d8e5dSAndroid Build Coastguard Worker } 130*c05d8e5dSAndroid Build Coastguard Worker 131*c05d8e5dSAndroid Build Coastguard Worker try 132*c05d8e5dSAndroid Build Coastguard Worker { 133*c05d8e5dSAndroid Build Coastguard Worker f2(); 134*c05d8e5dSAndroid Build Coastguard Worker assert(false); 135*c05d8e5dSAndroid Build Coastguard Worker } 136*c05d8e5dSAndroid Build Coastguard Worker catch (const Child& c) 137*c05d8e5dSAndroid Build Coastguard Worker { 138*c05d8e5dSAndroid Build Coastguard Worker assert(false); 139*c05d8e5dSAndroid Build Coastguard Worker } 140*c05d8e5dSAndroid Build Coastguard Worker catch (const Base& b) 141*c05d8e5dSAndroid Build Coastguard Worker { 142*c05d8e5dSAndroid Build Coastguard Worker assert(false); 143*c05d8e5dSAndroid Build Coastguard Worker } 144*c05d8e5dSAndroid Build Coastguard Worker catch (const Base2& b) 145*c05d8e5dSAndroid Build Coastguard Worker { 146*c05d8e5dSAndroid Build Coastguard Worker assert(true); 147*c05d8e5dSAndroid Build Coastguard Worker } 148*c05d8e5dSAndroid Build Coastguard Worker catch (...) 149*c05d8e5dSAndroid Build Coastguard Worker { 150*c05d8e5dSAndroid Build Coastguard Worker assert(false); 151*c05d8e5dSAndroid Build Coastguard Worker } 152*c05d8e5dSAndroid Build Coastguard Worker 153*c05d8e5dSAndroid Build Coastguard Worker try 154*c05d8e5dSAndroid Build Coastguard Worker { 155*c05d8e5dSAndroid Build Coastguard Worker f3(); 156*c05d8e5dSAndroid Build Coastguard Worker assert(false); 157*c05d8e5dSAndroid Build Coastguard Worker } 158*c05d8e5dSAndroid Build Coastguard Worker catch (const Base* c) 159*c05d8e5dSAndroid Build Coastguard Worker { 160*c05d8e5dSAndroid Build Coastguard Worker assert(false); 161*c05d8e5dSAndroid Build Coastguard Worker } 162*c05d8e5dSAndroid Build Coastguard Worker catch (const Child* b) 163*c05d8e5dSAndroid Build Coastguard Worker { 164*c05d8e5dSAndroid Build Coastguard Worker assert(false); 165*c05d8e5dSAndroid Build Coastguard Worker } 166*c05d8e5dSAndroid Build Coastguard Worker catch (const Base2* c) 167*c05d8e5dSAndroid Build Coastguard Worker { 168*c05d8e5dSAndroid Build Coastguard Worker assert(true); 169*c05d8e5dSAndroid Build Coastguard Worker } 170*c05d8e5dSAndroid Build Coastguard Worker catch (...) 171*c05d8e5dSAndroid Build Coastguard Worker { 172*c05d8e5dSAndroid Build Coastguard Worker assert(false); 173*c05d8e5dSAndroid Build Coastguard Worker } 174*c05d8e5dSAndroid Build Coastguard Worker } 175