blob: c3c4400b45d381cf0467e241e28c91ad941d9934 [file] [log] [blame]
Dan Albert287553d2017-02-16 10:47:51 -08001//===------------------------- 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
16struct A {};
17A a;
18const A ca = A();
19
20void 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
36void 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
52void 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
68void 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
84struct base1 {int x;};
85struct base2 {int x;};
86struct derived : base1, base2 {};
87
88void 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
104void 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
122void 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
139struct vBase {};
140struct vDerived : virtual public vBase {};
141
142void 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
159void 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
177void 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
193int main()
194{
195 test1();
196 test2();
197 test3();
198 test4();
199 test5();
200 test6();
201 test7();
202 test8();
203 test9();
204 test10();
205}