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