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
19namespace t1
20{
21
22struct A1
23{
24    char _[43981];
25    virtual ~A1() {}
26
27    A1* getA1() {return this;}
28};
29
30struct A2
31{
32    char _[34981];
33    virtual ~A2() {}
34
35    A2* getA2() {return this;}
36};
37
38struct A3
39    : public virtual A1,
40      private A2
41{
42    char _[93481];
43    virtual ~A3() {}
44
45    A1* getA1() {return A1::getA1();}
46    A2* getA2() {return A2::getA2();}
47    A3* getA3() {return this;}
48};
49
50struct A4
51    : public A3,
52      public A2
53{
54    char _[13489];
55    virtual ~A4() {}
56
57    t1::A1* getA1() {return A3::getA1();}
58    A2* getA2() {return A3::getA2();}
59    A3* getA3() {return A3::getA3();}
60    A4* getA4() {return this;}
61};
62
63struct A5
64    : public A4,
65      public A3
66{
67    char _[13489];
68    virtual ~A5() {}
69
70    t1::A1* getA1() {return A4::getA1();}
71    A2* getA2() {return A4::getA2();}
72    A3* getA3() {return A4::getA3();}
73    A4* getA4() {return A4::getA4();}
74    A5* getA5() {return this;}
75};
76
77void 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
163namespace t2
164{
165
166struct A1
167{
168    char _[43981];
169    virtual ~A1() {}
170
171    A1* getA1() {return this;}
172};
173
174struct A2
175{
176    char _[34981];
177    virtual ~A2() {}
178
179    A2* getA2() {return this;}
180};
181
182struct A3
183    : public virtual A1,
184      public A2
185{
186    char _[93481];
187    virtual ~A3() {}
188
189    A1* getA1() {return A1::getA1();}
190    A2* getA2() {return A2::getA2();}
191    A3* getA3() {return this;}
192};
193
194struct A4
195    : public A3,
196      public A2
197{
198    char _[13489];
199    virtual ~A4() {}
200
201    t2::A1* getA1() {return A3::getA1();}
202    A2* getA2() {return A3::getA2();}
203    A3* getA3() {return A3::getA3();}
204    A4* getA4() {return this;}
205};
206
207struct A5
208    : public A4,
209      public A3
210{
211    char _[13489];
212    virtual ~A5() {}
213
214    t2::A1* getA1() {return A4::getA1();}
215    A2* getA2() {return A4::getA2();}
216    A3* getA3() {return A4::getA3();}
217    A4* getA4() {return A4::getA4();}
218    A5* getA5() {return this;}
219};
220
221void 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
307namespace t3
308{
309
310struct A1
311{
312    char _[43981];
313    virtual ~A1() {}
314
315    A1* getA1() {return this;}
316};
317
318struct A2
319{
320    char _[34981];
321    virtual ~A2() {}
322
323    A2* getA2() {return this;}
324};
325
326struct A3
327    : public A1,
328      public virtual A2
329{
330    char _[93481];
331    virtual ~A3() {}
332
333    A1* getA1() {return A1::getA1();}
334    A2* getA2() {return A2::getA2();}
335    A3* getA3() {return this;}
336};
337
338struct A4
339    : public A1,
340      public virtual A2
341{
342    char _[13489];
343    virtual ~A4() {}
344
345    A1* getA1() {return A1::getA1();}
346    A2* getA2() {return A2::getA2();}
347    A4* getA4() {return this;}
348};
349
350struct A5
351    : public A3,
352      public A4
353{
354    char _[41389];
355    virtual ~A5() {}
356
357    A1* getA14() {return A4::getA1();}
358    A1* getA13() {return A3::getA1();}
359    A2* getA2() {return A4::getA2();}
360    A3* getA3() {return A3::getA3();}
361    A4* getA4() {return A4::getA4();}
362    A5* getA5() {return this;}
363};
364
365void 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
450namespace t4
451{
452
453struct A1
454{
455    char _[43981];
456    virtual ~A1() {}
457
458    A1* getA1() {return this;}
459};
460
461struct A2
462{
463    char _[34981];
464    virtual ~A2() {}
465
466    A2* getA2() {return this;}
467};
468
469struct A3
470    : protected A1,
471      public virtual A2
472{
473    char _[93481];
474    virtual ~A3() {}
475
476    A1* getA1() {return A1::getA1();}
477    A2* getA2() {return A2::getA2();}
478    A3* getA3() {return this;}
479};
480
481struct A4
482    : public A1,
483      public virtual A2
484{
485    char _[13489];
486    virtual ~A4() {}
487
488    A1* getA1() {return A1::getA1();}
489    A2* getA2() {return A2::getA2();}
490    A4* getA4() {return this;}
491};
492
493struct A5
494    : public A3,
495      public A4
496{
497    char _[41389];
498    virtual ~A5() {}
499
500    A1* getA14() {return A4::getA1();}
501    A1* getA13() {return A3::getA1();}
502    A2* getA2() {return A4::getA2();}
503    A3* getA3() {return A3::getA3();}
504    A4* getA4() {return A4::getA4();}
505    A5* getA5() {return this;}
506};
507
508void 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
593namespace t5
594{
595
596struct A1
597{
598    char _[43981];
599    virtual ~A1() {}
600
601    A1* getA1() {return this;}
602};
603
604struct A2
605{
606    char _[34981];
607    virtual ~A2() {}
608
609    A2* getA2() {return this;}
610};
611
612struct A3
613    : public A1,
614      protected virtual A2
615{
616    char _[93481];
617    virtual ~A3() {}
618
619    A1* getA1() {return A1::getA1();}
620    A2* getA2() {return A2::getA2();}
621    A3* getA3() {return this;}
622};
623
624struct A4
625    : public A1,
626      public virtual A2
627{
628    char _[13489];
629    virtual ~A4() {}
630
631    A1* getA1() {return A1::getA1();}
632    A2* getA2() {return A2::getA2();}
633    A4* getA4() {return this;}
634};
635
636struct A5
637    : public A3,
638      public A4
639{
640    char _[41389];
641    virtual ~A5() {}
642
643    A1* getA14() {return A4::getA1();}
644    A1* getA13() {return A3::getA1();}
645    A2* getA2() {return A4::getA2();}
646    A3* getA3() {return A3::getA3();}
647    A4* getA4() {return A4::getA4();}
648    A5* getA5() {return this;}
649};
650
651void 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
736namespace t6
737{
738
739struct A1
740{
741    char _[43981];
742    virtual ~A1() {}
743
744    A1* getA1() {return this;}
745};
746
747struct A2
748{
749    char _[34981];
750    virtual ~A2() {}
751
752    A2* getA2() {return this;}
753};
754
755struct A3
756    : public A1,
757      public virtual A2
758{
759    char _[93481];
760    virtual ~A3() {}
761
762    A1* getA1() {return A1::getA1();}
763    A2* getA2() {return A2::getA2();}
764    A3* getA3() {return this;}
765};
766
767struct A4
768    : protected A1,
769      public virtual A2
770{
771    char _[13489];
772    virtual ~A4() {}
773
774    A1* getA1() {return A1::getA1();}
775    A2* getA2() {return A2::getA2();}
776    A4* getA4() {return this;}
777};
778
779struct A5
780    : public A3,
781      public A4
782{
783    char _[41389];
784    virtual ~A5() {}
785
786    A1* getA14() {return A4::getA1();}
787    A1* getA13() {return A3::getA1();}
788    A2* getA2() {return A4::getA2();}
789    A3* getA3() {return A3::getA3();}
790    A4* getA4() {return A4::getA4();}
791    A5* getA5() {return this;}
792};
793
794void 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
879namespace t7
880{
881
882struct A1
883{
884    char _[43981];
885    virtual ~A1() {}
886
887    A1* getA1() {return this;}
888};
889
890struct A2
891{
892    char _[34981];
893    virtual ~A2() {}
894
895    A2* getA2() {return this;}
896};
897
898struct A3
899    : public A1,
900      public virtual A2
901{
902    char _[93481];
903    virtual ~A3() {}
904
905    A1* getA1() {return A1::getA1();}
906    A2* getA2() {return A2::getA2();}
907    A3* getA3() {return this;}
908};
909
910struct A4
911    : public A1,
912      protected virtual A2
913{
914    char _[13489];
915    virtual ~A4() {}
916
917    A1* getA1() {return A1::getA1();}
918    A2* getA2() {return A2::getA2();}
919    A4* getA4() {return this;}
920};
921
922struct A5
923    : public A3,
924      public A4
925{
926    char _[41389];
927    virtual ~A5() {}
928
929    A1* getA14() {return A4::getA1();}
930    A1* getA13() {return A3::getA1();}
931    A2* getA2() {return A4::getA2();}
932    A3* getA3() {return A3::getA3();}
933    A4* getA4() {return A4::getA4();}
934    A5* getA5() {return this;}
935};
936
937void 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
1022namespace t8
1023{
1024
1025struct A1
1026{
1027    char _[43981];
1028    virtual ~A1() {}
1029
1030    A1* getA1() {return this;}
1031};
1032
1033struct A2
1034{
1035    char _[34981];
1036    virtual ~A2() {}
1037
1038    A2* getA2() {return this;}
1039};
1040
1041struct A3
1042    : public A1,
1043      public virtual A2
1044{
1045    char _[93481];
1046    virtual ~A3() {}
1047
1048    A1* getA1() {return A1::getA1();}
1049    A2* getA2() {return A2::getA2();}
1050    A3* getA3() {return this;}
1051};
1052
1053struct A4
1054    : public A1,
1055      public virtual A2
1056{
1057    char _[13489];
1058    virtual ~A4() {}
1059
1060    A1* getA1() {return A1::getA1();}
1061    A2* getA2() {return A2::getA2();}
1062    A4* getA4() {return this;}
1063};
1064
1065struct A5
1066    : protected A3,
1067      public A4
1068{
1069    char _[41389];
1070    virtual ~A5() {}
1071
1072    A1* getA14() {return A4::getA1();}
1073    A1* getA13() {return A3::getA1();}
1074    A2* getA2() {return A4::getA2();}
1075    A3* getA3() {return A3::getA3();}
1076    A4* getA4() {return A4::getA4();}
1077    A5* getA5() {return this;}
1078};
1079
1080void 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
1165namespace t9
1166{
1167
1168struct A1
1169{
1170    char _[43981];
1171    virtual ~A1() {}
1172
1173    A1* getA1() {return this;}
1174};
1175
1176struct A2
1177{
1178    char _[34981];
1179    virtual ~A2() {}
1180
1181    A2* getA2() {return this;}
1182};
1183
1184struct A3
1185    : public A1,
1186      public virtual A2
1187{
1188    char _[93481];
1189    virtual ~A3() {}
1190
1191    A1* getA1() {return A1::getA1();}
1192    A2* getA2() {return A2::getA2();}
1193    A3* getA3() {return this;}
1194};
1195
1196struct A4
1197    : public A1,
1198      public virtual A2
1199{
1200    char _[13489];
1201    virtual ~A4() {}
1202
1203    A1* getA1() {return A1::getA1();}
1204    A2* getA2() {return A2::getA2();}
1205    A4* getA4() {return this;}
1206};
1207
1208struct A5
1209    : public A3,
1210      protected A4
1211{
1212    char _[41389];
1213    virtual ~A5() {}
1214
1215    A1* getA14() {return A4::getA1();}
1216    A1* getA13() {return A3::getA1();}
1217    A2* getA2() {return A4::getA2();}
1218    A3* getA3() {return A3::getA3();}
1219    A4* getA4() {return A4::getA4();}
1220    A5* getA5() {return this;}
1221};
1222
1223void 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
1309int 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