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     try
139     {
140         throw new vDerived;
141         assert(false);
142     }
143     catch (vBase *p) {
144         assert(p != 0);
145     }
146     catch (...)
147     {
148         assert (false);
149     }
150 }
151 
test9()152 void test9 ()
153 {
154     try
155     {
156         throw nullptr;
157         assert(false);
158     }
159     catch (vBase *p) {
160         assert(p == 0);
161     }
162     catch (...)
163     {
164         assert (false);
165     }
166 }
167 
test10()168 void test10 ()
169 {
170     try
171     {
172         throw (vDerived*)0;
173         assert(false);
174     }
175     catch (vBase *p) {
176         assert(p == 0);
177     }
178     catch (...)
179     {
180         assert (false);
181     }
182 }
183 
main()184 int main()
185 {
186     test1();
187     test2();
188     test3();
189     test4();
190     test5();
191     test6();
192     test7();
193     test8();
194     test9();
195     test10();
196 }
197