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