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