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
13namespace t1
14{
15
16struct A1
17{
18    char _[43981];
19    virtual ~A1() {}
20
21    A1* getA1() {return this;}
22};
23
24struct A2
25{
26    char _[34981];
27    virtual ~A2() {}
28
29    A2* getA2() {return this;}
30};
31
32struct A3
33    : public virtual A1,
34      private A2
35{
36    char _[93481];
37    virtual ~A3() {}
38
39    A1* getA1() {return A1::getA1();}
40    A2* getA2() {return A2::getA2();}
41    A3* getA3() {return this;}
42};
43
44struct A4
45    : public A3,
46      public A2
47{
48    char _[13489];
49    virtual ~A4() {}
50
51    t1::A1* getA1() {return A3::getA1();}
52    A2* getA2() {return A3::getA2();}
53    A3* getA3() {return A3::getA3();}
54    A4* getA4() {return this;}
55};
56
57struct A5
58    : public A4,
59      public A3
60{
61    char _[13489];
62    virtual ~A5() {}
63
64    t1::A1* getA1() {return A4::getA1();}
65    A2* getA2() {return A4::getA2();}
66    A3* getA3() {return A4::getA3();}
67    A4* getA4() {return A4::getA4();}
68    A5* getA5() {return this;}
69};
70
71void test()
72{
73    A1 a1;
74    A2 a2;
75    A3 a3;
76    A4 a4;
77    A5 a5;
78
79    assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
80    assert(dynamic_cast<A1*>(a2.getA2()) == 0);
81    assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
82    assert(dynamic_cast<A1*>(a3.getA2()) == 0);
83    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
84    assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
85    assert(dynamic_cast<A1*>(a4.getA2()) == 0);
86    assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
87    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
88    assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
89    assert(dynamic_cast<A1*>(a5.getA2()) == 0);
90    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
91    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
92    assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
93
94    assert(dynamic_cast<A2*>(a1.getA1()) == 0);
95    assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
96    assert(dynamic_cast<A2*>(a3.getA1()) == 0);
97    assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
98//    assert(dynamic_cast<A2*>(a3.getA3()) == 0);  // cast to private base
99    assert(dynamic_cast<A2*>(a4.getA1()) == 0);
100    assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
101//    assert(dynamic_cast<A2*>(a4.getA3()) == 0);  // cast to private base
102//    assert(dynamic_cast<A2*>(a4.getA4()) == 0);  // cast to ambiguous base
103    assert(dynamic_cast<A2*>(a5.getA1()) == 0);
104    assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
105//    assert(dynamic_cast<A2*>(a5.getA3()) == 0);  // cast to private base
106//    assert(dynamic_cast<A2*>(a5.getA4()) == 0);  // cast to ambiguous base
107//    assert(dynamic_cast<A2*>(a5.getA5()) == 0);  // cast to ambiguous base
108
109    assert(dynamic_cast<A3*>(a1.getA1()) == 0);
110    assert(dynamic_cast<A3*>(a2.getA2()) == 0);
111    assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
112    assert(dynamic_cast<A3*>(a3.getA2()) == 0);
113    assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
114    assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
115    assert(dynamic_cast<A3*>(a4.getA2()) == 0);
116    assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
117    assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
118    assert(dynamic_cast<A3*>(a5.getA1()) == 0);
119    assert(dynamic_cast<A3*>(a5.getA2()) == 0);
120    assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
121    assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
122//    assert(dynamic_cast<A3*>(a5.getA5()) == 0);  // cast to ambiguous base
123
124    assert(dynamic_cast<A4*>(a1.getA1()) == 0);
125    assert(dynamic_cast<A4*>(a2.getA2()) == 0);
126    assert(dynamic_cast<A4*>(a3.getA1()) == 0);
127    assert(dynamic_cast<A4*>(a3.getA2()) == 0);
128    assert(dynamic_cast<A4*>(a3.getA3()) == 0);
129    assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
130    assert(dynamic_cast<A4*>(a4.getA2()) == 0);
131    assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
132    assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
133    assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
134    assert(dynamic_cast<A4*>(a5.getA2()) == 0);
135    assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
136    assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
137    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
138
139    assert(dynamic_cast<A5*>(a1.getA1()) == 0);
140    assert(dynamic_cast<A5*>(a2.getA2()) == 0);
141    assert(dynamic_cast<A5*>(a3.getA1()) == 0);
142    assert(dynamic_cast<A5*>(a3.getA2()) == 0);
143    assert(dynamic_cast<A5*>(a3.getA3()) == 0);
144    assert(dynamic_cast<A5*>(a4.getA1()) == 0);
145    assert(dynamic_cast<A5*>(a4.getA2()) == 0);
146    assert(dynamic_cast<A5*>(a4.getA3()) == 0);
147    assert(dynamic_cast<A5*>(a4.getA4()) == 0);
148    assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
149    assert(dynamic_cast<A5*>(a5.getA2()) == 0);
150    assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
151    assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
152    assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
153}
154
155}  // t1
156
157namespace t2
158{
159
160struct A1
161{
162    char _[43981];
163    virtual ~A1() {}
164
165    A1* getA1() {return this;}
166};
167
168struct A2
169{
170    char _[34981];
171    virtual ~A2() {}
172
173    A2* getA2() {return this;}
174};
175
176struct A3
177    : public virtual A1,
178      public A2
179{
180    char _[93481];
181    virtual ~A3() {}
182
183    A1* getA1() {return A1::getA1();}
184    A2* getA2() {return A2::getA2();}
185    A3* getA3() {return this;}
186};
187
188struct A4
189    : public A3,
190      public A2
191{
192    char _[13489];
193    virtual ~A4() {}
194
195    t2::A1* getA1() {return A3::getA1();}
196    A2* getA2() {return A3::getA2();}
197    A3* getA3() {return A3::getA3();}
198    A4* getA4() {return this;}
199};
200
201struct A5
202    : public A4,
203      public A3
204{
205    char _[13489];
206    virtual ~A5() {}
207
208    t2::A1* getA1() {return A4::getA1();}
209    A2* getA2() {return A4::getA2();}
210    A3* getA3() {return A4::getA3();}
211    A4* getA4() {return A4::getA4();}
212    A5* getA5() {return this;}
213};
214
215void test()
216{
217    A1 a1;
218    A2 a2;
219    A3 a3;
220    A4 a4;
221    A5 a5;
222
223    assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
224    assert(dynamic_cast<A1*>(a2.getA2()) == 0);
225    assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
226    assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
227    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
228    assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
229    assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
230    assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
231    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
232    assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
233    assert(dynamic_cast<A1*>(a5.getA2()) == a5.getA1());
234    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
235    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
236    assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
237
238    assert(dynamic_cast<A2*>(a1.getA1()) == 0);
239    assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
240    assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
241    assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
242    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
243    assert(dynamic_cast<A2*>(a4.getA1()) == 0);
244    assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
245    assert(dynamic_cast<A2*>(a4.getA3()) == a4.getA2());
246//    assert(dynamic_cast<A2*>(a4.getA4()) == 0);  // cast to ambiguous base
247    assert(dynamic_cast<A2*>(a5.getA1()) == 0);
248    assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
249    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
250//    assert(dynamic_cast<A2*>(a5.getA4()) == 0);  // cast to ambiguous base
251//    assert(dynamic_cast<A2*>(a5.getA5()) == 0);  // cast to ambiguous base
252
253    assert(dynamic_cast<A3*>(a1.getA1()) == 0);
254    assert(dynamic_cast<A3*>(a2.getA2()) == 0);
255    assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
256    assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
257    assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
258    assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
259    assert(dynamic_cast<A3*>(a4.getA2()) == a4.getA3());
260    assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
261    assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
262    assert(dynamic_cast<A3*>(a5.getA1()) == 0);
263    assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
264    assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
265    assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
266//    assert(dynamic_cast<A3*>(a5.getA5()) == 0);  // cast to ambiguous base
267
268    assert(dynamic_cast<A4*>(a1.getA1()) == 0);
269    assert(dynamic_cast<A4*>(a2.getA2()) == 0);
270    assert(dynamic_cast<A4*>(a3.getA1()) == 0);
271    assert(dynamic_cast<A4*>(a3.getA2()) == 0);
272    assert(dynamic_cast<A4*>(a3.getA3()) == 0);
273    assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
274    assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
275    assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
276    assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
277    assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
278    assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
279    assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
280    assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
281    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
282
283    assert(dynamic_cast<A5*>(a1.getA1()) == 0);
284    assert(dynamic_cast<A5*>(a2.getA2()) == 0);
285    assert(dynamic_cast<A5*>(a3.getA1()) == 0);
286    assert(dynamic_cast<A5*>(a3.getA2()) == 0);
287    assert(dynamic_cast<A5*>(a3.getA3()) == 0);
288    assert(dynamic_cast<A5*>(a4.getA1()) == 0);
289    assert(dynamic_cast<A5*>(a4.getA2()) == 0);
290    assert(dynamic_cast<A5*>(a4.getA3()) == 0);
291    assert(dynamic_cast<A5*>(a4.getA4()) == 0);
292    assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
293    assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
294    assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
295    assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
296    assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
297}
298
299}  // t2
300
301namespace t3
302{
303
304struct A1
305{
306    char _[43981];
307    virtual ~A1() {}
308
309    A1* getA1() {return this;}
310};
311
312struct A2
313{
314    char _[34981];
315    virtual ~A2() {}
316
317    A2* getA2() {return this;}
318};
319
320struct A3
321    : public A1,
322      public virtual A2
323{
324    char _[93481];
325    virtual ~A3() {}
326
327    A1* getA1() {return A1::getA1();}
328    A2* getA2() {return A2::getA2();}
329    A3* getA3() {return this;}
330};
331
332struct A4
333    : public A1,
334      public virtual A2
335{
336    char _[13489];
337    virtual ~A4() {}
338
339    A1* getA1() {return A1::getA1();}
340    A2* getA2() {return A2::getA2();}
341    A4* getA4() {return this;}
342};
343
344struct A5
345    : public A3,
346      public A4
347{
348    char _[41389];
349    virtual ~A5() {}
350
351    A1* getA14() {return A4::getA1();}
352    A1* getA13() {return A3::getA1();}
353    A2* getA2() {return A4::getA2();}
354    A3* getA3() {return A3::getA3();}
355    A4* getA4() {return A4::getA4();}
356    A5* getA5() {return this;}
357};
358
359void test()
360{
361    A1 a1;
362    A2 a2;
363    A3 a3;
364    A4 a4;
365    A5 a5;
366
367    assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
368    assert(dynamic_cast<A1*>(a2.getA2()) == 0);
369    assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
370    assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
371    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
372    assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
373    assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
374    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
375    assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
376    assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
377    assert(dynamic_cast<A1*>(a5.getA2()) == 0);
378    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
379    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
380
381    assert(dynamic_cast<A2*>(a1.getA1()) == 0);
382    assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
383    assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
384    assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
385    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
386    assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
387    assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
388    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
389    assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
390    assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
391    assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
392    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
393    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
394    assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
395
396    assert(dynamic_cast<A3*>(a1.getA1()) == 0);
397    assert(dynamic_cast<A3*>(a2.getA2()) == 0);
398    assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
399    assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
400    assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
401    assert(dynamic_cast<A3*>(a4.getA1()) == 0);
402    assert(dynamic_cast<A3*>(a4.getA2()) == 0);
403    assert(dynamic_cast<A3*>(a4.getA4()) == 0);
404    assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
405    assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
406    assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
407    assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
408    assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
409    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
410
411    assert(dynamic_cast<A4*>(a1.getA1()) == 0);
412    assert(dynamic_cast<A4*>(a2.getA2()) == 0);
413    assert(dynamic_cast<A4*>(a3.getA1()) == 0);
414    assert(dynamic_cast<A4*>(a3.getA2()) == 0);
415    assert(dynamic_cast<A4*>(a3.getA3()) == 0);
416    assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
417    assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
418    assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
419    assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
420    assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
421    assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
422    assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
423    assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
424    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
425
426    assert(dynamic_cast<A5*>(a1.getA1()) == 0);
427    assert(dynamic_cast<A5*>(a2.getA2()) == 0);
428    assert(dynamic_cast<A5*>(a3.getA1()) == 0);
429    assert(dynamic_cast<A5*>(a3.getA2()) == 0);
430    assert(dynamic_cast<A5*>(a3.getA3()) == 0);
431    assert(dynamic_cast<A5*>(a4.getA1()) == 0);
432    assert(dynamic_cast<A5*>(a4.getA2()) == 0);
433    assert(dynamic_cast<A5*>(a4.getA4()) == 0);
434    assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
435    assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
436    assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
437    assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
438    assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
439    assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
440}
441
442}  // t3
443
444namespace t4
445{
446
447struct A1
448{
449    char _[43981];
450    virtual ~A1() {}
451
452    A1* getA1() {return this;}
453};
454
455struct A2
456{
457    char _[34981];
458    virtual ~A2() {}
459
460    A2* getA2() {return this;}
461};
462
463struct A3
464    : protected A1,
465      public virtual A2
466{
467    char _[93481];
468    virtual ~A3() {}
469
470    A1* getA1() {return A1::getA1();}
471    A2* getA2() {return A2::getA2();}
472    A3* getA3() {return this;}
473};
474
475struct A4
476    : public A1,
477      public virtual A2
478{
479    char _[13489];
480    virtual ~A4() {}
481
482    A1* getA1() {return A1::getA1();}
483    A2* getA2() {return A2::getA2();}
484    A4* getA4() {return this;}
485};
486
487struct A5
488    : public A3,
489      public A4
490{
491    char _[41389];
492    virtual ~A5() {}
493
494    A1* getA14() {return A4::getA1();}
495    A1* getA13() {return A3::getA1();}
496    A2* getA2() {return A4::getA2();}
497    A3* getA3() {return A3::getA3();}
498    A4* getA4() {return A4::getA4();}
499    A5* getA5() {return this;}
500};
501
502void test()
503{
504    A1 a1;
505    A2 a2;
506    A3 a3;
507    A4 a4;
508    A5 a5;
509
510    assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
511    assert(dynamic_cast<A1*>(a2.getA2()) == 0);
512    assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
513    assert(dynamic_cast<A1*>(a3.getA2()) == 0);
514//    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());  // cast to protected base
515    assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
516    assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
517    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
518    assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
519    assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
520    assert(dynamic_cast<A1*>(a5.getA2()) == 0);
521//    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());  // cast to protected base
522    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
523
524    assert(dynamic_cast<A2*>(a1.getA1()) == 0);
525    assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
526    assert(dynamic_cast<A2*>(a3.getA1()) == 0);
527    assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
528    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
529    assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
530    assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
531    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
532    assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
533    assert(dynamic_cast<A2*>(a5.getA13()) == 0);
534    assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
535    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
536    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
537    assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
538
539    assert(dynamic_cast<A3*>(a1.getA1()) == 0);
540    assert(dynamic_cast<A3*>(a2.getA2()) == 0);
541    assert(dynamic_cast<A3*>(a3.getA1()) == 0);
542    assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
543    assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
544    assert(dynamic_cast<A3*>(a4.getA1()) == 0);
545    assert(dynamic_cast<A3*>(a4.getA2()) == 0);
546    assert(dynamic_cast<A3*>(a4.getA4()) == 0);
547    assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
548    assert(dynamic_cast<A3*>(a5.getA13()) == 0);
549    assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
550    assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
551    assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
552    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
553
554    assert(dynamic_cast<A4*>(a1.getA1()) == 0);
555    assert(dynamic_cast<A4*>(a2.getA2()) == 0);
556    assert(dynamic_cast<A4*>(a3.getA1()) == 0);
557    assert(dynamic_cast<A4*>(a3.getA2()) == 0);
558    assert(dynamic_cast<A4*>(a3.getA3()) == 0);
559    assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
560    assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
561    assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
562    assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
563    assert(dynamic_cast<A4*>(a5.getA13()) == 0);
564    assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
565    assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
566    assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
567    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
568
569    assert(dynamic_cast<A5*>(a1.getA1()) == 0);
570    assert(dynamic_cast<A5*>(a2.getA2()) == 0);
571    assert(dynamic_cast<A5*>(a3.getA1()) == 0);
572    assert(dynamic_cast<A5*>(a3.getA2()) == 0);
573    assert(dynamic_cast<A5*>(a3.getA3()) == 0);
574    assert(dynamic_cast<A5*>(a4.getA1()) == 0);
575    assert(dynamic_cast<A5*>(a4.getA2()) == 0);
576    assert(dynamic_cast<A5*>(a4.getA4()) == 0);
577    assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
578    assert(dynamic_cast<A5*>(a5.getA13()) == 0);
579    assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
580    assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
581    assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
582    assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
583}
584
585}  // t4
586
587namespace t5
588{
589
590struct A1
591{
592    char _[43981];
593    virtual ~A1() {}
594
595    A1* getA1() {return this;}
596};
597
598struct A2
599{
600    char _[34981];
601    virtual ~A2() {}
602
603    A2* getA2() {return this;}
604};
605
606struct A3
607    : public A1,
608      protected virtual A2
609{
610    char _[93481];
611    virtual ~A3() {}
612
613    A1* getA1() {return A1::getA1();}
614    A2* getA2() {return A2::getA2();}
615    A3* getA3() {return this;}
616};
617
618struct A4
619    : public A1,
620      public virtual A2
621{
622    char _[13489];
623    virtual ~A4() {}
624
625    A1* getA1() {return A1::getA1();}
626    A2* getA2() {return A2::getA2();}
627    A4* getA4() {return this;}
628};
629
630struct A5
631    : public A3,
632      public A4
633{
634    char _[41389];
635    virtual ~A5() {}
636
637    A1* getA14() {return A4::getA1();}
638    A1* getA13() {return A3::getA1();}
639    A2* getA2() {return A4::getA2();}
640    A3* getA3() {return A3::getA3();}
641    A4* getA4() {return A4::getA4();}
642    A5* getA5() {return this;}
643};
644
645void test()
646{
647    A1 a1;
648    A2 a2;
649    A3 a3;
650    A4 a4;
651    A5 a5;
652
653    assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
654    assert(dynamic_cast<A1*>(a2.getA2()) == 0);
655    assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
656    assert(dynamic_cast<A1*>(a3.getA2()) == 0);
657    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
658    assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
659    assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
660    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
661    assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
662    assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
663    assert(dynamic_cast<A1*>(a5.getA2()) == 0);
664    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
665    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
666
667    assert(dynamic_cast<A2*>(a1.getA1()) == 0);
668    assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
669    assert(dynamic_cast<A2*>(a3.getA1()) == 0);
670    assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
671//    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());  // cast to protected base
672    assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
673    assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
674    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
675    assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
676    assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
677    assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
678//    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());  // cast to protected base
679    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
680    assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
681
682    assert(dynamic_cast<A3*>(a1.getA1()) == 0);
683    assert(dynamic_cast<A3*>(a2.getA2()) == 0);
684    assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
685    assert(dynamic_cast<A3*>(a3.getA2()) == 0);
686    assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
687    assert(dynamic_cast<A3*>(a4.getA1()) == 0);
688    assert(dynamic_cast<A3*>(a4.getA2()) == 0);
689    assert(dynamic_cast<A3*>(a4.getA4()) == 0);
690    assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
691    assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
692    assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
693    assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
694    assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
695    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
696
697    assert(dynamic_cast<A4*>(a1.getA1()) == 0);
698    assert(dynamic_cast<A4*>(a2.getA2()) == 0);
699    assert(dynamic_cast<A4*>(a3.getA1()) == 0);
700    assert(dynamic_cast<A4*>(a3.getA2()) == 0);
701    assert(dynamic_cast<A4*>(a3.getA3()) == 0);
702    assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
703    assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
704    assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
705    assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
706    assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
707    assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
708    assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
709    assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
710    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
711
712    assert(dynamic_cast<A5*>(a1.getA1()) == 0);
713    assert(dynamic_cast<A5*>(a2.getA2()) == 0);
714    assert(dynamic_cast<A5*>(a3.getA1()) == 0);
715    assert(dynamic_cast<A5*>(a3.getA2()) == 0);
716    assert(dynamic_cast<A5*>(a3.getA3()) == 0);
717    assert(dynamic_cast<A5*>(a4.getA1()) == 0);
718    assert(dynamic_cast<A5*>(a4.getA2()) == 0);
719    assert(dynamic_cast<A5*>(a4.getA4()) == 0);
720    assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
721    assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
722    assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
723    assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
724    assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
725    assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
726}
727
728}  // t5
729
730namespace t6
731{
732
733struct A1
734{
735    char _[43981];
736    virtual ~A1() {}
737
738    A1* getA1() {return this;}
739};
740
741struct A2
742{
743    char _[34981];
744    virtual ~A2() {}
745
746    A2* getA2() {return this;}
747};
748
749struct A3
750    : public A1,
751      public virtual A2
752{
753    char _[93481];
754    virtual ~A3() {}
755
756    A1* getA1() {return A1::getA1();}
757    A2* getA2() {return A2::getA2();}
758    A3* getA3() {return this;}
759};
760
761struct A4
762    : protected A1,
763      public virtual A2
764{
765    char _[13489];
766    virtual ~A4() {}
767
768    A1* getA1() {return A1::getA1();}
769    A2* getA2() {return A2::getA2();}
770    A4* getA4() {return this;}
771};
772
773struct A5
774    : public A3,
775      public A4
776{
777    char _[41389];
778    virtual ~A5() {}
779
780    A1* getA14() {return A4::getA1();}
781    A1* getA13() {return A3::getA1();}
782    A2* getA2() {return A4::getA2();}
783    A3* getA3() {return A3::getA3();}
784    A4* getA4() {return A4::getA4();}
785    A5* getA5() {return this;}
786};
787
788void test()
789{
790    A1 a1;
791    A2 a2;
792    A3 a3;
793    A4 a4;
794    A5 a5;
795
796    assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
797    assert(dynamic_cast<A1*>(a2.getA2()) == 0);
798    assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
799    assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
800    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
801    assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
802    assert(dynamic_cast<A1*>(a4.getA2()) == 0);
803//    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());  // cast to protected base
804    assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
805    assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
806    assert(dynamic_cast<A1*>(a5.getA2()) == 0);
807    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
808//    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());  // cast to protected base
809
810    assert(dynamic_cast<A2*>(a1.getA1()) == 0);
811    assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
812    assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
813    assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
814    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
815    assert(dynamic_cast<A2*>(a4.getA1()) == 0);
816    assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
817    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
818    assert(dynamic_cast<A2*>(a5.getA14()) == 0);
819    assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
820    assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
821    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
822    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
823    assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
824
825    assert(dynamic_cast<A3*>(a1.getA1()) == 0);
826    assert(dynamic_cast<A3*>(a2.getA2()) == 0);
827    assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
828    assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
829    assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
830    assert(dynamic_cast<A3*>(a4.getA1()) == 0);
831    assert(dynamic_cast<A3*>(a4.getA2()) == 0);
832    assert(dynamic_cast<A3*>(a4.getA4()) == 0);
833    assert(dynamic_cast<A3*>(a5.getA14()) == 0);
834    assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
835    assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
836    assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
837    assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
838    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
839
840    assert(dynamic_cast<A4*>(a1.getA1()) == 0);
841    assert(dynamic_cast<A4*>(a2.getA2()) == 0);
842    assert(dynamic_cast<A4*>(a3.getA1()) == 0);
843    assert(dynamic_cast<A4*>(a3.getA2()) == 0);
844    assert(dynamic_cast<A4*>(a3.getA3()) == 0);
845    assert(dynamic_cast<A4*>(a4.getA1()) == 0);
846    assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
847    assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
848    assert(dynamic_cast<A4*>(a5.getA14()) == 0);
849    assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
850    assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
851    assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
852    assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
853    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
854
855    assert(dynamic_cast<A5*>(a1.getA1()) == 0);
856    assert(dynamic_cast<A5*>(a2.getA2()) == 0);
857    assert(dynamic_cast<A5*>(a3.getA1()) == 0);
858    assert(dynamic_cast<A5*>(a3.getA2()) == 0);
859    assert(dynamic_cast<A5*>(a3.getA3()) == 0);
860    assert(dynamic_cast<A5*>(a4.getA1()) == 0);
861    assert(dynamic_cast<A5*>(a4.getA2()) == 0);
862    assert(dynamic_cast<A5*>(a4.getA4()) == 0);
863    assert(dynamic_cast<A5*>(a5.getA14()) == 0);
864    assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
865    assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
866    assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
867    assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
868    assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
869}
870
871}  // t6
872
873namespace t7
874{
875
876struct A1
877{
878    char _[43981];
879    virtual ~A1() {}
880
881    A1* getA1() {return this;}
882};
883
884struct A2
885{
886    char _[34981];
887    virtual ~A2() {}
888
889    A2* getA2() {return this;}
890};
891
892struct A3
893    : public A1,
894      public virtual A2
895{
896    char _[93481];
897    virtual ~A3() {}
898
899    A1* getA1() {return A1::getA1();}
900    A2* getA2() {return A2::getA2();}
901    A3* getA3() {return this;}
902};
903
904struct A4
905    : public A1,
906      protected virtual A2
907{
908    char _[13489];
909    virtual ~A4() {}
910
911    A1* getA1() {return A1::getA1();}
912    A2* getA2() {return A2::getA2();}
913    A4* getA4() {return this;}
914};
915
916struct A5
917    : public A3,
918      public A4
919{
920    char _[41389];
921    virtual ~A5() {}
922
923    A1* getA14() {return A4::getA1();}
924    A1* getA13() {return A3::getA1();}
925    A2* getA2() {return A4::getA2();}
926    A3* getA3() {return A3::getA3();}
927    A4* getA4() {return A4::getA4();}
928    A5* getA5() {return this;}
929};
930
931void test()
932{
933    A1 a1;
934    A2 a2;
935    A3 a3;
936    A4 a4;
937    A5 a5;
938
939    assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
940    assert(dynamic_cast<A1*>(a2.getA2()) == 0);
941    assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
942    assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
943    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
944    assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
945    assert(dynamic_cast<A1*>(a4.getA2()) == 0);
946    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
947    assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
948    assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
949    assert(dynamic_cast<A1*>(a5.getA2()) == 0);
950    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
951    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
952
953    assert(dynamic_cast<A2*>(a1.getA1()) == 0);
954    assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
955    assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
956    assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
957    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
958    assert(dynamic_cast<A2*>(a4.getA1()) == 0);
959    assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
960//    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());  // cast to protected base
961    assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
962    assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
963    assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
964    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
965//    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());  // cast to protected base
966    assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
967
968    assert(dynamic_cast<A3*>(a1.getA1()) == 0);
969    assert(dynamic_cast<A3*>(a2.getA2()) == 0);
970    assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
971    assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
972    assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
973    assert(dynamic_cast<A3*>(a4.getA1()) == 0);
974    assert(dynamic_cast<A3*>(a4.getA2()) == 0);
975    assert(dynamic_cast<A3*>(a4.getA4()) == 0);
976    assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
977    assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
978    assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
979    assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
980    assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
981    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
982
983    assert(dynamic_cast<A4*>(a1.getA1()) == 0);
984    assert(dynamic_cast<A4*>(a2.getA2()) == 0);
985    assert(dynamic_cast<A4*>(a3.getA1()) == 0);
986    assert(dynamic_cast<A4*>(a3.getA2()) == 0);
987    assert(dynamic_cast<A4*>(a3.getA3()) == 0);
988    assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
989    assert(dynamic_cast<A4*>(a4.getA2()) == 0);
990    assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
991    assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
992    assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
993    assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
994    assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
995    assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
996    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
997
998    assert(dynamic_cast<A5*>(a1.getA1()) == 0);
999    assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1000    assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1001    assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1002    assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1003    assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1004    assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1005    assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1006    assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
1007    assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
1008    assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1009    assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
1010    assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
1011    assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1012}
1013
1014}  // t7
1015
1016namespace t8
1017{
1018
1019struct A1
1020{
1021    char _[43981];
1022    virtual ~A1() {}
1023
1024    A1* getA1() {return this;}
1025};
1026
1027struct A2
1028{
1029    char _[34981];
1030    virtual ~A2() {}
1031
1032    A2* getA2() {return this;}
1033};
1034
1035struct A3
1036    : public A1,
1037      public virtual A2
1038{
1039    char _[93481];
1040    virtual ~A3() {}
1041
1042    A1* getA1() {return A1::getA1();}
1043    A2* getA2() {return A2::getA2();}
1044    A3* getA3() {return this;}
1045};
1046
1047struct A4
1048    : public A1,
1049      public virtual A2
1050{
1051    char _[13489];
1052    virtual ~A4() {}
1053
1054    A1* getA1() {return A1::getA1();}
1055    A2* getA2() {return A2::getA2();}
1056    A4* getA4() {return this;}
1057};
1058
1059struct A5
1060    : protected A3,
1061      public A4
1062{
1063    char _[41389];
1064    virtual ~A5() {}
1065
1066    A1* getA14() {return A4::getA1();}
1067    A1* getA13() {return A3::getA1();}
1068    A2* getA2() {return A4::getA2();}
1069    A3* getA3() {return A3::getA3();}
1070    A4* getA4() {return A4::getA4();}
1071    A5* getA5() {return this;}
1072};
1073
1074void test()
1075{
1076    A1 a1;
1077    A2 a2;
1078    A3 a3;
1079    A4 a4;
1080    A5 a5;
1081
1082    assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1083    assert(dynamic_cast<A1*>(a2.getA2()) == 0);
1084    assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1085    assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1086    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1087    assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
1088    assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
1089    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
1090    assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
1091    assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
1092    assert(dynamic_cast<A1*>(a5.getA2()) == 0);
1093    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
1094    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
1095
1096    assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1097    assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1098    assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1099    assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1100    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1101    assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
1102    assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
1103    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
1104    assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
1105    assert(dynamic_cast<A2*>(a5.getA13()) == 0);
1106    assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
1107    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
1108    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
1109    assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
1110
1111    assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1112    assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1113    assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1114    assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1115    assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1116    assert(dynamic_cast<A3*>(a4.getA1()) == 0);
1117    assert(dynamic_cast<A3*>(a4.getA2()) == 0);
1118    assert(dynamic_cast<A3*>(a4.getA4()) == 0);
1119    assert(dynamic_cast<A3*>(a5.getA14()) == 0);
1120    assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
1121    assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
1122    assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
1123    assert(dynamic_cast<A3*>(a5.getA4()) == 0);
1124//    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());  // cast to protected base
1125
1126    assert(dynamic_cast<A4*>(a1.getA1()) == 0);
1127    assert(dynamic_cast<A4*>(a2.getA2()) == 0);
1128    assert(dynamic_cast<A4*>(a3.getA1()) == 0);
1129    assert(dynamic_cast<A4*>(a3.getA2()) == 0);
1130    assert(dynamic_cast<A4*>(a3.getA3()) == 0);
1131    assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
1132    assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
1133    assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
1134    assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
1135    assert(dynamic_cast<A4*>(a5.getA13()) == 0);
1136    assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1137    assert(dynamic_cast<A4*>(a5.getA3()) == 0);
1138    assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1139    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
1140
1141    assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1142    assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1143    assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1144    assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1145    assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1146    assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1147    assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1148    assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1149    assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
1150    assert(dynamic_cast<A5*>(a5.getA13()) == 0);
1151    assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1152    assert(dynamic_cast<A5*>(a5.getA3()) == 0);
1153    assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
1154    assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1155}
1156
1157}  // t8
1158
1159namespace t9
1160{
1161
1162struct A1
1163{
1164    char _[43981];
1165    virtual ~A1() {}
1166
1167    A1* getA1() {return this;}
1168};
1169
1170struct A2
1171{
1172    char _[34981];
1173    virtual ~A2() {}
1174
1175    A2* getA2() {return this;}
1176};
1177
1178struct A3
1179    : public A1,
1180      public virtual A2
1181{
1182    char _[93481];
1183    virtual ~A3() {}
1184
1185    A1* getA1() {return A1::getA1();}
1186    A2* getA2() {return A2::getA2();}
1187    A3* getA3() {return this;}
1188};
1189
1190struct A4
1191    : public A1,
1192      public virtual A2
1193{
1194    char _[13489];
1195    virtual ~A4() {}
1196
1197    A1* getA1() {return A1::getA1();}
1198    A2* getA2() {return A2::getA2();}
1199    A4* getA4() {return this;}
1200};
1201
1202struct A5
1203    : public A3,
1204      protected A4
1205{
1206    char _[41389];
1207    virtual ~A5() {}
1208
1209    A1* getA14() {return A4::getA1();}
1210    A1* getA13() {return A3::getA1();}
1211    A2* getA2() {return A4::getA2();}
1212    A3* getA3() {return A3::getA3();}
1213    A4* getA4() {return A4::getA4();}
1214    A5* getA5() {return this;}
1215};
1216
1217void test()
1218{
1219    A1 a1;
1220    A2 a2;
1221    A3 a3;
1222    A4 a4;
1223    A5 a5;
1224
1225    assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1226    assert(dynamic_cast<A1*>(a2.getA2()) == 0);
1227    assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1228    assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1229    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1230    assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
1231    assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
1232    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
1233    assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
1234    assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
1235    assert(dynamic_cast<A1*>(a5.getA2()) == 0);
1236    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
1237    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
1238
1239    assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1240    assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1241    assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1242    assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1243    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1244    assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
1245    assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
1246    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
1247    assert(dynamic_cast<A2*>(a5.getA14()) == 0);
1248    assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
1249    assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
1250    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
1251    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
1252    assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
1253
1254    assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1255    assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1256    assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1257    assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1258    assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1259    assert(dynamic_cast<A3*>(a4.getA1()) == 0);
1260    assert(dynamic_cast<A3*>(a4.getA2()) == 0);
1261    assert(dynamic_cast<A3*>(a4.getA4()) == 0);
1262    assert(dynamic_cast<A3*>(a5.getA14()) == 0);
1263    assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
1264    assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
1265    assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
1266    assert(dynamic_cast<A3*>(a5.getA4()) == 0);
1267    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
1268
1269    assert(dynamic_cast<A4*>(a1.getA1()) == 0);
1270    assert(dynamic_cast<A4*>(a2.getA2()) == 0);
1271    assert(dynamic_cast<A4*>(a3.getA1()) == 0);
1272    assert(dynamic_cast<A4*>(a3.getA2()) == 0);
1273    assert(dynamic_cast<A4*>(a3.getA3()) == 0);
1274    assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
1275    assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
1276    assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
1277    assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
1278    assert(dynamic_cast<A4*>(a5.getA13()) == 0);
1279    assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1280    assert(dynamic_cast<A4*>(a5.getA3()) == 0);
1281    assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1282//    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());  // cast to protected base
1283
1284    assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1285    assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1286    assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1287    assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1288    assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1289    assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1290    assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1291    assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1292    assert(dynamic_cast<A5*>(a5.getA14()) == 0);
1293    assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
1294    assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1295    assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
1296    assert(dynamic_cast<A5*>(a5.getA4()) == 0);
1297    assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1298}
1299
1300}  // t9
1301
1302
1303int main()
1304{
1305    timer t;
1306    t1::test();
1307    t2::test();
1308    t3::test();
1309    t4::test();
1310    t5::test();
1311    t6::test();
1312    t7::test();
1313    t8::test();
1314    t9::test();
1315}
1316