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