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