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