blob: ed077d6a86e10932b970bf8e0beecbb76bdfce9f [file] [log] [blame]
Howard Hinnant904d1b92012-01-12 21:08:25 +00001//===------------------------- dynamic_cast5.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
12namespace t1
13{
14
15struct A1
16{
17 char _[43981];
18 virtual ~A1() {}
19
20 A1* getA1() {return this;}
21};
22
23struct A2
24{
25 char _[34981];
26 virtual ~A2() {}
27
28 A2* getA2() {return this;}
29};
30
31struct A3
32 : public virtual A1,
33 private A2
34{
35 char _[93481];
36 virtual ~A3() {}
37
38 A1* getA1() {return A1::getA1();}
39 A2* getA2() {return A2::getA2();}
40 A3* getA3() {return this;}
41};
42
43struct A4
44 : public A3,
45 public A2
46{
47 char _[13489];
48 virtual ~A4() {}
49
50 t1::A1* getA1() {return A3::getA1();}
51 A2* getA2() {return A3::getA2();}
52 A3* getA3() {return A3::getA3();}
53 A4* getA4() {return this;}
54};
55
56struct A5
57 : public A4,
58 public A3
59{
60 char _[13489];
61 virtual ~A5() {}
62
63 t1::A1* getA1() {return A4::getA1();}
64 A2* getA2() {return A4::getA2();}
65 A3* getA3() {return A4::getA3();}
66 A4* getA4() {return A4::getA4();}
67 A5* getA5() {return this;}
68};
69
70void test()
71{
72 A1 a1;
73 A2 a2;
74 A3 a3;
75 A4 a4;
76 A5 a5;
77
78 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
79 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
80 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
81 assert(dynamic_cast<A1*>(a3.getA2()) == 0);
82 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
83 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
84 assert(dynamic_cast<A1*>(a4.getA2()) == 0);
85 assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
86 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
87 assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
88 assert(dynamic_cast<A1*>(a5.getA2()) == 0);
89 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
90 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
91 assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
92
93 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
94 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
95 assert(dynamic_cast<A2*>(a3.getA1()) == 0);
96 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
97// assert(dynamic_cast<A2*>(a3.getA3()) == 0); // cast to private base
98 assert(dynamic_cast<A2*>(a4.getA1()) == 0);
99 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
100// assert(dynamic_cast<A2*>(a4.getA3()) == 0); // cast to private base
101// assert(dynamic_cast<A2*>(a4.getA4()) == 0); // cast to ambiguous base
102 assert(dynamic_cast<A2*>(a5.getA1()) == 0);
103 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
104// assert(dynamic_cast<A2*>(a5.getA3()) == 0); // cast to private base
105// assert(dynamic_cast<A2*>(a5.getA4()) == 0); // cast to ambiguous base
106// assert(dynamic_cast<A2*>(a5.getA5()) == 0); // cast to ambiguous base
107
108 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
109 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
110 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
111 assert(dynamic_cast<A3*>(a3.getA2()) == 0);
112 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
113 assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
114 assert(dynamic_cast<A3*>(a4.getA2()) == 0);
115 assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
116 assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
117 assert(dynamic_cast<A3*>(a5.getA1()) == 0);
118 assert(dynamic_cast<A3*>(a5.getA2()) == 0);
119 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
120 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
121// assert(dynamic_cast<A3*>(a5.getA5()) == 0); // cast to ambiguous base
122
123 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
124 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
125 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
126 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
127 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
128 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
129 assert(dynamic_cast<A4*>(a4.getA2()) == 0);
130 assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
131 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
132 assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
133 assert(dynamic_cast<A4*>(a5.getA2()) == 0);
134 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
135 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
136 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
137
138 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
139 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
140 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
141 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
142 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
143 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
144 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
145 assert(dynamic_cast<A5*>(a4.getA3()) == 0);
146 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
147 assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
148 assert(dynamic_cast<A5*>(a5.getA2()) == 0);
149 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
150 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
151 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
152}
153
154} // t1
155
156namespace t2
157{
158
159struct A1
160{
161 char _[43981];
162 virtual ~A1() {}
163
164 A1* getA1() {return this;}
165};
166
167struct A2
168{
169 char _[34981];
170 virtual ~A2() {}
171
172 A2* getA2() {return this;}
173};
174
175struct A3
176 : public virtual A1,
177 public A2
178{
179 char _[93481];
180 virtual ~A3() {}
181
182 A1* getA1() {return A1::getA1();}
183 A2* getA2() {return A2::getA2();}
184 A3* getA3() {return this;}
185};
186
187struct A4
188 : public A3,
189 public A2
190{
191 char _[13489];
192 virtual ~A4() {}
193
194 t2::A1* getA1() {return A3::getA1();}
195 A2* getA2() {return A3::getA2();}
196 A3* getA3() {return A3::getA3();}
197 A4* getA4() {return this;}
198};
199
200struct A5
201 : public A4,
202 public A3
203{
204 char _[13489];
205 virtual ~A5() {}
206
207 t2::A1* getA1() {return A4::getA1();}
208 A2* getA2() {return A4::getA2();}
209 A3* getA3() {return A4::getA3();}
210 A4* getA4() {return A4::getA4();}
211 A5* getA5() {return this;}
212};
213
214void test()
215{
216 A1 a1;
217 A2 a2;
218 A3 a3;
219 A4 a4;
220 A5 a5;
221
222 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
223 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
224 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
225 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
226 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
227 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
228 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
229 assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
230 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
231 assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
232 assert(dynamic_cast<A1*>(a5.getA2()) == a5.getA1());
233 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
234 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
235 assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
236
237 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
238 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
239 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
240 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
241 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
242 assert(dynamic_cast<A2*>(a4.getA1()) == 0);
243 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
244 assert(dynamic_cast<A2*>(a4.getA3()) == a4.getA2());
245// assert(dynamic_cast<A2*>(a4.getA4()) == 0); // cast to ambiguous base
246 assert(dynamic_cast<A2*>(a5.getA1()) == 0);
247 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
248 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
249// assert(dynamic_cast<A2*>(a5.getA4()) == 0); // cast to ambiguous base
250// assert(dynamic_cast<A2*>(a5.getA5()) == 0); // cast to ambiguous base
251
252 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
253 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
254 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
255 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
256 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
257 assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
258 assert(dynamic_cast<A3*>(a4.getA2()) == a4.getA3());
259 assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
260 assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
261 assert(dynamic_cast<A3*>(a5.getA1()) == 0);
262 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
263 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
264 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
265// assert(dynamic_cast<A3*>(a5.getA5()) == 0); // cast to ambiguous base
266
267 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
268 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
269 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
270 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
271 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
272 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
273 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
274 assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
275 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
276 assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
277 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
278 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
279 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
280 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
281
282 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
283 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
284 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
285 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
286 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
287 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
288 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
289 assert(dynamic_cast<A5*>(a4.getA3()) == 0);
290 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
291 assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
292 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
293 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
294 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
295 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
296}
297
298} // t2
299
300int main()
301{
302 t1::test();
303 t2::test();
304}