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