xref: /aosp_15_r20/external/libcxxabi/test/unwind_05.pass.cpp (revision c05d8e5dc3e10f6ce4317e8bc22cc4a25f55fa94)
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 Worker void 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 Worker void 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 Worker void 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 Worker int 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