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