xref: /aosp_15_r20/external/libcxxabi/test/catch_const_pointer_nullptr.pass.cpp (revision c05d8e5dc3e10f6ce4317e8bc22cc4a25f55fa94)
1*c05d8e5dSAndroid Build Coastguard Worker //===--------------------- catch_const_pointer_nullptr.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 __has_feature(cxx_nullptr)
22*c05d8e5dSAndroid Build Coastguard Worker 
23*c05d8e5dSAndroid Build Coastguard Worker struct A {};
24*c05d8e5dSAndroid Build Coastguard Worker 
test1()25*c05d8e5dSAndroid Build Coastguard Worker void test1()
26*c05d8e5dSAndroid Build Coastguard Worker {
27*c05d8e5dSAndroid Build Coastguard Worker     try
28*c05d8e5dSAndroid Build Coastguard Worker     {
29*c05d8e5dSAndroid Build Coastguard Worker         throw nullptr;
30*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
31*c05d8e5dSAndroid Build Coastguard Worker     }
32*c05d8e5dSAndroid Build Coastguard Worker     catch (A* p)
33*c05d8e5dSAndroid Build Coastguard Worker     {
34*c05d8e5dSAndroid Build Coastguard Worker         assert(!p);
35*c05d8e5dSAndroid Build Coastguard Worker     }
36*c05d8e5dSAndroid Build Coastguard Worker     catch (const A*)
37*c05d8e5dSAndroid Build Coastguard Worker     {
38*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
39*c05d8e5dSAndroid Build Coastguard Worker     }
40*c05d8e5dSAndroid Build Coastguard Worker }
41*c05d8e5dSAndroid Build Coastguard Worker 
42*c05d8e5dSAndroid Build Coastguard Worker 
test2()43*c05d8e5dSAndroid Build Coastguard Worker void test2()
44*c05d8e5dSAndroid Build Coastguard Worker {
45*c05d8e5dSAndroid Build Coastguard Worker     try
46*c05d8e5dSAndroid Build Coastguard Worker     {
47*c05d8e5dSAndroid Build Coastguard Worker         throw nullptr;
48*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
49*c05d8e5dSAndroid Build Coastguard Worker     }
50*c05d8e5dSAndroid Build Coastguard Worker     catch (const A* p)
51*c05d8e5dSAndroid Build Coastguard Worker     {
52*c05d8e5dSAndroid Build Coastguard Worker         assert(!p);
53*c05d8e5dSAndroid Build Coastguard Worker     }
54*c05d8e5dSAndroid Build Coastguard Worker     catch (A*)
55*c05d8e5dSAndroid Build Coastguard Worker     {
56*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
57*c05d8e5dSAndroid Build Coastguard Worker     }
58*c05d8e5dSAndroid Build Coastguard Worker }
59*c05d8e5dSAndroid Build Coastguard Worker 
test3()60*c05d8e5dSAndroid Build Coastguard Worker void test3()
61*c05d8e5dSAndroid Build Coastguard Worker {
62*c05d8e5dSAndroid Build Coastguard Worker     try
63*c05d8e5dSAndroid Build Coastguard Worker     {
64*c05d8e5dSAndroid Build Coastguard Worker         throw nullptr;
65*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
66*c05d8e5dSAndroid Build Coastguard Worker     }
67*c05d8e5dSAndroid Build Coastguard Worker     catch (const A* const p)
68*c05d8e5dSAndroid Build Coastguard Worker     {
69*c05d8e5dSAndroid Build Coastguard Worker         assert(!p);
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 nullptr;
82*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
83*c05d8e5dSAndroid Build Coastguard Worker     }
84*c05d8e5dSAndroid Build Coastguard Worker     catch (A* p)
85*c05d8e5dSAndroid Build Coastguard Worker     {
86*c05d8e5dSAndroid Build Coastguard Worker         assert(!p);
87*c05d8e5dSAndroid Build Coastguard Worker     }
88*c05d8e5dSAndroid Build Coastguard Worker     catch (const A* const)
89*c05d8e5dSAndroid Build Coastguard Worker     {
90*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
91*c05d8e5dSAndroid Build Coastguard Worker     }
92*c05d8e5dSAndroid Build Coastguard Worker }
93*c05d8e5dSAndroid Build Coastguard Worker 
test5()94*c05d8e5dSAndroid Build Coastguard Worker void test5()
95*c05d8e5dSAndroid Build Coastguard Worker {
96*c05d8e5dSAndroid Build Coastguard Worker     try
97*c05d8e5dSAndroid Build Coastguard Worker     {
98*c05d8e5dSAndroid Build Coastguard Worker         throw nullptr;
99*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
100*c05d8e5dSAndroid Build Coastguard Worker     }
101*c05d8e5dSAndroid Build Coastguard Worker     catch (A const* p)
102*c05d8e5dSAndroid Build Coastguard Worker     {
103*c05d8e5dSAndroid Build Coastguard Worker         assert(!p);
104*c05d8e5dSAndroid Build Coastguard Worker     }
105*c05d8e5dSAndroid Build Coastguard Worker     catch (A*)
106*c05d8e5dSAndroid Build Coastguard Worker     {
107*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
108*c05d8e5dSAndroid Build Coastguard Worker     }
109*c05d8e5dSAndroid Build Coastguard Worker }
110*c05d8e5dSAndroid Build Coastguard Worker 
test6()111*c05d8e5dSAndroid Build Coastguard Worker void test6()
112*c05d8e5dSAndroid Build Coastguard Worker {
113*c05d8e5dSAndroid Build Coastguard Worker     try
114*c05d8e5dSAndroid Build Coastguard Worker     {
115*c05d8e5dSAndroid Build Coastguard Worker         throw nullptr;
116*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
117*c05d8e5dSAndroid Build Coastguard Worker     }
118*c05d8e5dSAndroid Build Coastguard Worker     catch (A* p)
119*c05d8e5dSAndroid Build Coastguard Worker     {
120*c05d8e5dSAndroid Build Coastguard Worker         assert(!p);
121*c05d8e5dSAndroid Build Coastguard Worker     }
122*c05d8e5dSAndroid Build Coastguard Worker     catch (A const*)
123*c05d8e5dSAndroid Build Coastguard Worker     {
124*c05d8e5dSAndroid Build Coastguard Worker         assert(false);
125*c05d8e5dSAndroid Build Coastguard Worker     }
126*c05d8e5dSAndroid Build Coastguard Worker }
127*c05d8e5dSAndroid Build Coastguard Worker 
128*c05d8e5dSAndroid Build Coastguard Worker 
129*c05d8e5dSAndroid Build Coastguard Worker #else
130*c05d8e5dSAndroid Build Coastguard Worker 
test1()131*c05d8e5dSAndroid Build Coastguard Worker void test1() {}
test2()132*c05d8e5dSAndroid Build Coastguard Worker void test2() {}
test3()133*c05d8e5dSAndroid Build Coastguard Worker void test3() {}
test4()134*c05d8e5dSAndroid Build Coastguard Worker void test4() {}
test5()135*c05d8e5dSAndroid Build Coastguard Worker void test5() {}
test6()136*c05d8e5dSAndroid Build Coastguard Worker void test6() {}
137*c05d8e5dSAndroid Build Coastguard Worker 
138*c05d8e5dSAndroid Build Coastguard Worker #endif
139*c05d8e5dSAndroid Build Coastguard Worker 
main()140*c05d8e5dSAndroid Build Coastguard Worker int main()
141*c05d8e5dSAndroid Build Coastguard Worker {
142*c05d8e5dSAndroid Build Coastguard Worker     test1();
143*c05d8e5dSAndroid Build Coastguard Worker     test2();
144*c05d8e5dSAndroid Build Coastguard Worker     test3();
145*c05d8e5dSAndroid Build Coastguard Worker     test4();
146*c05d8e5dSAndroid Build Coastguard Worker     test5();
147*c05d8e5dSAndroid Build Coastguard Worker     test6();
148*c05d8e5dSAndroid Build Coastguard Worker }
149