1*c05d8e5dSAndroid Build Coastguard Worker //===------------------------- unwind_05.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 // REQUIRES: c++98 || c++03 || c++11 || c++14 12*c05d8e5dSAndroid Build Coastguard Worker 13*c05d8e5dSAndroid Build Coastguard Worker #include <exception> 14*c05d8e5dSAndroid Build Coastguard Worker #include <stdlib.h> 15*c05d8e5dSAndroid Build Coastguard Worker #include <assert.h> 16*c05d8e5dSAndroid Build Coastguard Worker 17*c05d8e5dSAndroid Build Coastguard Worker #if defined(__GNUC__) 18*c05d8e5dSAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wunreachable-code" 19*c05d8e5dSAndroid Build Coastguard Worker #endif 20*c05d8e5dSAndroid Build Coastguard Worker 21*c05d8e5dSAndroid Build Coastguard Worker struct A 22*c05d8e5dSAndroid Build Coastguard Worker { 23*c05d8e5dSAndroid Build Coastguard Worker static int count; 24*c05d8e5dSAndroid Build Coastguard Worker int id_; AA25*c05d8e5dSAndroid Build Coastguard Worker A() : id_(++count) {} ~AA26*c05d8e5dSAndroid Build Coastguard Worker ~A() {assert(id_ == count--);} 27*c05d8e5dSAndroid Build Coastguard Worker 28*c05d8e5dSAndroid Build Coastguard Worker private: 29*c05d8e5dSAndroid Build Coastguard Worker A(const A&); 30*c05d8e5dSAndroid Build Coastguard Worker A& operator=(const A&); 31*c05d8e5dSAndroid Build Coastguard Worker }; 32*c05d8e5dSAndroid Build Coastguard Worker 33*c05d8e5dSAndroid Build Coastguard Worker int A::count = 0; 34*c05d8e5dSAndroid Build Coastguard Worker 35*c05d8e5dSAndroid Build Coastguard Worker struct B 36*c05d8e5dSAndroid Build Coastguard Worker { 37*c05d8e5dSAndroid Build Coastguard Worker static int count; 38*c05d8e5dSAndroid Build Coastguard Worker int id_; BB39*c05d8e5dSAndroid Build Coastguard Worker B() : id_(++count) {} ~BB40*c05d8e5dSAndroid Build Coastguard Worker ~B() {assert(id_ == count--);} 41*c05d8e5dSAndroid Build Coastguard Worker 42*c05d8e5dSAndroid Build Coastguard Worker private: 43*c05d8e5dSAndroid Build Coastguard Worker B(const B&); 44*c05d8e5dSAndroid Build Coastguard Worker B& operator=(const B&); 45*c05d8e5dSAndroid Build Coastguard Worker }; 46*c05d8e5dSAndroid Build Coastguard Worker 47*c05d8e5dSAndroid Build Coastguard Worker int B::count = 0; 48*c05d8e5dSAndroid Build Coastguard Worker 49*c05d8e5dSAndroid Build Coastguard Worker struct C 50*c05d8e5dSAndroid Build Coastguard Worker { 51*c05d8e5dSAndroid Build Coastguard Worker static int count; 52*c05d8e5dSAndroid Build Coastguard Worker int id_; CC53*c05d8e5dSAndroid Build Coastguard Worker C() : id_(++count) {} ~CC54*c05d8e5dSAndroid Build Coastguard Worker ~C() {assert(id_ == count--);} 55*c05d8e5dSAndroid Build Coastguard Worker 56*c05d8e5dSAndroid Build Coastguard Worker private: 57*c05d8e5dSAndroid Build Coastguard Worker C(const C&); 58*c05d8e5dSAndroid Build Coastguard Worker C& operator=(const C&); 59*c05d8e5dSAndroid Build Coastguard Worker }; 60*c05d8e5dSAndroid Build Coastguard Worker 61*c05d8e5dSAndroid Build Coastguard Worker int C::count = 0; 62*c05d8e5dSAndroid Build Coastguard Worker f2()63*c05d8e5dSAndroid Build Coastguard Workervoid f2() 64*c05d8e5dSAndroid Build Coastguard Worker { 65*c05d8e5dSAndroid Build Coastguard Worker C c; 66*c05d8e5dSAndroid Build Coastguard Worker A a; 67*c05d8e5dSAndroid Build Coastguard Worker throw 55; 68*c05d8e5dSAndroid Build Coastguard Worker B b; 69*c05d8e5dSAndroid Build Coastguard Worker } 70*c05d8e5dSAndroid Build Coastguard Worker f1()71*c05d8e5dSAndroid Build Coastguard Workervoid f1() throw (long, char, double, std::bad_exception) 72*c05d8e5dSAndroid Build Coastguard Worker { 73*c05d8e5dSAndroid Build Coastguard Worker A a; 74*c05d8e5dSAndroid Build Coastguard Worker B b; 75*c05d8e5dSAndroid Build Coastguard Worker f2(); 76*c05d8e5dSAndroid Build Coastguard Worker C c; 77*c05d8e5dSAndroid Build Coastguard Worker } 78*c05d8e5dSAndroid Build Coastguard Worker u_handler()79*c05d8e5dSAndroid Build Coastguard Workervoid u_handler() 80*c05d8e5dSAndroid Build Coastguard Worker { 81*c05d8e5dSAndroid Build Coastguard Worker throw; 82*c05d8e5dSAndroid Build Coastguard Worker } 83*c05d8e5dSAndroid Build Coastguard Worker main()84*c05d8e5dSAndroid Build Coastguard Workerint main() 85*c05d8e5dSAndroid Build Coastguard Worker { 86*c05d8e5dSAndroid Build Coastguard Worker std::set_unexpected(u_handler); 87*c05d8e5dSAndroid Build Coastguard Worker try 88*c05d8e5dSAndroid Build Coastguard Worker { 89*c05d8e5dSAndroid Build Coastguard Worker f1(); 90*c05d8e5dSAndroid Build Coastguard Worker assert(false); 91*c05d8e5dSAndroid Build Coastguard Worker } 92*c05d8e5dSAndroid Build Coastguard Worker catch (int* i) 93*c05d8e5dSAndroid Build Coastguard Worker { 94*c05d8e5dSAndroid Build Coastguard Worker assert(false); 95*c05d8e5dSAndroid Build Coastguard Worker } 96*c05d8e5dSAndroid Build Coastguard Worker catch (long i) 97*c05d8e5dSAndroid Build Coastguard Worker { 98*c05d8e5dSAndroid Build Coastguard Worker assert(false); 99*c05d8e5dSAndroid Build Coastguard Worker } 100*c05d8e5dSAndroid Build Coastguard Worker catch (int i) 101*c05d8e5dSAndroid Build Coastguard Worker { 102*c05d8e5dSAndroid Build Coastguard Worker assert(false); 103*c05d8e5dSAndroid Build Coastguard Worker } 104*c05d8e5dSAndroid Build Coastguard Worker catch (char c) 105*c05d8e5dSAndroid Build Coastguard Worker { 106*c05d8e5dSAndroid Build Coastguard Worker assert(false); 107*c05d8e5dSAndroid Build Coastguard Worker } 108*c05d8e5dSAndroid Build Coastguard Worker catch (const std::bad_exception& e) 109*c05d8e5dSAndroid Build Coastguard Worker { 110*c05d8e5dSAndroid Build Coastguard Worker assert(true); 111*c05d8e5dSAndroid Build Coastguard Worker } 112*c05d8e5dSAndroid Build Coastguard Worker catch (...) 113*c05d8e5dSAndroid Build Coastguard Worker { 114*c05d8e5dSAndroid Build Coastguard Worker assert(false); 115*c05d8e5dSAndroid Build Coastguard Worker } 116*c05d8e5dSAndroid Build Coastguard Worker assert(A::count == 0); 117*c05d8e5dSAndroid Build Coastguard Worker assert(B::count == 0); 118*c05d8e5dSAndroid Build Coastguard Worker assert(C::count == 0); 119*c05d8e5dSAndroid Build Coastguard Worker } 120