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