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