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 #include <cassert>
10 #include "support/timer.h"
11 
12 // This test explicitly tests dynamic cast with types that have inaccessible
13 // bases.
14 #if defined(__clang__)
15 #pragma clang diagnostic ignored "-Winaccessible-base"
16 #endif
17 
18 namespace t1
19 {
20 
21 struct A1
22 {
23     char _[43981];
~A1t1::A124     virtual ~A1() {}
25 
getA1t1::A126     A1* getA1() {return this;}
27 };
28 
29 struct A2
30 {
31     char _[34981];
~A2t1::A232     virtual ~A2() {}
33 
getA2t1::A234     A2* getA2() {return this;}
35 };
36 
37 struct A3
38     : public virtual A1,
39       private A2
40 {
41     char _[93481];
~A3t1::A342     virtual ~A3() {}
43 
getA1t1::A344     A1* getA1() {return A1::getA1();}
getA2t1::A345     A2* getA2() {return A2::getA2();}
getA3t1::A346     A3* getA3() {return this;}
47 };
48 
49 struct A4
50     : public A3,
51       public A2
52 {
53     char _[13489];
~A4t1::A454     virtual ~A4() {}
55 
getA1t1::A456     t1::A1* getA1() {return A3::getA1();}
getA2t1::A457     A2* getA2() {return A3::getA2();}
getA3t1::A458     A3* getA3() {return A3::getA3();}
getA4t1::A459     A4* getA4() {return this;}
60 };
61 
62 struct A5
63     : public A4,
64       public A3
65 {
66     char _[13489];
~A5t1::A567     virtual ~A5() {}
68 
getA1t1::A569     t1::A1* getA1() {return A4::getA1();}
getA2t1::A570     A2* getA2() {return A4::getA2();}
getA3t1::A571     A3* getA3() {return A4::getA3();}
getA4t1::A572     A4* getA4() {return A4::getA4();}
getA5t1::A573     A5* getA5() {return this;}
74 };
75 
test()76 void test()
77 {
78     A1 a1;
79     A2 a2;
80     A3 a3;
81     A4 a4;
82     A5 a5;
83 
84     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
85     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
86     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
87     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
88     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
89     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
90     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
91     assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
92     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
93     assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
94     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
95     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
96     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
97     assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
98 
99     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
100     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
101     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
102     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
103 //    assert(dynamic_cast<A2*>(a3.getA3()) == 0);  // cast to private base
104     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
105     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
106 //    assert(dynamic_cast<A2*>(a4.getA3()) == 0);  // cast to private base
107 //    assert(dynamic_cast<A2*>(a4.getA4()) == 0);  // cast to ambiguous base
108     assert(dynamic_cast<A2*>(a5.getA1()) == 0);
109     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
110 //    assert(dynamic_cast<A2*>(a5.getA3()) == 0);  // cast to private base
111 //    assert(dynamic_cast<A2*>(a5.getA4()) == 0);  // cast to ambiguous base
112 //    assert(dynamic_cast<A2*>(a5.getA5()) == 0);  // cast to ambiguous base
113 
114     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
115     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
116     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
117     assert(dynamic_cast<A3*>(a3.getA2()) == 0);
118     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
119     assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
120     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
121     assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
122     assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
123     assert(dynamic_cast<A3*>(a5.getA1()) == 0);
124     assert(dynamic_cast<A3*>(a5.getA2()) == 0);
125     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
126     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
127 //    assert(dynamic_cast<A3*>(a5.getA5()) == 0);  // cast to ambiguous base
128 
129     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
130     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
131     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
132     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
133     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
134     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
135     assert(dynamic_cast<A4*>(a4.getA2()) == 0);
136     assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
137     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
138     assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
139     assert(dynamic_cast<A4*>(a5.getA2()) == 0);
140     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
141     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
142     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
143 
144     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
145     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
146     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
147     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
148     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
149     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
150     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
151     assert(dynamic_cast<A5*>(a4.getA3()) == 0);
152     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
153     assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
154     assert(dynamic_cast<A5*>(a5.getA2()) == 0);
155     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
156     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
157     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
158 }
159 
160 }  // t1
161 
162 namespace t2
163 {
164 
165 struct A1
166 {
167     char _[43981];
~A1t2::A1168     virtual ~A1() {}
169 
getA1t2::A1170     A1* getA1() {return this;}
171 };
172 
173 struct A2
174 {
175     char _[34981];
~A2t2::A2176     virtual ~A2() {}
177 
getA2t2::A2178     A2* getA2() {return this;}
179 };
180 
181 struct A3
182     : public virtual A1,
183       public A2
184 {
185     char _[93481];
~A3t2::A3186     virtual ~A3() {}
187 
getA1t2::A3188     A1* getA1() {return A1::getA1();}
getA2t2::A3189     A2* getA2() {return A2::getA2();}
getA3t2::A3190     A3* getA3() {return this;}
191 };
192 
193 struct A4
194     : public A3,
195       public A2
196 {
197     char _[13489];
~A4t2::A4198     virtual ~A4() {}
199 
getA1t2::A4200     t2::A1* getA1() {return A3::getA1();}
getA2t2::A4201     A2* getA2() {return A3::getA2();}
getA3t2::A4202     A3* getA3() {return A3::getA3();}
getA4t2::A4203     A4* getA4() {return this;}
204 };
205 
206 struct A5
207     : public A4,
208       public A3
209 {
210     char _[13489];
~A5t2::A5211     virtual ~A5() {}
212 
getA1t2::A5213     t2::A1* getA1() {return A4::getA1();}
getA2t2::A5214     A2* getA2() {return A4::getA2();}
getA3t2::A5215     A3* getA3() {return A4::getA3();}
getA4t2::A5216     A4* getA4() {return A4::getA4();}
getA5t2::A5217     A5* getA5() {return this;}
218 };
219 
test()220 void test()
221 {
222     A1 a1;
223     A2 a2;
224     A3 a3;
225     A4 a4;
226     A5 a5;
227 
228     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
229     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
230     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
231     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
232     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
233     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
234     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
235     assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
236     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
237     assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
238     assert(dynamic_cast<A1*>(a5.getA2()) == a5.getA1());
239     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
240     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
241     assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
242 
243     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
244     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
245     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
246     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
247     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
248     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
249     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
250     assert(dynamic_cast<A2*>(a4.getA3()) == a4.getA2());
251 //    assert(dynamic_cast<A2*>(a4.getA4()) == 0);  // cast to ambiguous base
252     assert(dynamic_cast<A2*>(a5.getA1()) == 0);
253     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
254     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
255 //    assert(dynamic_cast<A2*>(a5.getA4()) == 0);  // cast to ambiguous base
256 //    assert(dynamic_cast<A2*>(a5.getA5()) == 0);  // cast to ambiguous base
257 
258     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
259     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
260     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
261     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
262     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
263     assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
264     assert(dynamic_cast<A3*>(a4.getA2()) == a4.getA3());
265     assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
266     assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
267     assert(dynamic_cast<A3*>(a5.getA1()) == 0);
268     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
269     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
270     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
271 //    assert(dynamic_cast<A3*>(a5.getA5()) == 0);  // cast to ambiguous base
272 
273     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
274     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
275     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
276     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
277     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
278     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
279     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
280     assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
281     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
282     assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
283     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
284     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
285     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
286     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
287 
288     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
289     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
290     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
291     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
292     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
293     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
294     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
295     assert(dynamic_cast<A5*>(a4.getA3()) == 0);
296     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
297     assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
298     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
299     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
300     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
301     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
302 }
303 
304 }  // t2
305 
306 namespace t3
307 {
308 
309 struct A1
310 {
311     char _[43981];
~A1t3::A1312     virtual ~A1() {}
313 
getA1t3::A1314     A1* getA1() {return this;}
315 };
316 
317 struct A2
318 {
319     char _[34981];
~A2t3::A2320     virtual ~A2() {}
321 
getA2t3::A2322     A2* getA2() {return this;}
323 };
324 
325 struct A3
326     : public A1,
327       public virtual A2
328 {
329     char _[93481];
~A3t3::A3330     virtual ~A3() {}
331 
getA1t3::A3332     A1* getA1() {return A1::getA1();}
getA2t3::A3333     A2* getA2() {return A2::getA2();}
getA3t3::A3334     A3* getA3() {return this;}
335 };
336 
337 struct A4
338     : public A1,
339       public virtual A2
340 {
341     char _[13489];
~A4t3::A4342     virtual ~A4() {}
343 
getA1t3::A4344     A1* getA1() {return A1::getA1();}
getA2t3::A4345     A2* getA2() {return A2::getA2();}
getA4t3::A4346     A4* getA4() {return this;}
347 };
348 
349 struct A5
350     : public A3,
351       public A4
352 {
353     char _[41389];
~A5t3::A5354     virtual ~A5() {}
355 
getA14t3::A5356     A1* getA14() {return A4::getA1();}
getA13t3::A5357     A1* getA13() {return A3::getA1();}
getA2t3::A5358     A2* getA2() {return A4::getA2();}
getA3t3::A5359     A3* getA3() {return A3::getA3();}
getA4t3::A5360     A4* getA4() {return A4::getA4();}
getA5t3::A5361     A5* getA5() {return this;}
362 };
363 
test()364 void test()
365 {
366     A1 a1;
367     A2 a2;
368     A3 a3;
369     A4 a4;
370     A5 a5;
371 
372     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
373     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
374     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
375     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
376     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
377     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
378     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
379     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
380     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
381     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
382     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
383     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
384     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
385 
386     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
387     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
388     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
389     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
390     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
391     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
392     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
393     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
394     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
395     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
396     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
397     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
398     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
399     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
400 
401     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
402     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
403     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
404     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
405     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
406     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
407     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
408     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
409     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
410     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
411     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
412     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
413     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
414     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
415 
416     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
417     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
418     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
419     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
420     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
421     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
422     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
423     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
424     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
425     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
426     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
427     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
428     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
429     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
430 
431     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
432     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
433     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
434     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
435     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
436     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
437     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
438     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
439     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
440     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
441     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
442     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
443     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
444     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
445 }
446 
447 }  // t3
448 
449 namespace t4
450 {
451 
452 struct A1
453 {
454     char _[43981];
~A1t4::A1455     virtual ~A1() {}
456 
getA1t4::A1457     A1* getA1() {return this;}
458 };
459 
460 struct A2
461 {
462     char _[34981];
~A2t4::A2463     virtual ~A2() {}
464 
getA2t4::A2465     A2* getA2() {return this;}
466 };
467 
468 struct A3
469     : protected A1,
470       public virtual A2
471 {
472     char _[93481];
~A3t4::A3473     virtual ~A3() {}
474 
getA1t4::A3475     A1* getA1() {return A1::getA1();}
getA2t4::A3476     A2* getA2() {return A2::getA2();}
getA3t4::A3477     A3* getA3() {return this;}
478 };
479 
480 struct A4
481     : public A1,
482       public virtual A2
483 {
484     char _[13489];
~A4t4::A4485     virtual ~A4() {}
486 
getA1t4::A4487     A1* getA1() {return A1::getA1();}
getA2t4::A4488     A2* getA2() {return A2::getA2();}
getA4t4::A4489     A4* getA4() {return this;}
490 };
491 
492 struct A5
493     : public A3,
494       public A4
495 {
496     char _[41389];
~A5t4::A5497     virtual ~A5() {}
498 
getA14t4::A5499     A1* getA14() {return A4::getA1();}
getA13t4::A5500     A1* getA13() {return A3::getA1();}
getA2t4::A5501     A2* getA2() {return A4::getA2();}
getA3t4::A5502     A3* getA3() {return A3::getA3();}
getA4t4::A5503     A4* getA4() {return A4::getA4();}
getA5t4::A5504     A5* getA5() {return this;}
505 };
506 
test()507 void test()
508 {
509     A1 a1;
510     A2 a2;
511     A3 a3;
512     A4 a4;
513     A5 a5;
514 
515     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
516     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
517     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
518     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
519 //    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());  // cast to protected base
520     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
521     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
522     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
523     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
524     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
525     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
526 //    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());  // cast to protected base
527     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
528 
529     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
530     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
531     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
532     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
533     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
534     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
535     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
536     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
537     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
538     assert(dynamic_cast<A2*>(a5.getA13()) == 0);
539     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
540     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
541     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
542     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
543 
544     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
545     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
546     assert(dynamic_cast<A3*>(a3.getA1()) == 0);
547     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
548     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
549     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
550     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
551     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
552     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
553     assert(dynamic_cast<A3*>(a5.getA13()) == 0);
554     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
555     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
556     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
557     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
558 
559     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
560     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
561     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
562     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
563     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
564     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
565     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
566     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
567     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
568     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
569     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
570     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
571     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
572     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
573 
574     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
575     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
576     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
577     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
578     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
579     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
580     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
581     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
582     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
583     assert(dynamic_cast<A5*>(a5.getA13()) == 0);
584     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
585     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
586     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
587     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
588 }
589 
590 }  // t4
591 
592 namespace t5
593 {
594 
595 struct A1
596 {
597     char _[43981];
~A1t5::A1598     virtual ~A1() {}
599 
getA1t5::A1600     A1* getA1() {return this;}
601 };
602 
603 struct A2
604 {
605     char _[34981];
~A2t5::A2606     virtual ~A2() {}
607 
getA2t5::A2608     A2* getA2() {return this;}
609 };
610 
611 struct A3
612     : public A1,
613       protected virtual A2
614 {
615     char _[93481];
~A3t5::A3616     virtual ~A3() {}
617 
getA1t5::A3618     A1* getA1() {return A1::getA1();}
getA2t5::A3619     A2* getA2() {return A2::getA2();}
getA3t5::A3620     A3* getA3() {return this;}
621 };
622 
623 struct A4
624     : public A1,
625       public virtual A2
626 {
627     char _[13489];
~A4t5::A4628     virtual ~A4() {}
629 
getA1t5::A4630     A1* getA1() {return A1::getA1();}
getA2t5::A4631     A2* getA2() {return A2::getA2();}
getA4t5::A4632     A4* getA4() {return this;}
633 };
634 
635 struct A5
636     : public A3,
637       public A4
638 {
639     char _[41389];
~A5t5::A5640     virtual ~A5() {}
641 
getA14t5::A5642     A1* getA14() {return A4::getA1();}
getA13t5::A5643     A1* getA13() {return A3::getA1();}
getA2t5::A5644     A2* getA2() {return A4::getA2();}
getA3t5::A5645     A3* getA3() {return A3::getA3();}
getA4t5::A5646     A4* getA4() {return A4::getA4();}
getA5t5::A5647     A5* getA5() {return this;}
648 };
649 
test()650 void test()
651 {
652     A1 a1;
653     A2 a2;
654     A3 a3;
655     A4 a4;
656     A5 a5;
657 
658     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
659     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
660     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
661     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
662     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
663     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
664     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
665     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
666     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
667     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
668     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
669     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
670     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
671 
672     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
673     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
674     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
675     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
676 //    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());  // cast to protected base
677     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
678     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
679     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
680     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
681     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
682     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
683 //    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());  // cast to protected base
684     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
685     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
686 
687     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
688     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
689     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
690     assert(dynamic_cast<A3*>(a3.getA2()) == 0);
691     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
692     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
693     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
694     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
695     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
696     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
697     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
698     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
699     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
700     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
701 
702     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
703     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
704     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
705     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
706     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
707     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
708     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
709     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
710     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
711     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
712     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
713     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
714     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
715     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
716 
717     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
718     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
719     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
720     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
721     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
722     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
723     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
724     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
725     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
726     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
727     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
728     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
729     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
730     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
731 }
732 
733 }  // t5
734 
735 namespace t6
736 {
737 
738 struct A1
739 {
740     char _[43981];
~A1t6::A1741     virtual ~A1() {}
742 
getA1t6::A1743     A1* getA1() {return this;}
744 };
745 
746 struct A2
747 {
748     char _[34981];
~A2t6::A2749     virtual ~A2() {}
750 
getA2t6::A2751     A2* getA2() {return this;}
752 };
753 
754 struct A3
755     : public A1,
756       public virtual A2
757 {
758     char _[93481];
~A3t6::A3759     virtual ~A3() {}
760 
getA1t6::A3761     A1* getA1() {return A1::getA1();}
getA2t6::A3762     A2* getA2() {return A2::getA2();}
getA3t6::A3763     A3* getA3() {return this;}
764 };
765 
766 struct A4
767     : protected A1,
768       public virtual A2
769 {
770     char _[13489];
~A4t6::A4771     virtual ~A4() {}
772 
getA1t6::A4773     A1* getA1() {return A1::getA1();}
getA2t6::A4774     A2* getA2() {return A2::getA2();}
getA4t6::A4775     A4* getA4() {return this;}
776 };
777 
778 struct A5
779     : public A3,
780       public A4
781 {
782     char _[41389];
~A5t6::A5783     virtual ~A5() {}
784 
getA14t6::A5785     A1* getA14() {return A4::getA1();}
getA13t6::A5786     A1* getA13() {return A3::getA1();}
getA2t6::A5787     A2* getA2() {return A4::getA2();}
getA3t6::A5788     A3* getA3() {return A3::getA3();}
getA4t6::A5789     A4* getA4() {return A4::getA4();}
getA5t6::A5790     A5* getA5() {return this;}
791 };
792 
test()793 void test()
794 {
795     A1 a1;
796     A2 a2;
797     A3 a3;
798     A4 a4;
799     A5 a5;
800 
801     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
802     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
803     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
804     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
805     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
806     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
807     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
808 //    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());  // cast to protected base
809     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
810     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
811     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
812     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
813 //    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());  // cast to protected base
814 
815     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
816     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
817     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
818     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
819     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
820     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
821     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
822     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
823     assert(dynamic_cast<A2*>(a5.getA14()) == 0);
824     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
825     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
826     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
827     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
828     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
829 
830     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
831     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
832     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
833     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
834     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
835     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
836     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
837     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
838     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
839     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
840     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
841     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
842     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
843     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
844 
845     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
846     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
847     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
848     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
849     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
850     assert(dynamic_cast<A4*>(a4.getA1()) == 0);
851     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
852     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
853     assert(dynamic_cast<A4*>(a5.getA14()) == 0);
854     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
855     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
856     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
857     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
858     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
859 
860     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
861     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
862     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
863     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
864     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
865     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
866     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
867     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
868     assert(dynamic_cast<A5*>(a5.getA14()) == 0);
869     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
870     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
871     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
872     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
873     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
874 }
875 
876 }  // t6
877 
878 namespace t7
879 {
880 
881 struct A1
882 {
883     char _[43981];
~A1t7::A1884     virtual ~A1() {}
885 
getA1t7::A1886     A1* getA1() {return this;}
887 };
888 
889 struct A2
890 {
891     char _[34981];
~A2t7::A2892     virtual ~A2() {}
893 
getA2t7::A2894     A2* getA2() {return this;}
895 };
896 
897 struct A3
898     : public A1,
899       public virtual A2
900 {
901     char _[93481];
~A3t7::A3902     virtual ~A3() {}
903 
getA1t7::A3904     A1* getA1() {return A1::getA1();}
getA2t7::A3905     A2* getA2() {return A2::getA2();}
getA3t7::A3906     A3* getA3() {return this;}
907 };
908 
909 struct A4
910     : public A1,
911       protected virtual A2
912 {
913     char _[13489];
~A4t7::A4914     virtual ~A4() {}
915 
getA1t7::A4916     A1* getA1() {return A1::getA1();}
getA2t7::A4917     A2* getA2() {return A2::getA2();}
getA4t7::A4918     A4* getA4() {return this;}
919 };
920 
921 struct A5
922     : public A3,
923       public A4
924 {
925     char _[41389];
~A5t7::A5926     virtual ~A5() {}
927 
getA14t7::A5928     A1* getA14() {return A4::getA1();}
getA13t7::A5929     A1* getA13() {return A3::getA1();}
getA2t7::A5930     A2* getA2() {return A4::getA2();}
getA3t7::A5931     A3* getA3() {return A3::getA3();}
getA4t7::A5932     A4* getA4() {return A4::getA4();}
getA5t7::A5933     A5* getA5() {return this;}
934 };
935 
test()936 void test()
937 {
938     A1 a1;
939     A2 a2;
940     A3 a3;
941     A4 a4;
942     A5 a5;
943 
944     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
945     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
946     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
947     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
948     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
949     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
950     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
951     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
952     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
953     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
954     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
955     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
956     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
957 
958     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
959     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
960     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
961     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
962     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
963     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
964     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
965 //    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());  // cast to protected base
966     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
967     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
968     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
969     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
970 //    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());  // cast to protected base
971     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
972 
973     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
974     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
975     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
976     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
977     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
978     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
979     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
980     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
981     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
982     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
983     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
984     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
985     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
986     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
987 
988     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
989     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
990     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
991     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
992     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
993     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
994     assert(dynamic_cast<A4*>(a4.getA2()) == 0);
995     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
996     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
997     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
998     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
999     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
1000     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1001     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
1002 
1003     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1004     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1005     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1006     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1007     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1008     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1009     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1010     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1011     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
1012     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
1013     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1014     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
1015     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
1016     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1017 }
1018 
1019 }  // t7
1020 
1021 namespace t8
1022 {
1023 
1024 struct A1
1025 {
1026     char _[43981];
~A1t8::A11027     virtual ~A1() {}
1028 
getA1t8::A11029     A1* getA1() {return this;}
1030 };
1031 
1032 struct A2
1033 {
1034     char _[34981];
~A2t8::A21035     virtual ~A2() {}
1036 
getA2t8::A21037     A2* getA2() {return this;}
1038 };
1039 
1040 struct A3
1041     : public A1,
1042       public virtual A2
1043 {
1044     char _[93481];
~A3t8::A31045     virtual ~A3() {}
1046 
getA1t8::A31047     A1* getA1() {return A1::getA1();}
getA2t8::A31048     A2* getA2() {return A2::getA2();}
getA3t8::A31049     A3* getA3() {return this;}
1050 };
1051 
1052 struct A4
1053     : public A1,
1054       public virtual A2
1055 {
1056     char _[13489];
~A4t8::A41057     virtual ~A4() {}
1058 
getA1t8::A41059     A1* getA1() {return A1::getA1();}
getA2t8::A41060     A2* getA2() {return A2::getA2();}
getA4t8::A41061     A4* getA4() {return this;}
1062 };
1063 
1064 struct A5
1065     : protected A3,
1066       public A4
1067 {
1068     char _[41389];
~A5t8::A51069     virtual ~A5() {}
1070 
getA14t8::A51071     A1* getA14() {return A4::getA1();}
getA13t8::A51072     A1* getA13() {return A3::getA1();}
getA2t8::A51073     A2* getA2() {return A4::getA2();}
getA3t8::A51074     A3* getA3() {return A3::getA3();}
getA4t8::A51075     A4* getA4() {return A4::getA4();}
getA5t8::A51076     A5* getA5() {return this;}
1077 };
1078 
test()1079 void test()
1080 {
1081     A1 a1;
1082     A2 a2;
1083     A3 a3;
1084     A4 a4;
1085     A5 a5;
1086 
1087     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1088     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
1089     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1090     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1091     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1092     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
1093     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
1094     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
1095     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
1096     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
1097     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
1098     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
1099     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
1100 
1101     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1102     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1103     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1104     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1105     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1106     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
1107     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
1108     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
1109     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
1110     assert(dynamic_cast<A2*>(a5.getA13()) == 0);
1111     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
1112     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
1113     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
1114     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
1115 
1116     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1117     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1118     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1119     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1120     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1121     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
1122     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
1123     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
1124     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
1125     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
1126     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
1127     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
1128     assert(dynamic_cast<A3*>(a5.getA4()) == 0);
1129 //    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());  // cast to protected base
1130 
1131     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
1132     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
1133     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
1134     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
1135     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
1136     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
1137     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
1138     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
1139     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
1140     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
1141     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1142     assert(dynamic_cast<A4*>(a5.getA3()) == 0);
1143     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1144     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
1145 
1146     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1147     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1148     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1149     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1150     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1151     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1152     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1153     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1154     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
1155     assert(dynamic_cast<A5*>(a5.getA13()) == 0);
1156     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1157     assert(dynamic_cast<A5*>(a5.getA3()) == 0);
1158     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
1159     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1160 }
1161 
1162 }  // t8
1163 
1164 namespace t9
1165 {
1166 
1167 struct A1
1168 {
1169     char _[43981];
~A1t9::A11170     virtual ~A1() {}
1171 
getA1t9::A11172     A1* getA1() {return this;}
1173 };
1174 
1175 struct A2
1176 {
1177     char _[34981];
~A2t9::A21178     virtual ~A2() {}
1179 
getA2t9::A21180     A2* getA2() {return this;}
1181 };
1182 
1183 struct A3
1184     : public A1,
1185       public virtual A2
1186 {
1187     char _[93481];
~A3t9::A31188     virtual ~A3() {}
1189 
getA1t9::A31190     A1* getA1() {return A1::getA1();}
getA2t9::A31191     A2* getA2() {return A2::getA2();}
getA3t9::A31192     A3* getA3() {return this;}
1193 };
1194 
1195 struct A4
1196     : public A1,
1197       public virtual A2
1198 {
1199     char _[13489];
~A4t9::A41200     virtual ~A4() {}
1201 
getA1t9::A41202     A1* getA1() {return A1::getA1();}
getA2t9::A41203     A2* getA2() {return A2::getA2();}
getA4t9::A41204     A4* getA4() {return this;}
1205 };
1206 
1207 struct A5
1208     : public A3,
1209       protected A4
1210 {
1211     char _[41389];
~A5t9::A51212     virtual ~A5() {}
1213 
getA14t9::A51214     A1* getA14() {return A4::getA1();}
getA13t9::A51215     A1* getA13() {return A3::getA1();}
getA2t9::A51216     A2* getA2() {return A4::getA2();}
getA3t9::A51217     A3* getA3() {return A3::getA3();}
getA4t9::A51218     A4* getA4() {return A4::getA4();}
getA5t9::A51219     A5* getA5() {return this;}
1220 };
1221 
test()1222 void test()
1223 {
1224     A1 a1;
1225     A2 a2;
1226     A3 a3;
1227     A4 a4;
1228     A5 a5;
1229 
1230     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1231     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
1232     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1233     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1234     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1235     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
1236     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
1237     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
1238     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
1239     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
1240     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
1241     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
1242     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
1243 
1244     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1245     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1246     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1247     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1248     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1249     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
1250     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
1251     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
1252     assert(dynamic_cast<A2*>(a5.getA14()) == 0);
1253     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
1254     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
1255     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
1256     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
1257     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
1258 
1259     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1260     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1261     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1262     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1263     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1264     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
1265     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
1266     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
1267     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
1268     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
1269     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
1270     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
1271     assert(dynamic_cast<A3*>(a5.getA4()) == 0);
1272     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
1273 
1274     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
1275     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
1276     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
1277     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
1278     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
1279     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
1280     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
1281     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
1282     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
1283     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
1284     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1285     assert(dynamic_cast<A4*>(a5.getA3()) == 0);
1286     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1287 //    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());  // cast to protected base
1288 
1289     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1290     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1291     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1292     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1293     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1294     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1295     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1296     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1297     assert(dynamic_cast<A5*>(a5.getA14()) == 0);
1298     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
1299     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1300     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
1301     assert(dynamic_cast<A5*>(a5.getA4()) == 0);
1302     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1303 }
1304 
1305 }  // t9
1306 
1307 
main()1308 int main()
1309 {
1310     timer t;
1311     t1::test();
1312     t2::test();
1313     t3::test();
1314     t4::test();
1315     t5::test();
1316     t6::test();
1317     t7::test();
1318     t8::test();
1319     t9::test();
1320 }
1321