• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===------------------------- dynamic_cast5.cpp --------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include <cassert>
11 #include "support/timer.hpp"
12 
13 namespace t1
14 {
15 
16 struct A1
17 {
18     char _[43981];
~A1t1::A119     virtual ~A1() {}
20 
getA1t1::A121     A1* getA1() {return this;}
22 };
23 
24 struct A2
25 {
26     char _[34981];
~A2t1::A227     virtual ~A2() {}
28 
getA2t1::A229     A2* getA2() {return this;}
30 };
31 
32 struct A3
33     : public virtual A1,
34       private A2
35 {
36     char _[93481];
~A3t1::A337     virtual ~A3() {}
38 
getA1t1::A339     A1* getA1() {return A1::getA1();}
getA2t1::A340     A2* getA2() {return A2::getA2();}
getA3t1::A341     A3* getA3() {return this;}
42 };
43 
44 struct A4
45     : public A3,
46       public A2
47 {
48     char _[13489];
~A4t1::A449     virtual ~A4() {}
50 
getA1t1::A451     t1::A1* getA1() {return A3::getA1();}
getA2t1::A452     A2* getA2() {return A3::getA2();}
getA3t1::A453     A3* getA3() {return A3::getA3();}
getA4t1::A454     A4* getA4() {return this;}
55 };
56 
57 struct A5
58     : public A4,
59       public A3
60 {
61     char _[13489];
~A5t1::A562     virtual ~A5() {}
63 
getA1t1::A564     t1::A1* getA1() {return A4::getA1();}
getA2t1::A565     A2* getA2() {return A4::getA2();}
getA3t1::A566     A3* getA3() {return A4::getA3();}
getA4t1::A567     A4* getA4() {return A4::getA4();}
getA5t1::A568     A5* getA5() {return this;}
69 };
70 
test()71 void test()
72 {
73     A1 a1;
74     A2 a2;
75     A3 a3;
76     A4 a4;
77     A5 a5;
78 
79     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
80     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
81     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
82     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
83     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
84     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
85     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
86     assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
87     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
88     assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
89     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
90     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
91     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
92     assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
93 
94     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
95     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
96     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
97     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
98 //    assert(dynamic_cast<A2*>(a3.getA3()) == 0);  // cast to private base
99     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
100     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
101 //    assert(dynamic_cast<A2*>(a4.getA3()) == 0);  // cast to private base
102 //    assert(dynamic_cast<A2*>(a4.getA4()) == 0);  // cast to ambiguous base
103     assert(dynamic_cast<A2*>(a5.getA1()) == 0);
104     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
105 //    assert(dynamic_cast<A2*>(a5.getA3()) == 0);  // cast to private base
106 //    assert(dynamic_cast<A2*>(a5.getA4()) == 0);  // cast to ambiguous base
107 //    assert(dynamic_cast<A2*>(a5.getA5()) == 0);  // cast to ambiguous base
108 
109     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
110     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
111     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
112     assert(dynamic_cast<A3*>(a3.getA2()) == 0);
113     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
114     assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
115     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
116     assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
117     assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
118     assert(dynamic_cast<A3*>(a5.getA1()) == 0);
119     assert(dynamic_cast<A3*>(a5.getA2()) == 0);
120     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
121     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
122 //    assert(dynamic_cast<A3*>(a5.getA5()) == 0);  // cast to ambiguous base
123 
124     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
125     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
126     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
127     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
128     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
129     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
130     assert(dynamic_cast<A4*>(a4.getA2()) == 0);
131     assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
132     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
133     assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
134     assert(dynamic_cast<A4*>(a5.getA2()) == 0);
135     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
136     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
137     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
138 
139     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
140     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
141     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
142     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
143     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
144     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
145     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
146     assert(dynamic_cast<A5*>(a4.getA3()) == 0);
147     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
148     assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
149     assert(dynamic_cast<A5*>(a5.getA2()) == 0);
150     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
151     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
152     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
153 }
154 
155 }  // t1
156 
157 namespace t2
158 {
159 
160 struct A1
161 {
162     char _[43981];
~A1t2::A1163     virtual ~A1() {}
164 
getA1t2::A1165     A1* getA1() {return this;}
166 };
167 
168 struct A2
169 {
170     char _[34981];
~A2t2::A2171     virtual ~A2() {}
172 
getA2t2::A2173     A2* getA2() {return this;}
174 };
175 
176 struct A3
177     : public virtual A1,
178       public A2
179 {
180     char _[93481];
~A3t2::A3181     virtual ~A3() {}
182 
getA1t2::A3183     A1* getA1() {return A1::getA1();}
getA2t2::A3184     A2* getA2() {return A2::getA2();}
getA3t2::A3185     A3* getA3() {return this;}
186 };
187 
188 struct A4
189     : public A3,
190       public A2
191 {
192     char _[13489];
~A4t2::A4193     virtual ~A4() {}
194 
getA1t2::A4195     t2::A1* getA1() {return A3::getA1();}
getA2t2::A4196     A2* getA2() {return A3::getA2();}
getA3t2::A4197     A3* getA3() {return A3::getA3();}
getA4t2::A4198     A4* getA4() {return this;}
199 };
200 
201 struct A5
202     : public A4,
203       public A3
204 {
205     char _[13489];
~A5t2::A5206     virtual ~A5() {}
207 
getA1t2::A5208     t2::A1* getA1() {return A4::getA1();}
getA2t2::A5209     A2* getA2() {return A4::getA2();}
getA3t2::A5210     A3* getA3() {return A4::getA3();}
getA4t2::A5211     A4* getA4() {return A4::getA4();}
getA5t2::A5212     A5* getA5() {return this;}
213 };
214 
test()215 void test()
216 {
217     A1 a1;
218     A2 a2;
219     A3 a3;
220     A4 a4;
221     A5 a5;
222 
223     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
224     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
225     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
226     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
227     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
228     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
229     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
230     assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
231     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
232     assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
233     assert(dynamic_cast<A1*>(a5.getA2()) == a5.getA1());
234     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
235     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
236     assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
237 
238     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
239     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
240     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
241     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
242     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
243     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
244     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
245     assert(dynamic_cast<A2*>(a4.getA3()) == a4.getA2());
246 //    assert(dynamic_cast<A2*>(a4.getA4()) == 0);  // cast to ambiguous base
247     assert(dynamic_cast<A2*>(a5.getA1()) == 0);
248     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
249     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
250 //    assert(dynamic_cast<A2*>(a5.getA4()) == 0);  // cast to ambiguous base
251 //    assert(dynamic_cast<A2*>(a5.getA5()) == 0);  // cast to ambiguous base
252 
253     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
254     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
255     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
256     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
257     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
258     assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
259     assert(dynamic_cast<A3*>(a4.getA2()) == a4.getA3());
260     assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
261     assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
262     assert(dynamic_cast<A3*>(a5.getA1()) == 0);
263     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
264     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
265     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
266 //    assert(dynamic_cast<A3*>(a5.getA5()) == 0);  // cast to ambiguous base
267 
268     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
269     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
270     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
271     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
272     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
273     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
274     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
275     assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
276     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
277     assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
278     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
279     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
280     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
281     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
282 
283     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
284     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
285     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
286     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
287     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
288     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
289     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
290     assert(dynamic_cast<A5*>(a4.getA3()) == 0);
291     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
292     assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
293     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
294     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
295     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
296     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
297 }
298 
299 }  // t2
300 
301 namespace t3
302 {
303 
304 struct A1
305 {
306     char _[43981];
~A1t3::A1307     virtual ~A1() {}
308 
getA1t3::A1309     A1* getA1() {return this;}
310 };
311 
312 struct A2
313 {
314     char _[34981];
~A2t3::A2315     virtual ~A2() {}
316 
getA2t3::A2317     A2* getA2() {return this;}
318 };
319 
320 struct A3
321     : public A1,
322       public virtual A2
323 {
324     char _[93481];
~A3t3::A3325     virtual ~A3() {}
326 
getA1t3::A3327     A1* getA1() {return A1::getA1();}
getA2t3::A3328     A2* getA2() {return A2::getA2();}
getA3t3::A3329     A3* getA3() {return this;}
330 };
331 
332 struct A4
333     : public A1,
334       public virtual A2
335 {
336     char _[13489];
~A4t3::A4337     virtual ~A4() {}
338 
getA1t3::A4339     A1* getA1() {return A1::getA1();}
getA2t3::A4340     A2* getA2() {return A2::getA2();}
getA4t3::A4341     A4* getA4() {return this;}
342 };
343 
344 struct A5
345     : public A3,
346       public A4
347 {
348     char _[41389];
~A5t3::A5349     virtual ~A5() {}
350 
getA14t3::A5351     A1* getA14() {return A4::getA1();}
getA13t3::A5352     A1* getA13() {return A3::getA1();}
getA2t3::A5353     A2* getA2() {return A4::getA2();}
getA3t3::A5354     A3* getA3() {return A3::getA3();}
getA4t3::A5355     A4* getA4() {return A4::getA4();}
getA5t3::A5356     A5* getA5() {return this;}
357 };
358 
test()359 void test()
360 {
361     A1 a1;
362     A2 a2;
363     A3 a3;
364     A4 a4;
365     A5 a5;
366 
367     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
368     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
369     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
370     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
371     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
372     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
373     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
374     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
375     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
376     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
377     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
378     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
379     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
380 
381     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
382     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
383     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
384     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
385     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
386     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
387     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
388     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
389     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
390     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
391     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
392     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
393     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
394     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
395 
396     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
397     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
398     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
399     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
400     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
401     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
402     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
403     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
404     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
405     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
406     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
407     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
408     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
409     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
410 
411     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
412     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
413     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
414     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
415     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
416     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
417     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
418     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
419     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
420     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
421     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
422     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
423     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
424     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
425 
426     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
427     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
428     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
429     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
430     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
431     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
432     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
433     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
434     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
435     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
436     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
437     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
438     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
439     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
440 }
441 
442 }  // t3
443 
444 namespace t4
445 {
446 
447 struct A1
448 {
449     char _[43981];
~A1t4::A1450     virtual ~A1() {}
451 
getA1t4::A1452     A1* getA1() {return this;}
453 };
454 
455 struct A2
456 {
457     char _[34981];
~A2t4::A2458     virtual ~A2() {}
459 
getA2t4::A2460     A2* getA2() {return this;}
461 };
462 
463 struct A3
464     : protected A1,
465       public virtual A2
466 {
467     char _[93481];
~A3t4::A3468     virtual ~A3() {}
469 
getA1t4::A3470     A1* getA1() {return A1::getA1();}
getA2t4::A3471     A2* getA2() {return A2::getA2();}
getA3t4::A3472     A3* getA3() {return this;}
473 };
474 
475 struct A4
476     : public A1,
477       public virtual A2
478 {
479     char _[13489];
~A4t4::A4480     virtual ~A4() {}
481 
getA1t4::A4482     A1* getA1() {return A1::getA1();}
getA2t4::A4483     A2* getA2() {return A2::getA2();}
getA4t4::A4484     A4* getA4() {return this;}
485 };
486 
487 struct A5
488     : public A3,
489       public A4
490 {
491     char _[41389];
~A5t4::A5492     virtual ~A5() {}
493 
getA14t4::A5494     A1* getA14() {return A4::getA1();}
getA13t4::A5495     A1* getA13() {return A3::getA1();}
getA2t4::A5496     A2* getA2() {return A4::getA2();}
getA3t4::A5497     A3* getA3() {return A3::getA3();}
getA4t4::A5498     A4* getA4() {return A4::getA4();}
getA5t4::A5499     A5* getA5() {return this;}
500 };
501 
test()502 void test()
503 {
504     A1 a1;
505     A2 a2;
506     A3 a3;
507     A4 a4;
508     A5 a5;
509 
510     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
511     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
512     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
513     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
514 //    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());  // cast to protected base
515     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
516     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
517     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
518     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
519     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
520     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
521 //    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());  // cast to protected base
522     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
523 
524     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
525     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
526     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
527     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
528     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
529     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
530     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
531     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
532     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
533     assert(dynamic_cast<A2*>(a5.getA13()) == 0);
534     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
535     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
536     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
537     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
538 
539     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
540     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
541     assert(dynamic_cast<A3*>(a3.getA1()) == 0);
542     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
543     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
544     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
545     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
546     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
547     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
548     assert(dynamic_cast<A3*>(a5.getA13()) == 0);
549     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
550     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
551     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
552     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
553 
554     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
555     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
556     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
557     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
558     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
559     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
560     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
561     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
562     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
563     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
564     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
565     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
566     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
567     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
568 
569     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
570     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
571     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
572     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
573     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
574     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
575     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
576     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
577     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
578     assert(dynamic_cast<A5*>(a5.getA13()) == 0);
579     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
580     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
581     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
582     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
583 }
584 
585 }  // t4
586 
587 namespace t5
588 {
589 
590 struct A1
591 {
592     char _[43981];
~A1t5::A1593     virtual ~A1() {}
594 
getA1t5::A1595     A1* getA1() {return this;}
596 };
597 
598 struct A2
599 {
600     char _[34981];
~A2t5::A2601     virtual ~A2() {}
602 
getA2t5::A2603     A2* getA2() {return this;}
604 };
605 
606 struct A3
607     : public A1,
608       protected virtual A2
609 {
610     char _[93481];
~A3t5::A3611     virtual ~A3() {}
612 
getA1t5::A3613     A1* getA1() {return A1::getA1();}
getA2t5::A3614     A2* getA2() {return A2::getA2();}
getA3t5::A3615     A3* getA3() {return this;}
616 };
617 
618 struct A4
619     : public A1,
620       public virtual A2
621 {
622     char _[13489];
~A4t5::A4623     virtual ~A4() {}
624 
getA1t5::A4625     A1* getA1() {return A1::getA1();}
getA2t5::A4626     A2* getA2() {return A2::getA2();}
getA4t5::A4627     A4* getA4() {return this;}
628 };
629 
630 struct A5
631     : public A3,
632       public A4
633 {
634     char _[41389];
~A5t5::A5635     virtual ~A5() {}
636 
getA14t5::A5637     A1* getA14() {return A4::getA1();}
getA13t5::A5638     A1* getA13() {return A3::getA1();}
getA2t5::A5639     A2* getA2() {return A4::getA2();}
getA3t5::A5640     A3* getA3() {return A3::getA3();}
getA4t5::A5641     A4* getA4() {return A4::getA4();}
getA5t5::A5642     A5* getA5() {return this;}
643 };
644 
test()645 void test()
646 {
647     A1 a1;
648     A2 a2;
649     A3 a3;
650     A4 a4;
651     A5 a5;
652 
653     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
654     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
655     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
656     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
657     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
658     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
659     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
660     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
661     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
662     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
663     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
664     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
665     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
666 
667     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
668     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
669     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
670     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
671 //    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());  // cast to protected base
672     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
673     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
674     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
675     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
676     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
677     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
678 //    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());  // cast to protected base
679     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
680     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
681 
682     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
683     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
684     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
685     assert(dynamic_cast<A3*>(a3.getA2()) == 0);
686     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
687     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
688     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
689     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
690     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
691     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
692     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
693     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
694     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
695     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
696 
697     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
698     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
699     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
700     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
701     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
702     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
703     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
704     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
705     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
706     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
707     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
708     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
709     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
710     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
711 
712     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
713     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
714     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
715     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
716     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
717     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
718     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
719     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
720     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
721     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
722     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
723     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
724     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
725     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
726 }
727 
728 }  // t5
729 
730 namespace t6
731 {
732 
733 struct A1
734 {
735     char _[43981];
~A1t6::A1736     virtual ~A1() {}
737 
getA1t6::A1738     A1* getA1() {return this;}
739 };
740 
741 struct A2
742 {
743     char _[34981];
~A2t6::A2744     virtual ~A2() {}
745 
getA2t6::A2746     A2* getA2() {return this;}
747 };
748 
749 struct A3
750     : public A1,
751       public virtual A2
752 {
753     char _[93481];
~A3t6::A3754     virtual ~A3() {}
755 
getA1t6::A3756     A1* getA1() {return A1::getA1();}
getA2t6::A3757     A2* getA2() {return A2::getA2();}
getA3t6::A3758     A3* getA3() {return this;}
759 };
760 
761 struct A4
762     : protected A1,
763       public virtual A2
764 {
765     char _[13489];
~A4t6::A4766     virtual ~A4() {}
767 
getA1t6::A4768     A1* getA1() {return A1::getA1();}
getA2t6::A4769     A2* getA2() {return A2::getA2();}
getA4t6::A4770     A4* getA4() {return this;}
771 };
772 
773 struct A5
774     : public A3,
775       public A4
776 {
777     char _[41389];
~A5t6::A5778     virtual ~A5() {}
779 
getA14t6::A5780     A1* getA14() {return A4::getA1();}
getA13t6::A5781     A1* getA13() {return A3::getA1();}
getA2t6::A5782     A2* getA2() {return A4::getA2();}
getA3t6::A5783     A3* getA3() {return A3::getA3();}
getA4t6::A5784     A4* getA4() {return A4::getA4();}
getA5t6::A5785     A5* getA5() {return this;}
786 };
787 
test()788 void test()
789 {
790     A1 a1;
791     A2 a2;
792     A3 a3;
793     A4 a4;
794     A5 a5;
795 
796     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
797     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
798     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
799     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
800     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
801     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
802     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
803 //    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());  // cast to protected base
804     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
805     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
806     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
807     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
808 //    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());  // cast to protected base
809 
810     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
811     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
812     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
813     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
814     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
815     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
816     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
817     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
818     assert(dynamic_cast<A2*>(a5.getA14()) == 0);
819     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
820     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
821     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
822     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
823     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
824 
825     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
826     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
827     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
828     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
829     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
830     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
831     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
832     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
833     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
834     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
835     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
836     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
837     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
838     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
839 
840     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
841     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
842     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
843     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
844     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
845     assert(dynamic_cast<A4*>(a4.getA1()) == 0);
846     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
847     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
848     assert(dynamic_cast<A4*>(a5.getA14()) == 0);
849     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
850     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
851     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
852     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
853     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
854 
855     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
856     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
857     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
858     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
859     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
860     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
861     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
862     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
863     assert(dynamic_cast<A5*>(a5.getA14()) == 0);
864     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
865     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
866     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
867     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
868     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
869 }
870 
871 }  // t6
872 
873 namespace t7
874 {
875 
876 struct A1
877 {
878     char _[43981];
~A1t7::A1879     virtual ~A1() {}
880 
getA1t7::A1881     A1* getA1() {return this;}
882 };
883 
884 struct A2
885 {
886     char _[34981];
~A2t7::A2887     virtual ~A2() {}
888 
getA2t7::A2889     A2* getA2() {return this;}
890 };
891 
892 struct A3
893     : public A1,
894       public virtual A2
895 {
896     char _[93481];
~A3t7::A3897     virtual ~A3() {}
898 
getA1t7::A3899     A1* getA1() {return A1::getA1();}
getA2t7::A3900     A2* getA2() {return A2::getA2();}
getA3t7::A3901     A3* getA3() {return this;}
902 };
903 
904 struct A4
905     : public A1,
906       protected virtual A2
907 {
908     char _[13489];
~A4t7::A4909     virtual ~A4() {}
910 
getA1t7::A4911     A1* getA1() {return A1::getA1();}
getA2t7::A4912     A2* getA2() {return A2::getA2();}
getA4t7::A4913     A4* getA4() {return this;}
914 };
915 
916 struct A5
917     : public A3,
918       public A4
919 {
920     char _[41389];
~A5t7::A5921     virtual ~A5() {}
922 
getA14t7::A5923     A1* getA14() {return A4::getA1();}
getA13t7::A5924     A1* getA13() {return A3::getA1();}
getA2t7::A5925     A2* getA2() {return A4::getA2();}
getA3t7::A5926     A3* getA3() {return A3::getA3();}
getA4t7::A5927     A4* getA4() {return A4::getA4();}
getA5t7::A5928     A5* getA5() {return this;}
929 };
930 
test()931 void test()
932 {
933     A1 a1;
934     A2 a2;
935     A3 a3;
936     A4 a4;
937     A5 a5;
938 
939     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
940     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
941     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
942     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
943     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
944     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
945     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
946     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
947     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
948     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
949     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
950     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
951     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
952 
953     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
954     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
955     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
956     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
957     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
958     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
959     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
960 //    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());  // cast to protected base
961     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
962     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
963     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
964     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
965 //    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());  // cast to protected base
966     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
967 
968     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
969     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
970     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
971     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
972     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
973     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
974     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
975     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
976     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
977     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
978     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
979     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
980     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
981     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
982 
983     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
984     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
985     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
986     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
987     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
988     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
989     assert(dynamic_cast<A4*>(a4.getA2()) == 0);
990     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
991     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
992     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
993     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
994     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
995     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
996     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
997 
998     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
999     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1000     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1001     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1002     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1003     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1004     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1005     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1006     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
1007     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
1008     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1009     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
1010     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
1011     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1012 }
1013 
1014 }  // t7
1015 
1016 namespace t8
1017 {
1018 
1019 struct A1
1020 {
1021     char _[43981];
~A1t8::A11022     virtual ~A1() {}
1023 
getA1t8::A11024     A1* getA1() {return this;}
1025 };
1026 
1027 struct A2
1028 {
1029     char _[34981];
~A2t8::A21030     virtual ~A2() {}
1031 
getA2t8::A21032     A2* getA2() {return this;}
1033 };
1034 
1035 struct A3
1036     : public A1,
1037       public virtual A2
1038 {
1039     char _[93481];
~A3t8::A31040     virtual ~A3() {}
1041 
getA1t8::A31042     A1* getA1() {return A1::getA1();}
getA2t8::A31043     A2* getA2() {return A2::getA2();}
getA3t8::A31044     A3* getA3() {return this;}
1045 };
1046 
1047 struct A4
1048     : public A1,
1049       public virtual A2
1050 {
1051     char _[13489];
~A4t8::A41052     virtual ~A4() {}
1053 
getA1t8::A41054     A1* getA1() {return A1::getA1();}
getA2t8::A41055     A2* getA2() {return A2::getA2();}
getA4t8::A41056     A4* getA4() {return this;}
1057 };
1058 
1059 struct A5
1060     : protected A3,
1061       public A4
1062 {
1063     char _[41389];
~A5t8::A51064     virtual ~A5() {}
1065 
getA14t8::A51066     A1* getA14() {return A4::getA1();}
getA13t8::A51067     A1* getA13() {return A3::getA1();}
getA2t8::A51068     A2* getA2() {return A4::getA2();}
getA3t8::A51069     A3* getA3() {return A3::getA3();}
getA4t8::A51070     A4* getA4() {return A4::getA4();}
getA5t8::A51071     A5* getA5() {return this;}
1072 };
1073 
test()1074 void test()
1075 {
1076     A1 a1;
1077     A2 a2;
1078     A3 a3;
1079     A4 a4;
1080     A5 a5;
1081 
1082     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1083     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
1084     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1085     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1086     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1087     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
1088     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
1089     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
1090     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
1091     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
1092     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
1093     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
1094     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
1095 
1096     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1097     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1098     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1099     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1100     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1101     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
1102     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
1103     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
1104     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
1105     assert(dynamic_cast<A2*>(a5.getA13()) == 0);
1106     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
1107     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
1108     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
1109     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
1110 
1111     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1112     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1113     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1114     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1115     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1116     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
1117     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
1118     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
1119     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
1120     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
1121     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
1122     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
1123     assert(dynamic_cast<A3*>(a5.getA4()) == 0);
1124 //    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());  // cast to protected base
1125 
1126     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
1127     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
1128     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
1129     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
1130     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
1131     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
1132     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
1133     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
1134     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
1135     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
1136     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1137     assert(dynamic_cast<A4*>(a5.getA3()) == 0);
1138     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1139     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
1140 
1141     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1142     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1143     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1144     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1145     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1146     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1147     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1148     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1149     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
1150     assert(dynamic_cast<A5*>(a5.getA13()) == 0);
1151     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1152     assert(dynamic_cast<A5*>(a5.getA3()) == 0);
1153     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
1154     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1155 }
1156 
1157 }  // t8
1158 
1159 namespace t9
1160 {
1161 
1162 struct A1
1163 {
1164     char _[43981];
~A1t9::A11165     virtual ~A1() {}
1166 
getA1t9::A11167     A1* getA1() {return this;}
1168 };
1169 
1170 struct A2
1171 {
1172     char _[34981];
~A2t9::A21173     virtual ~A2() {}
1174 
getA2t9::A21175     A2* getA2() {return this;}
1176 };
1177 
1178 struct A3
1179     : public A1,
1180       public virtual A2
1181 {
1182     char _[93481];
~A3t9::A31183     virtual ~A3() {}
1184 
getA1t9::A31185     A1* getA1() {return A1::getA1();}
getA2t9::A31186     A2* getA2() {return A2::getA2();}
getA3t9::A31187     A3* getA3() {return this;}
1188 };
1189 
1190 struct A4
1191     : public A1,
1192       public virtual A2
1193 {
1194     char _[13489];
~A4t9::A41195     virtual ~A4() {}
1196 
getA1t9::A41197     A1* getA1() {return A1::getA1();}
getA2t9::A41198     A2* getA2() {return A2::getA2();}
getA4t9::A41199     A4* getA4() {return this;}
1200 };
1201 
1202 struct A5
1203     : public A3,
1204       protected A4
1205 {
1206     char _[41389];
~A5t9::A51207     virtual ~A5() {}
1208 
getA14t9::A51209     A1* getA14() {return A4::getA1();}
getA13t9::A51210     A1* getA13() {return A3::getA1();}
getA2t9::A51211     A2* getA2() {return A4::getA2();}
getA3t9::A51212     A3* getA3() {return A3::getA3();}
getA4t9::A51213     A4* getA4() {return A4::getA4();}
getA5t9::A51214     A5* getA5() {return this;}
1215 };
1216 
test()1217 void test()
1218 {
1219     A1 a1;
1220     A2 a2;
1221     A3 a3;
1222     A4 a4;
1223     A5 a5;
1224 
1225     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1226     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
1227     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1228     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1229     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1230     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
1231     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
1232     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
1233     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
1234     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
1235     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
1236     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
1237     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
1238 
1239     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1240     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1241     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1242     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1243     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1244     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
1245     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
1246     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
1247     assert(dynamic_cast<A2*>(a5.getA14()) == 0);
1248     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
1249     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
1250     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
1251     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
1252     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
1253 
1254     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1255     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1256     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1257     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1258     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1259     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
1260     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
1261     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
1262     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
1263     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
1264     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
1265     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
1266     assert(dynamic_cast<A3*>(a5.getA4()) == 0);
1267     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
1268 
1269     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
1270     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
1271     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
1272     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
1273     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
1274     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
1275     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
1276     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
1277     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
1278     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
1279     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1280     assert(dynamic_cast<A4*>(a5.getA3()) == 0);
1281     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1282 //    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());  // cast to protected base
1283 
1284     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1285     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1286     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1287     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1288     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1289     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1290     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1291     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1292     assert(dynamic_cast<A5*>(a5.getA14()) == 0);
1293     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
1294     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1295     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
1296     assert(dynamic_cast<A5*>(a5.getA4()) == 0);
1297     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1298 }
1299 
1300 }  // t9
1301 
1302 
main()1303 int main()
1304 {
1305     timer t;
1306     t1::test();
1307     t2::test();
1308     t3::test();
1309     t4::test();
1310     t5::test();
1311     t6::test();
1312     t7::test();
1313     t8::test();
1314     t9::test();
1315 }
1316