1e434b34fSJonathan Roelofs //===--------------------- catch_const_pointer_nullptr.cpp ----------------===//
2e434b34fSJonathan Roelofs //
3e434b34fSJonathan Roelofs //                     The LLVM Compiler Infrastructure
4e434b34fSJonathan Roelofs //
5e434b34fSJonathan Roelofs // This file is dual licensed under the MIT and the University of Illinois Open
6e434b34fSJonathan Roelofs // Source Licenses. See LICENSE.TXT for details.
7e434b34fSJonathan Roelofs //
8e434b34fSJonathan Roelofs //===----------------------------------------------------------------------===//
9e434b34fSJonathan Roelofs 
10*57e446daSAsiri Rathnayake // UNSUPPORTED: libcxxabi-no-exceptions
11*57e446daSAsiri Rathnayake 
12e434b34fSJonathan Roelofs #include <cassert>
13e434b34fSJonathan Roelofs 
14e434b34fSJonathan Roelofs #if __has_feature(cxx_nullptr)
15e434b34fSJonathan Roelofs 
16e434b34fSJonathan Roelofs struct A {};
17e434b34fSJonathan Roelofs 
18e434b34fSJonathan Roelofs void test1()
19e434b34fSJonathan Roelofs {
20e434b34fSJonathan Roelofs     try
21e434b34fSJonathan Roelofs     {
22e434b34fSJonathan Roelofs         throw nullptr;
23e434b34fSJonathan Roelofs         assert(false);
24e434b34fSJonathan Roelofs     }
25e434b34fSJonathan Roelofs     catch (A*)
26e434b34fSJonathan Roelofs     {
27e434b34fSJonathan Roelofs     }
28e434b34fSJonathan Roelofs     catch (const A*)
29e434b34fSJonathan Roelofs     {
30e434b34fSJonathan Roelofs         assert(false);
31e434b34fSJonathan Roelofs     }
32e434b34fSJonathan Roelofs }
33e434b34fSJonathan Roelofs 
34e434b34fSJonathan Roelofs 
35e434b34fSJonathan Roelofs void test2()
36e434b34fSJonathan Roelofs {
37e434b34fSJonathan Roelofs     try
38e434b34fSJonathan Roelofs     {
39e434b34fSJonathan Roelofs         throw nullptr;
40e434b34fSJonathan Roelofs         assert(false);
41e434b34fSJonathan Roelofs     }
42e434b34fSJonathan Roelofs     catch (const A*)
43e434b34fSJonathan Roelofs     {
44e434b34fSJonathan Roelofs     }
45e434b34fSJonathan Roelofs     catch (A*)
46e434b34fSJonathan Roelofs     {
47e434b34fSJonathan Roelofs         assert(false);
48e434b34fSJonathan Roelofs     }
49e434b34fSJonathan Roelofs }
50e434b34fSJonathan Roelofs 
51e434b34fSJonathan Roelofs void test3()
52e434b34fSJonathan Roelofs {
53e434b34fSJonathan Roelofs     try
54e434b34fSJonathan Roelofs     {
55e434b34fSJonathan Roelofs         throw nullptr;
56e434b34fSJonathan Roelofs         assert(false);
57e434b34fSJonathan Roelofs     }
58e434b34fSJonathan Roelofs     catch (const A* const)
59e434b34fSJonathan Roelofs     {
60e434b34fSJonathan Roelofs     }
61e434b34fSJonathan Roelofs     catch (A*)
62e434b34fSJonathan Roelofs     {
63e434b34fSJonathan Roelofs         assert(false);
64e434b34fSJonathan Roelofs     }
65e434b34fSJonathan Roelofs }
66e434b34fSJonathan Roelofs 
67e434b34fSJonathan Roelofs void test4()
68e434b34fSJonathan Roelofs {
69e434b34fSJonathan Roelofs     try
70e434b34fSJonathan Roelofs     {
71e434b34fSJonathan Roelofs         throw nullptr;
72e434b34fSJonathan Roelofs         assert(false);
73e434b34fSJonathan Roelofs     }
74e434b34fSJonathan Roelofs     catch (A*)
75e434b34fSJonathan Roelofs     {
76e434b34fSJonathan Roelofs     }
77e434b34fSJonathan Roelofs     catch (const A* const)
78e434b34fSJonathan Roelofs     {
79e434b34fSJonathan Roelofs         assert(false);
80e434b34fSJonathan Roelofs     }
81e434b34fSJonathan Roelofs }
82e434b34fSJonathan Roelofs 
83e434b34fSJonathan Roelofs void test5()
84e434b34fSJonathan Roelofs {
85e434b34fSJonathan Roelofs     try
86e434b34fSJonathan Roelofs     {
87e434b34fSJonathan Roelofs         throw nullptr;
88e434b34fSJonathan Roelofs         assert(false);
89e434b34fSJonathan Roelofs     }
90e434b34fSJonathan Roelofs     catch (A const*)
91e434b34fSJonathan Roelofs     {
92e434b34fSJonathan Roelofs     }
93e434b34fSJonathan Roelofs     catch (A*)
94e434b34fSJonathan Roelofs     {
95e434b34fSJonathan Roelofs         assert(false);
96e434b34fSJonathan Roelofs     }
97e434b34fSJonathan Roelofs }
98e434b34fSJonathan Roelofs 
99e434b34fSJonathan Roelofs void test6()
100e434b34fSJonathan Roelofs {
101e434b34fSJonathan Roelofs     try
102e434b34fSJonathan Roelofs     {
103e434b34fSJonathan Roelofs         throw nullptr;
104e434b34fSJonathan Roelofs         assert(false);
105e434b34fSJonathan Roelofs     }
106e434b34fSJonathan Roelofs     catch (A*)
107e434b34fSJonathan Roelofs     {
108e434b34fSJonathan Roelofs     }
109e434b34fSJonathan Roelofs     catch (A const*)
110e434b34fSJonathan Roelofs     {
111e434b34fSJonathan Roelofs         assert(false);
112e434b34fSJonathan Roelofs     }
113e434b34fSJonathan Roelofs }
114e434b34fSJonathan Roelofs 
115e434b34fSJonathan Roelofs 
116e434b34fSJonathan Roelofs #else
117e434b34fSJonathan Roelofs 
118e434b34fSJonathan Roelofs void test1() {}
119e434b34fSJonathan Roelofs void test2() {}
120e434b34fSJonathan Roelofs void test3() {}
121e434b34fSJonathan Roelofs void test4() {}
122e434b34fSJonathan Roelofs void test5() {}
123e434b34fSJonathan Roelofs void test6() {}
124e434b34fSJonathan Roelofs 
125e434b34fSJonathan Roelofs #endif
126e434b34fSJonathan Roelofs 
127e434b34fSJonathan Roelofs int main()
128e434b34fSJonathan Roelofs {
129e434b34fSJonathan Roelofs     test1();
130e434b34fSJonathan Roelofs     test2();
131e434b34fSJonathan Roelofs     test3();
132e434b34fSJonathan Roelofs     test4();
133e434b34fSJonathan Roelofs     test5();
134e434b34fSJonathan Roelofs     test6();
135e434b34fSJonathan Roelofs }
136