1 //===------------------------- catch_ptr_02.cpp ---------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include <cassert>
11 
12 #if __cplusplus < 201103L
13 #define DISABLE_NULLPTR_TESTS
14 #endif
15 
16 struct  A {};
17 A a;
18 const A ca = A();
19 
20 void test1 ()
21 {
22     try
23     {
24         throw &a;
25         assert(false);
26     }
27     catch ( const A* )
28     {
29     }
30     catch ( A *)
31     {
32         assert (false);
33     }
34 }
35 
36 void test2 ()
37 {
38     try
39      {
40         throw &a;
41         assert(false);
42     }
43     catch ( A* )
44     {
45     }
46     catch ( const A *)
47     {
48          assert (false);
49     }
50 }
51 
52 void test3 ()
53 {
54     try
55     {
56         throw &ca;
57         assert(false);
58     }
59     catch ( const A* )
60     {
61     }
62     catch ( A *)
63     {
64         assert (false);
65     }
66 }
67 
68 void test4 ()
69 {
70     try
71     {
72         throw &ca;
73         assert(false);
74     }
75     catch ( A *)
76     {
77         assert (false);
78     }
79     catch ( const A* )
80     {
81     }
82 }
83 
84 struct base1 {int x;};
85 struct base2 {int x;};
86 struct derived : base1, base2 {};
87 
88 void test5 ()
89 {
90     try
91     {
92         throw (derived*)0;
93         assert(false);
94     }
95     catch (base2 *p) {
96         assert (p == 0);
97     }
98     catch (...)
99     {
100         assert (false);
101     }
102 }
103 
104 void test6 ()
105 {
106 #if !defined(DISABLE_NULLPTR_TESTS)
107     try
108     {
109         throw nullptr;
110         assert(false);
111     }
112     catch (base2 *p) {
113         assert (p == nullptr);
114     }
115     catch (...)
116     {
117         assert (false);
118     }
119 #endif
120 }
121 
122 void test7 ()
123 {
124     try
125     {
126         throw (derived*)12;
127         assert(false);
128     }
129     catch (base2 *p) {
130         assert ((unsigned long)p == 12+sizeof(base1));
131     }
132     catch (...)
133     {
134         assert (false);
135     }
136 }
137 
138 
139 struct vBase {};
140 struct vDerived : virtual public vBase {};
141 
142 void test8 ()
143 {
144     vDerived derived;
145     try
146     {
147         throw &derived;
148         assert(false);
149     }
150     catch (vBase *p) {
151         assert(p != 0);
152     }
153     catch (...)
154     {
155         assert (false);
156     }
157 }
158 
159 void test9 ()
160 {
161 #if !defined(DISABLE_NULLPTR_TESTS)
162     try
163     {
164         throw nullptr;
165         assert(false);
166     }
167     catch (vBase *p) {
168         assert(p == 0);
169     }
170     catch (...)
171     {
172         assert (false);
173     }
174 #endif
175 }
176 
177 void test10 ()
178 {
179     try
180     {
181         throw (vDerived*)0;
182         assert(false);
183     }
184     catch (vBase *p) {
185         assert(p == 0);
186     }
187     catch (...)
188     {
189         assert (false);
190     }
191 }
192 
193 int main()
194 {
195     test1();
196     test2();
197     test3();
198     test4();
199     test5();
200     test6();
201     test7();
202     test8();
203     test9();
204     test10();
205 }
206