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