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