1 //===------------------------- 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 #include "support/timer.hpp"
12
13 // This test explicitly tests dynamic cast with types that have inaccessible
14 // bases.
15 #if defined(__clang__)
16 #pragma clang diagnostic ignored "-Winaccessible-base"
17 #endif
18
19 namespace t1
20 {
21
22 struct A1
23 {
24 char _[43981];
~A1t1::A125 virtual ~A1() {}
26
getA1t1::A127 A1* getA1() {return this;}
28 };
29
30 struct A2
31 {
32 char _[34981];
~A2t1::A233 virtual ~A2() {}
34
getA2t1::A235 A2* getA2() {return this;}
36 };
37
38 struct A3
39 : public virtual A1,
40 private A2
41 {
42 char _[93481];
~A3t1::A343 virtual ~A3() {}
44
getA1t1::A345 A1* getA1() {return A1::getA1();}
getA2t1::A346 A2* getA2() {return A2::getA2();}
getA3t1::A347 A3* getA3() {return this;}
48 };
49
50 struct A4
51 : public A3,
52 public A2
53 {
54 char _[13489];
~A4t1::A455 virtual ~A4() {}
56
getA1t1::A457 t1::A1* getA1() {return A3::getA1();}
getA2t1::A458 A2* getA2() {return A3::getA2();}
getA3t1::A459 A3* getA3() {return A3::getA3();}
getA4t1::A460 A4* getA4() {return this;}
61 };
62
63 struct A5
64 : public A4,
65 public A3
66 {
67 char _[13489];
~A5t1::A568 virtual ~A5() {}
69
getA1t1::A570 t1::A1* getA1() {return A4::getA1();}
getA2t1::A571 A2* getA2() {return A4::getA2();}
getA3t1::A572 A3* getA3() {return A4::getA3();}
getA4t1::A573 A4* getA4() {return A4::getA4();}
getA5t1::A574 A5* getA5() {return this;}
75 };
76
test()77 void test()
78 {
79 A1 a1;
80 A2 a2;
81 A3 a3;
82 A4 a4;
83 A5 a5;
84
85 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
86 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
87 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
88 assert(dynamic_cast<A1*>(a3.getA2()) == 0);
89 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
90 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
91 assert(dynamic_cast<A1*>(a4.getA2()) == 0);
92 assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
93 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
94 assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
95 assert(dynamic_cast<A1*>(a5.getA2()) == 0);
96 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
97 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
98 assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
99
100 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
101 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
102 assert(dynamic_cast<A2*>(a3.getA1()) == 0);
103 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
104 // assert(dynamic_cast<A2*>(a3.getA3()) == 0); // cast to private base
105 assert(dynamic_cast<A2*>(a4.getA1()) == 0);
106 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
107 // assert(dynamic_cast<A2*>(a4.getA3()) == 0); // cast to private base
108 // assert(dynamic_cast<A2*>(a4.getA4()) == 0); // cast to ambiguous base
109 assert(dynamic_cast<A2*>(a5.getA1()) == 0);
110 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
111 // assert(dynamic_cast<A2*>(a5.getA3()) == 0); // cast to private base
112 // assert(dynamic_cast<A2*>(a5.getA4()) == 0); // cast to ambiguous base
113 // assert(dynamic_cast<A2*>(a5.getA5()) == 0); // cast to ambiguous base
114
115 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
116 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
117 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
118 assert(dynamic_cast<A3*>(a3.getA2()) == 0);
119 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
120 assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
121 assert(dynamic_cast<A3*>(a4.getA2()) == 0);
122 assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
123 assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
124 assert(dynamic_cast<A3*>(a5.getA1()) == 0);
125 assert(dynamic_cast<A3*>(a5.getA2()) == 0);
126 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
127 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
128 // assert(dynamic_cast<A3*>(a5.getA5()) == 0); // cast to ambiguous base
129
130 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
131 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
132 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
133 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
134 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
135 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
136 assert(dynamic_cast<A4*>(a4.getA2()) == 0);
137 assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
138 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
139 assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
140 assert(dynamic_cast<A4*>(a5.getA2()) == 0);
141 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
142 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
143 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
144
145 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
146 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
147 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
148 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
149 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
150 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
151 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
152 assert(dynamic_cast<A5*>(a4.getA3()) == 0);
153 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
154 assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
155 assert(dynamic_cast<A5*>(a5.getA2()) == 0);
156 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
157 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
158 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
159 }
160
161 } // t1
162
163 namespace t2
164 {
165
166 struct A1
167 {
168 char _[43981];
~A1t2::A1169 virtual ~A1() {}
170
getA1t2::A1171 A1* getA1() {return this;}
172 };
173
174 struct A2
175 {
176 char _[34981];
~A2t2::A2177 virtual ~A2() {}
178
getA2t2::A2179 A2* getA2() {return this;}
180 };
181
182 struct A3
183 : public virtual A1,
184 public A2
185 {
186 char _[93481];
~A3t2::A3187 virtual ~A3() {}
188
getA1t2::A3189 A1* getA1() {return A1::getA1();}
getA2t2::A3190 A2* getA2() {return A2::getA2();}
getA3t2::A3191 A3* getA3() {return this;}
192 };
193
194 struct A4
195 : public A3,
196 public A2
197 {
198 char _[13489];
~A4t2::A4199 virtual ~A4() {}
200
getA1t2::A4201 t2::A1* getA1() {return A3::getA1();}
getA2t2::A4202 A2* getA2() {return A3::getA2();}
getA3t2::A4203 A3* getA3() {return A3::getA3();}
getA4t2::A4204 A4* getA4() {return this;}
205 };
206
207 struct A5
208 : public A4,
209 public A3
210 {
211 char _[13489];
~A5t2::A5212 virtual ~A5() {}
213
getA1t2::A5214 t2::A1* getA1() {return A4::getA1();}
getA2t2::A5215 A2* getA2() {return A4::getA2();}
getA3t2::A5216 A3* getA3() {return A4::getA3();}
getA4t2::A5217 A4* getA4() {return A4::getA4();}
getA5t2::A5218 A5* getA5() {return this;}
219 };
220
test()221 void test()
222 {
223 A1 a1;
224 A2 a2;
225 A3 a3;
226 A4 a4;
227 A5 a5;
228
229 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
230 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
231 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
232 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
233 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
234 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
235 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
236 assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
237 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
238 assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
239 assert(dynamic_cast<A1*>(a5.getA2()) == a5.getA1());
240 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
241 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
242 assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
243
244 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
245 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
246 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
247 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
248 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
249 assert(dynamic_cast<A2*>(a4.getA1()) == 0);
250 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
251 assert(dynamic_cast<A2*>(a4.getA3()) == a4.getA2());
252 // assert(dynamic_cast<A2*>(a4.getA4()) == 0); // cast to ambiguous base
253 assert(dynamic_cast<A2*>(a5.getA1()) == 0);
254 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
255 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
256 // assert(dynamic_cast<A2*>(a5.getA4()) == 0); // cast to ambiguous base
257 // assert(dynamic_cast<A2*>(a5.getA5()) == 0); // cast to ambiguous base
258
259 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
260 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
261 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
262 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
263 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
264 assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
265 assert(dynamic_cast<A3*>(a4.getA2()) == a4.getA3());
266 assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
267 assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
268 assert(dynamic_cast<A3*>(a5.getA1()) == 0);
269 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
270 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
271 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
272 // assert(dynamic_cast<A3*>(a5.getA5()) == 0); // cast to ambiguous base
273
274 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
275 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
276 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
277 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
278 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
279 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
280 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
281 assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
282 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
283 assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
284 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
285 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
286 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
287 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
288
289 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
290 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
291 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
292 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
293 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
294 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
295 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
296 assert(dynamic_cast<A5*>(a4.getA3()) == 0);
297 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
298 assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
299 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
300 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
301 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
302 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
303 }
304
305 } // t2
306
307 namespace t3
308 {
309
310 struct A1
311 {
312 char _[43981];
~A1t3::A1313 virtual ~A1() {}
314
getA1t3::A1315 A1* getA1() {return this;}
316 };
317
318 struct A2
319 {
320 char _[34981];
~A2t3::A2321 virtual ~A2() {}
322
getA2t3::A2323 A2* getA2() {return this;}
324 };
325
326 struct A3
327 : public A1,
328 public virtual A2
329 {
330 char _[93481];
~A3t3::A3331 virtual ~A3() {}
332
getA1t3::A3333 A1* getA1() {return A1::getA1();}
getA2t3::A3334 A2* getA2() {return A2::getA2();}
getA3t3::A3335 A3* getA3() {return this;}
336 };
337
338 struct A4
339 : public A1,
340 public virtual A2
341 {
342 char _[13489];
~A4t3::A4343 virtual ~A4() {}
344
getA1t3::A4345 A1* getA1() {return A1::getA1();}
getA2t3::A4346 A2* getA2() {return A2::getA2();}
getA4t3::A4347 A4* getA4() {return this;}
348 };
349
350 struct A5
351 : public A3,
352 public A4
353 {
354 char _[41389];
~A5t3::A5355 virtual ~A5() {}
356
getA14t3::A5357 A1* getA14() {return A4::getA1();}
getA13t3::A5358 A1* getA13() {return A3::getA1();}
getA2t3::A5359 A2* getA2() {return A4::getA2();}
getA3t3::A5360 A3* getA3() {return A3::getA3();}
getA4t3::A5361 A4* getA4() {return A4::getA4();}
getA5t3::A5362 A5* getA5() {return this;}
363 };
364
test()365 void test()
366 {
367 A1 a1;
368 A2 a2;
369 A3 a3;
370 A4 a4;
371 A5 a5;
372
373 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
374 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
375 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
376 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
377 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
378 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
379 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
380 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
381 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
382 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
383 assert(dynamic_cast<A1*>(a5.getA2()) == 0);
384 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
385 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
386
387 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
388 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
389 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
390 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
391 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
392 assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
393 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
394 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
395 assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
396 assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
397 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
398 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
399 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
400 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
401
402 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
403 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
404 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
405 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
406 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
407 assert(dynamic_cast<A3*>(a4.getA1()) == 0);
408 assert(dynamic_cast<A3*>(a4.getA2()) == 0);
409 assert(dynamic_cast<A3*>(a4.getA4()) == 0);
410 assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
411 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
412 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
413 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
414 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
415 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
416
417 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
418 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
419 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
420 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
421 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
422 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
423 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
424 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
425 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
426 assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
427 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
428 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
429 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
430 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
431
432 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
433 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
434 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
435 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
436 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
437 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
438 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
439 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
440 assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
441 assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
442 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
443 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
444 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
445 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
446 }
447
448 } // t3
449
450 namespace t4
451 {
452
453 struct A1
454 {
455 char _[43981];
~A1t4::A1456 virtual ~A1() {}
457
getA1t4::A1458 A1* getA1() {return this;}
459 };
460
461 struct A2
462 {
463 char _[34981];
~A2t4::A2464 virtual ~A2() {}
465
getA2t4::A2466 A2* getA2() {return this;}
467 };
468
469 struct A3
470 : protected A1,
471 public virtual A2
472 {
473 char _[93481];
~A3t4::A3474 virtual ~A3() {}
475
getA1t4::A3476 A1* getA1() {return A1::getA1();}
getA2t4::A3477 A2* getA2() {return A2::getA2();}
getA3t4::A3478 A3* getA3() {return this;}
479 };
480
481 struct A4
482 : public A1,
483 public virtual A2
484 {
485 char _[13489];
~A4t4::A4486 virtual ~A4() {}
487
getA1t4::A4488 A1* getA1() {return A1::getA1();}
getA2t4::A4489 A2* getA2() {return A2::getA2();}
getA4t4::A4490 A4* getA4() {return this;}
491 };
492
493 struct A5
494 : public A3,
495 public A4
496 {
497 char _[41389];
~A5t4::A5498 virtual ~A5() {}
499
getA14t4::A5500 A1* getA14() {return A4::getA1();}
getA13t4::A5501 A1* getA13() {return A3::getA1();}
getA2t4::A5502 A2* getA2() {return A4::getA2();}
getA3t4::A5503 A3* getA3() {return A3::getA3();}
getA4t4::A5504 A4* getA4() {return A4::getA4();}
getA5t4::A5505 A5* getA5() {return this;}
506 };
507
test()508 void test()
509 {
510 A1 a1;
511 A2 a2;
512 A3 a3;
513 A4 a4;
514 A5 a5;
515
516 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
517 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
518 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
519 assert(dynamic_cast<A1*>(a3.getA2()) == 0);
520 // assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); // cast to protected base
521 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
522 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
523 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
524 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
525 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
526 assert(dynamic_cast<A1*>(a5.getA2()) == 0);
527 // assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13()); // cast to protected base
528 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
529
530 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
531 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
532 assert(dynamic_cast<A2*>(a3.getA1()) == 0);
533 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
534 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
535 assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
536 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
537 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
538 assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
539 assert(dynamic_cast<A2*>(a5.getA13()) == 0);
540 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
541 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
542 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
543 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
544
545 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
546 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
547 assert(dynamic_cast<A3*>(a3.getA1()) == 0);
548 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
549 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
550 assert(dynamic_cast<A3*>(a4.getA1()) == 0);
551 assert(dynamic_cast<A3*>(a4.getA2()) == 0);
552 assert(dynamic_cast<A3*>(a4.getA4()) == 0);
553 assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
554 assert(dynamic_cast<A3*>(a5.getA13()) == 0);
555 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
556 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
557 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
558 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
559
560 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
561 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
562 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
563 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
564 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
565 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
566 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
567 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
568 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
569 assert(dynamic_cast<A4*>(a5.getA13()) == 0);
570 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
571 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
572 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
573 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
574
575 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
576 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
577 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
578 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
579 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
580 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
581 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
582 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
583 assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
584 assert(dynamic_cast<A5*>(a5.getA13()) == 0);
585 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
586 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
587 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
588 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
589 }
590
591 } // t4
592
593 namespace t5
594 {
595
596 struct A1
597 {
598 char _[43981];
~A1t5::A1599 virtual ~A1() {}
600
getA1t5::A1601 A1* getA1() {return this;}
602 };
603
604 struct A2
605 {
606 char _[34981];
~A2t5::A2607 virtual ~A2() {}
608
getA2t5::A2609 A2* getA2() {return this;}
610 };
611
612 struct A3
613 : public A1,
614 protected virtual A2
615 {
616 char _[93481];
~A3t5::A3617 virtual ~A3() {}
618
getA1t5::A3619 A1* getA1() {return A1::getA1();}
getA2t5::A3620 A2* getA2() {return A2::getA2();}
getA3t5::A3621 A3* getA3() {return this;}
622 };
623
624 struct A4
625 : public A1,
626 public virtual A2
627 {
628 char _[13489];
~A4t5::A4629 virtual ~A4() {}
630
getA1t5::A4631 A1* getA1() {return A1::getA1();}
getA2t5::A4632 A2* getA2() {return A2::getA2();}
getA4t5::A4633 A4* getA4() {return this;}
634 };
635
636 struct A5
637 : public A3,
638 public A4
639 {
640 char _[41389];
~A5t5::A5641 virtual ~A5() {}
642
getA14t5::A5643 A1* getA14() {return A4::getA1();}
getA13t5::A5644 A1* getA13() {return A3::getA1();}
getA2t5::A5645 A2* getA2() {return A4::getA2();}
getA3t5::A5646 A3* getA3() {return A3::getA3();}
getA4t5::A5647 A4* getA4() {return A4::getA4();}
getA5t5::A5648 A5* getA5() {return this;}
649 };
650
test()651 void test()
652 {
653 A1 a1;
654 A2 a2;
655 A3 a3;
656 A4 a4;
657 A5 a5;
658
659 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
660 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
661 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
662 assert(dynamic_cast<A1*>(a3.getA2()) == 0);
663 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
664 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
665 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
666 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
667 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
668 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
669 assert(dynamic_cast<A1*>(a5.getA2()) == 0);
670 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
671 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
672
673 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
674 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
675 assert(dynamic_cast<A2*>(a3.getA1()) == 0);
676 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
677 // assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); // cast to protected base
678 assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
679 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
680 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
681 assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
682 assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
683 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
684 // assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); // cast to protected base
685 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
686 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
687
688 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
689 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
690 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
691 assert(dynamic_cast<A3*>(a3.getA2()) == 0);
692 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
693 assert(dynamic_cast<A3*>(a4.getA1()) == 0);
694 assert(dynamic_cast<A3*>(a4.getA2()) == 0);
695 assert(dynamic_cast<A3*>(a4.getA4()) == 0);
696 assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
697 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
698 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
699 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
700 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
701 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
702
703 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
704 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
705 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
706 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
707 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
708 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
709 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
710 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
711 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
712 assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
713 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
714 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
715 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
716 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
717
718 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
719 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
720 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
721 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
722 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
723 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
724 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
725 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
726 assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
727 assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
728 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
729 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
730 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
731 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
732 }
733
734 } // t5
735
736 namespace t6
737 {
738
739 struct A1
740 {
741 char _[43981];
~A1t6::A1742 virtual ~A1() {}
743
getA1t6::A1744 A1* getA1() {return this;}
745 };
746
747 struct A2
748 {
749 char _[34981];
~A2t6::A2750 virtual ~A2() {}
751
getA2t6::A2752 A2* getA2() {return this;}
753 };
754
755 struct A3
756 : public A1,
757 public virtual A2
758 {
759 char _[93481];
~A3t6::A3760 virtual ~A3() {}
761
getA1t6::A3762 A1* getA1() {return A1::getA1();}
getA2t6::A3763 A2* getA2() {return A2::getA2();}
getA3t6::A3764 A3* getA3() {return this;}
765 };
766
767 struct A4
768 : protected A1,
769 public virtual A2
770 {
771 char _[13489];
~A4t6::A4772 virtual ~A4() {}
773
getA1t6::A4774 A1* getA1() {return A1::getA1();}
getA2t6::A4775 A2* getA2() {return A2::getA2();}
getA4t6::A4776 A4* getA4() {return this;}
777 };
778
779 struct A5
780 : public A3,
781 public A4
782 {
783 char _[41389];
~A5t6::A5784 virtual ~A5() {}
785
getA14t6::A5786 A1* getA14() {return A4::getA1();}
getA13t6::A5787 A1* getA13() {return A3::getA1();}
getA2t6::A5788 A2* getA2() {return A4::getA2();}
getA3t6::A5789 A3* getA3() {return A3::getA3();}
getA4t6::A5790 A4* getA4() {return A4::getA4();}
getA5t6::A5791 A5* getA5() {return this;}
792 };
793
test()794 void test()
795 {
796 A1 a1;
797 A2 a2;
798 A3 a3;
799 A4 a4;
800 A5 a5;
801
802 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
803 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
804 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
805 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
806 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
807 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
808 assert(dynamic_cast<A1*>(a4.getA2()) == 0);
809 // assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); // cast to protected base
810 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
811 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
812 assert(dynamic_cast<A1*>(a5.getA2()) == 0);
813 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
814 // assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14()); // cast to protected base
815
816 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
817 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
818 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
819 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
820 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
821 assert(dynamic_cast<A2*>(a4.getA1()) == 0);
822 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
823 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
824 assert(dynamic_cast<A2*>(a5.getA14()) == 0);
825 assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
826 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
827 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
828 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
829 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
830
831 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
832 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
833 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
834 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
835 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
836 assert(dynamic_cast<A3*>(a4.getA1()) == 0);
837 assert(dynamic_cast<A3*>(a4.getA2()) == 0);
838 assert(dynamic_cast<A3*>(a4.getA4()) == 0);
839 assert(dynamic_cast<A3*>(a5.getA14()) == 0);
840 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
841 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
842 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
843 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
844 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
845
846 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
847 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
848 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
849 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
850 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
851 assert(dynamic_cast<A4*>(a4.getA1()) == 0);
852 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
853 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
854 assert(dynamic_cast<A4*>(a5.getA14()) == 0);
855 assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
856 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
857 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
858 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
859 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
860
861 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
862 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
863 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
864 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
865 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
866 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
867 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
868 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
869 assert(dynamic_cast<A5*>(a5.getA14()) == 0);
870 assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
871 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
872 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
873 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
874 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
875 }
876
877 } // t6
878
879 namespace t7
880 {
881
882 struct A1
883 {
884 char _[43981];
~A1t7::A1885 virtual ~A1() {}
886
getA1t7::A1887 A1* getA1() {return this;}
888 };
889
890 struct A2
891 {
892 char _[34981];
~A2t7::A2893 virtual ~A2() {}
894
getA2t7::A2895 A2* getA2() {return this;}
896 };
897
898 struct A3
899 : public A1,
900 public virtual A2
901 {
902 char _[93481];
~A3t7::A3903 virtual ~A3() {}
904
getA1t7::A3905 A1* getA1() {return A1::getA1();}
getA2t7::A3906 A2* getA2() {return A2::getA2();}
getA3t7::A3907 A3* getA3() {return this;}
908 };
909
910 struct A4
911 : public A1,
912 protected virtual A2
913 {
914 char _[13489];
~A4t7::A4915 virtual ~A4() {}
916
getA1t7::A4917 A1* getA1() {return A1::getA1();}
getA2t7::A4918 A2* getA2() {return A2::getA2();}
getA4t7::A4919 A4* getA4() {return this;}
920 };
921
922 struct A5
923 : public A3,
924 public A4
925 {
926 char _[41389];
~A5t7::A5927 virtual ~A5() {}
928
getA14t7::A5929 A1* getA14() {return A4::getA1();}
getA13t7::A5930 A1* getA13() {return A3::getA1();}
getA2t7::A5931 A2* getA2() {return A4::getA2();}
getA3t7::A5932 A3* getA3() {return A3::getA3();}
getA4t7::A5933 A4* getA4() {return A4::getA4();}
getA5t7::A5934 A5* getA5() {return this;}
935 };
936
test()937 void test()
938 {
939 A1 a1;
940 A2 a2;
941 A3 a3;
942 A4 a4;
943 A5 a5;
944
945 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
946 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
947 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
948 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
949 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
950 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
951 assert(dynamic_cast<A1*>(a4.getA2()) == 0);
952 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
953 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
954 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
955 assert(dynamic_cast<A1*>(a5.getA2()) == 0);
956 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
957 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
958
959 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
960 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
961 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
962 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
963 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
964 assert(dynamic_cast<A2*>(a4.getA1()) == 0);
965 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
966 // assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2()); // cast to protected base
967 assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
968 assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
969 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
970 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
971 // assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2()); // cast to protected base
972 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
973
974 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
975 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
976 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
977 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
978 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
979 assert(dynamic_cast<A3*>(a4.getA1()) == 0);
980 assert(dynamic_cast<A3*>(a4.getA2()) == 0);
981 assert(dynamic_cast<A3*>(a4.getA4()) == 0);
982 assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
983 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
984 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
985 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
986 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
987 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
988
989 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
990 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
991 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
992 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
993 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
994 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
995 assert(dynamic_cast<A4*>(a4.getA2()) == 0);
996 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
997 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
998 assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
999 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1000 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
1001 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1002 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
1003
1004 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1005 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1006 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1007 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1008 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1009 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1010 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1011 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1012 assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
1013 assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
1014 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1015 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
1016 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
1017 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1018 }
1019
1020 } // t7
1021
1022 namespace t8
1023 {
1024
1025 struct A1
1026 {
1027 char _[43981];
~A1t8::A11028 virtual ~A1() {}
1029
getA1t8::A11030 A1* getA1() {return this;}
1031 };
1032
1033 struct A2
1034 {
1035 char _[34981];
~A2t8::A21036 virtual ~A2() {}
1037
getA2t8::A21038 A2* getA2() {return this;}
1039 };
1040
1041 struct A3
1042 : public A1,
1043 public virtual A2
1044 {
1045 char _[93481];
~A3t8::A31046 virtual ~A3() {}
1047
getA1t8::A31048 A1* getA1() {return A1::getA1();}
getA2t8::A31049 A2* getA2() {return A2::getA2();}
getA3t8::A31050 A3* getA3() {return this;}
1051 };
1052
1053 struct A4
1054 : public A1,
1055 public virtual A2
1056 {
1057 char _[13489];
~A4t8::A41058 virtual ~A4() {}
1059
getA1t8::A41060 A1* getA1() {return A1::getA1();}
getA2t8::A41061 A2* getA2() {return A2::getA2();}
getA4t8::A41062 A4* getA4() {return this;}
1063 };
1064
1065 struct A5
1066 : protected A3,
1067 public A4
1068 {
1069 char _[41389];
~A5t8::A51070 virtual ~A5() {}
1071
getA14t8::A51072 A1* getA14() {return A4::getA1();}
getA13t8::A51073 A1* getA13() {return A3::getA1();}
getA2t8::A51074 A2* getA2() {return A4::getA2();}
getA3t8::A51075 A3* getA3() {return A3::getA3();}
getA4t8::A51076 A4* getA4() {return A4::getA4();}
getA5t8::A51077 A5* getA5() {return this;}
1078 };
1079
test()1080 void test()
1081 {
1082 A1 a1;
1083 A2 a2;
1084 A3 a3;
1085 A4 a4;
1086 A5 a5;
1087
1088 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1089 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
1090 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1091 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1092 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1093 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
1094 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
1095 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
1096 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
1097 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
1098 assert(dynamic_cast<A1*>(a5.getA2()) == 0);
1099 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
1100 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
1101
1102 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1103 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1104 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1105 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1106 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1107 assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
1108 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
1109 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
1110 assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
1111 assert(dynamic_cast<A2*>(a5.getA13()) == 0);
1112 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
1113 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
1114 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
1115 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
1116
1117 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1118 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1119 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1120 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1121 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1122 assert(dynamic_cast<A3*>(a4.getA1()) == 0);
1123 assert(dynamic_cast<A3*>(a4.getA2()) == 0);
1124 assert(dynamic_cast<A3*>(a4.getA4()) == 0);
1125 assert(dynamic_cast<A3*>(a5.getA14()) == 0);
1126 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
1127 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
1128 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
1129 assert(dynamic_cast<A3*>(a5.getA4()) == 0);
1130 // assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3()); // cast to protected base
1131
1132 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
1133 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
1134 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
1135 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
1136 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
1137 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
1138 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
1139 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
1140 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
1141 assert(dynamic_cast<A4*>(a5.getA13()) == 0);
1142 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1143 assert(dynamic_cast<A4*>(a5.getA3()) == 0);
1144 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1145 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
1146
1147 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1148 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1149 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1150 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1151 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1152 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1153 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1154 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1155 assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
1156 assert(dynamic_cast<A5*>(a5.getA13()) == 0);
1157 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1158 assert(dynamic_cast<A5*>(a5.getA3()) == 0);
1159 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
1160 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1161 }
1162
1163 } // t8
1164
1165 namespace t9
1166 {
1167
1168 struct A1
1169 {
1170 char _[43981];
~A1t9::A11171 virtual ~A1() {}
1172
getA1t9::A11173 A1* getA1() {return this;}
1174 };
1175
1176 struct A2
1177 {
1178 char _[34981];
~A2t9::A21179 virtual ~A2() {}
1180
getA2t9::A21181 A2* getA2() {return this;}
1182 };
1183
1184 struct A3
1185 : public A1,
1186 public virtual A2
1187 {
1188 char _[93481];
~A3t9::A31189 virtual ~A3() {}
1190
getA1t9::A31191 A1* getA1() {return A1::getA1();}
getA2t9::A31192 A2* getA2() {return A2::getA2();}
getA3t9::A31193 A3* getA3() {return this;}
1194 };
1195
1196 struct A4
1197 : public A1,
1198 public virtual A2
1199 {
1200 char _[13489];
~A4t9::A41201 virtual ~A4() {}
1202
getA1t9::A41203 A1* getA1() {return A1::getA1();}
getA2t9::A41204 A2* getA2() {return A2::getA2();}
getA4t9::A41205 A4* getA4() {return this;}
1206 };
1207
1208 struct A5
1209 : public A3,
1210 protected A4
1211 {
1212 char _[41389];
~A5t9::A51213 virtual ~A5() {}
1214
getA14t9::A51215 A1* getA14() {return A4::getA1();}
getA13t9::A51216 A1* getA13() {return A3::getA1();}
getA2t9::A51217 A2* getA2() {return A4::getA2();}
getA3t9::A51218 A3* getA3() {return A3::getA3();}
getA4t9::A51219 A4* getA4() {return A4::getA4();}
getA5t9::A51220 A5* getA5() {return this;}
1221 };
1222
test()1223 void test()
1224 {
1225 A1 a1;
1226 A2 a2;
1227 A3 a3;
1228 A4 a4;
1229 A5 a5;
1230
1231 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1232 assert(dynamic_cast<A1*>(a2.getA2()) == 0);
1233 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1234 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1235 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1236 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
1237 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
1238 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
1239 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
1240 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
1241 assert(dynamic_cast<A1*>(a5.getA2()) == 0);
1242 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
1243 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
1244
1245 assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1246 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1247 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1248 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1249 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1250 assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
1251 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
1252 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
1253 assert(dynamic_cast<A2*>(a5.getA14()) == 0);
1254 assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
1255 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
1256 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
1257 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
1258 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
1259
1260 assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1261 assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1262 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1263 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1264 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1265 assert(dynamic_cast<A3*>(a4.getA1()) == 0);
1266 assert(dynamic_cast<A3*>(a4.getA2()) == 0);
1267 assert(dynamic_cast<A3*>(a4.getA4()) == 0);
1268 assert(dynamic_cast<A3*>(a5.getA14()) == 0);
1269 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
1270 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
1271 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
1272 assert(dynamic_cast<A3*>(a5.getA4()) == 0);
1273 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
1274
1275 assert(dynamic_cast<A4*>(a1.getA1()) == 0);
1276 assert(dynamic_cast<A4*>(a2.getA2()) == 0);
1277 assert(dynamic_cast<A4*>(a3.getA1()) == 0);
1278 assert(dynamic_cast<A4*>(a3.getA2()) == 0);
1279 assert(dynamic_cast<A4*>(a3.getA3()) == 0);
1280 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
1281 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
1282 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
1283 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
1284 assert(dynamic_cast<A4*>(a5.getA13()) == 0);
1285 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1286 assert(dynamic_cast<A4*>(a5.getA3()) == 0);
1287 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1288 // assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); // cast to protected base
1289
1290 assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1291 assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1292 assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1293 assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1294 assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1295 assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1296 assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1297 assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1298 assert(dynamic_cast<A5*>(a5.getA14()) == 0);
1299 assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
1300 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1301 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
1302 assert(dynamic_cast<A5*>(a5.getA4()) == 0);
1303 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1304 }
1305
1306 } // t9
1307
1308
main()1309 int main()
1310 {
1311 timer t;
1312 t1::test();
1313 t2::test();
1314 t3::test();
1315 t4::test();
1316 t5::test();
1317 t6::test();
1318 t7::test();
1319 t8::test();
1320 t9::test();
1321 }
1322