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 | /* |
21 | |
22 | A1 A2 A3 |
23 | |
24 | */ |
25 | |
26 | namespace t1 |
27 | { |
28 | |
29 | struct A1 |
30 | { |
31 | char _[43981]; |
32 | virtual ~A1() {} |
33 | |
34 | A1* getA1() {return this;} |
35 | }; |
36 | |
37 | struct A2 |
38 | { |
39 | char _[34981]; |
40 | virtual ~A2() {} |
41 | |
42 | A2* getA2() {return this;} |
43 | }; |
44 | |
45 | struct A3 |
46 | { |
47 | char _[93481]; |
48 | virtual ~A3() {} |
49 | |
50 | A3* getA3() {return this;} |
51 | }; |
52 | |
53 | void test() |
54 | { |
55 | A1 a1; |
56 | A2 a2; |
57 | A3 a3; |
58 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
59 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
60 | assert(dynamic_cast<A1*>(a3.getA3()) == 0); |
61 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
62 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
63 | assert(dynamic_cast<A2*>(a3.getA3()) == 0); |
64 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
65 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
66 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
67 | } |
68 | |
69 | } // t1 |
70 | |
71 | /* |
72 | |
73 | A1 A2 |
74 | | |
75 | A3 |
76 | |
77 | */ |
78 | |
79 | namespace t2 |
80 | { |
81 | |
82 | struct A1 |
83 | { |
84 | char _[43981]; |
85 | virtual ~A1() {} |
86 | |
87 | A1* getA1() {return this;} |
88 | }; |
89 | |
90 | struct A2 |
91 | { |
92 | char _[34981]; |
93 | virtual ~A2() {} |
94 | |
95 | A2* getA2() {return this;} |
96 | }; |
97 | |
98 | struct A3 |
99 | : public A1 |
100 | { |
101 | char _[93481]; |
102 | virtual ~A3() {} |
103 | |
104 | A3* getA3() {return this;} |
105 | }; |
106 | |
107 | void test() |
108 | { |
109 | A1 a1; |
110 | A2 a2; |
111 | A3 a3; |
112 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
113 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
114 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
115 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
116 | |
117 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
118 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
119 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
120 | assert(dynamic_cast<A2*>(a3.getA3()) == 0); |
121 | |
122 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
123 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
124 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
125 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
126 | } |
127 | |
128 | } // t2 |
129 | |
130 | namespace t3 |
131 | { |
132 | |
133 | struct A1 |
134 | { |
135 | char _[43981]; |
136 | virtual ~A1() {} |
137 | |
138 | A1* getA1() {return this;} |
139 | }; |
140 | |
141 | struct A2 |
142 | { |
143 | char _[34981]; |
144 | virtual ~A2() {} |
145 | |
146 | A2* getA2() {return this;} |
147 | }; |
148 | |
149 | struct A3 |
150 | : public virtual A1 |
151 | { |
152 | char _[93481]; |
153 | virtual ~A3() {} |
154 | |
155 | A3* getA3() {return this;} |
156 | }; |
157 | |
158 | void test() |
159 | { |
160 | A1 a1; |
161 | A2 a2; |
162 | A3 a3; |
163 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
164 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
165 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
166 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
167 | |
168 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
169 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
170 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
171 | assert(dynamic_cast<A2*>(a3.getA3()) == 0); |
172 | |
173 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
174 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
175 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
176 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
177 | } |
178 | |
179 | } // t3 |
180 | |
181 | namespace t4 |
182 | { |
183 | |
184 | struct A1 |
185 | { |
186 | char _[43981]; |
187 | virtual ~A1() {} |
188 | |
189 | A1* getA1() {return this;} |
190 | }; |
191 | |
192 | struct A2 |
193 | { |
194 | char _[34981]; |
195 | virtual ~A2() {} |
196 | |
197 | A2* getA2() {return this;} |
198 | }; |
199 | |
200 | struct A3 |
201 | : private A1 |
202 | { |
203 | char _[93481]; |
204 | virtual ~A3() {} |
205 | |
206 | A1* getA1() {return this;} |
207 | A3* getA3() {return this;} |
208 | }; |
209 | |
210 | void test() |
211 | { |
212 | A1 a1; |
213 | A2 a2; |
214 | A3 a3; |
215 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
216 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
217 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
218 | |
219 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
220 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
221 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
222 | assert(dynamic_cast<A2*>(a3.getA3()) == 0); |
223 | |
224 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
225 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
226 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
227 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
228 | } |
229 | |
230 | } // t4 |
231 | |
232 | namespace t5 |
233 | { |
234 | |
235 | struct A1 |
236 | { |
237 | char _[43981]; |
238 | virtual ~A1() {} |
239 | |
240 | A1* getA1() {return this;} |
241 | }; |
242 | |
243 | struct A2 |
244 | { |
245 | char _[34981]; |
246 | virtual ~A2() {} |
247 | |
248 | A2* getA2() {return this;} |
249 | }; |
250 | |
251 | struct A3 |
252 | : private virtual A1 |
253 | { |
254 | char _[93481]; |
255 | virtual ~A3() {} |
256 | |
257 | A1* getA1() {return this;} |
258 | A3* getA3() {return this;} |
259 | }; |
260 | |
261 | void test() |
262 | { |
263 | A1 a1; |
264 | A2 a2; |
265 | A3 a3; |
266 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
267 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
268 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
269 | |
270 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
271 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
272 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
273 | assert(dynamic_cast<A2*>(a3.getA3()) == 0); |
274 | |
275 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
276 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
277 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
278 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
279 | } |
280 | |
281 | } // t5 |
282 | |
283 | /* |
284 | |
285 | A1 A2 |
286 | \ / |
287 | A3 |
288 | |
289 | */ |
290 | |
291 | namespace t6 |
292 | { |
293 | |
294 | struct A1 |
295 | { |
296 | char _[43981]; |
297 | virtual ~A1() {} |
298 | |
299 | A1* getA1() {return this;} |
300 | }; |
301 | |
302 | struct A2 |
303 | { |
304 | char _[34981]; |
305 | virtual ~A2() {} |
306 | |
307 | A2* getA2() {return this;} |
308 | }; |
309 | |
310 | struct A3 |
311 | : public A1, |
312 | public A2 |
313 | { |
314 | char _[93481]; |
315 | virtual ~A3() {} |
316 | |
317 | A1* getA1() {return this;} |
318 | A2* getA2() {return this;} |
319 | A3* getA3() {return this;} |
320 | }; |
321 | |
322 | void test() |
323 | { |
324 | A1 a1; |
325 | A2 a2; |
326 | A3 a3; |
327 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
328 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
329 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
330 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); |
331 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
332 | |
333 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
334 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
335 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
336 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
337 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
338 | |
339 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
340 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
341 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
342 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
343 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
344 | } |
345 | |
346 | } // t6 |
347 | |
348 | namespace t7 |
349 | { |
350 | |
351 | struct A1 |
352 | { |
353 | char _[43981]; |
354 | virtual ~A1() {} |
355 | |
356 | A1* getA1() {return this;} |
357 | }; |
358 | |
359 | struct A2 |
360 | { |
361 | char _[34981]; |
362 | virtual ~A2() {} |
363 | |
364 | A2* getA2() {return this;} |
365 | }; |
366 | |
367 | struct A3 |
368 | : public virtual A1, |
369 | public A2 |
370 | { |
371 | char _[93481]; |
372 | virtual ~A3() {} |
373 | |
374 | A1* getA1() {return this;} |
375 | A2* getA2() {return this;} |
376 | A3* getA3() {return this;} |
377 | }; |
378 | |
379 | void test() |
380 | { |
381 | A1 a1; |
382 | A2 a2; |
383 | A3 a3; |
384 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
385 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
386 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
387 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); |
388 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
389 | |
390 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
391 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
392 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
393 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
394 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.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 | } |
402 | |
403 | } // t7 |
404 | |
405 | namespace t8 |
406 | { |
407 | |
408 | struct A1 |
409 | { |
410 | char _[43981]; |
411 | virtual ~A1() {} |
412 | |
413 | A1* getA1() {return this;} |
414 | }; |
415 | |
416 | struct A2 |
417 | { |
418 | char _[34981]; |
419 | virtual ~A2() {} |
420 | |
421 | A2* getA2() {return this;} |
422 | }; |
423 | |
424 | struct A3 |
425 | : private A1, |
426 | public A2 |
427 | { |
428 | char _[93481]; |
429 | virtual ~A3() {} |
430 | |
431 | A1* getA1() {return this;} |
432 | A2* getA2() {return this;} |
433 | A3* getA3() {return this;} |
434 | }; |
435 | |
436 | void test() |
437 | { |
438 | A1 a1; |
439 | A2 a2; |
440 | A3 a3; |
441 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
442 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
443 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
444 | assert(dynamic_cast<A1*>(a3.getA2()) == 0); |
445 | |
446 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
447 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
448 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
449 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
450 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
451 | |
452 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
453 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
454 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
455 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
456 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
457 | } |
458 | |
459 | } // t8 |
460 | |
461 | namespace t9 |
462 | { |
463 | |
464 | struct A1 |
465 | { |
466 | char _[43981]; |
467 | virtual ~A1() {} |
468 | |
469 | A1* getA1() {return this;} |
470 | }; |
471 | |
472 | struct A2 |
473 | { |
474 | char _[34981]; |
475 | virtual ~A2() {} |
476 | |
477 | A2* getA2() {return this;} |
478 | }; |
479 | |
480 | struct A3 |
481 | : private virtual A1, |
482 | public A2 |
483 | { |
484 | char _[93481]; |
485 | virtual ~A3() {} |
486 | |
487 | A1* getA1() {return this;} |
488 | A2* getA2() {return this;} |
489 | A3* getA3() {return this;} |
490 | }; |
491 | |
492 | void test() |
493 | { |
494 | A1 a1; |
495 | A2 a2; |
496 | A3 a3; |
497 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
498 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
499 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
500 | assert(dynamic_cast<A1*>(a3.getA2()) == 0); |
501 | |
502 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
503 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
504 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
505 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
506 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
507 | |
508 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
509 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
510 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
511 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
512 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
513 | } |
514 | |
515 | } // t9 |
516 | |
517 | namespace t10 |
518 | { |
519 | |
520 | struct A1 |
521 | { |
522 | char _[43981]; |
523 | virtual ~A1() {} |
524 | |
525 | A1* getA1() {return this;} |
526 | }; |
527 | |
528 | struct A2 |
529 | { |
530 | char _[34981]; |
531 | virtual ~A2() {} |
532 | |
533 | A2* getA2() {return this;} |
534 | }; |
535 | |
536 | struct A3 |
537 | : public virtual A1, |
538 | public virtual A2 |
539 | { |
540 | char _[93481]; |
541 | virtual ~A3() {} |
542 | |
543 | A1* getA1() {return this;} |
544 | A2* getA2() {return this;} |
545 | A3* getA3() {return this;} |
546 | }; |
547 | |
548 | void test() |
549 | { |
550 | A1 a1; |
551 | A2 a2; |
552 | A3 a3; |
553 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
554 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
555 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
556 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); |
557 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
558 | |
559 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
560 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
561 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
562 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
563 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
564 | |
565 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
566 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
567 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
568 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
569 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
570 | } |
571 | |
572 | } // t10 |
573 | |
574 | namespace t11 |
575 | { |
576 | |
577 | struct A1 |
578 | { |
579 | char _[43981]; |
580 | virtual ~A1() {} |
581 | |
582 | A1* getA1() {return this;} |
583 | }; |
584 | |
585 | struct A2 |
586 | { |
587 | char _[34981]; |
588 | virtual ~A2() {} |
589 | |
590 | A2* getA2() {return this;} |
591 | }; |
592 | |
593 | struct A3 |
594 | : private A1, |
595 | public virtual A2 |
596 | { |
597 | char _[93481]; |
598 | virtual ~A3() {} |
599 | |
600 | A1* getA1() {return this;} |
601 | A2* getA2() {return this;} |
602 | A3* getA3() {return this;} |
603 | }; |
604 | |
605 | void test() |
606 | { |
607 | A1 a1; |
608 | A2 a2; |
609 | A3 a3; |
610 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
611 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
612 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
613 | assert(dynamic_cast<A1*>(a3.getA2()) == 0); |
614 | |
615 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
616 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
617 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
618 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
619 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
620 | |
621 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
622 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
623 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
624 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
625 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
626 | } |
627 | |
628 | } // t11 |
629 | |
630 | namespace t12 |
631 | { |
632 | |
633 | struct A1 |
634 | { |
635 | char _[43981]; |
636 | virtual ~A1() {} |
637 | |
638 | A1* getA1() {return this;} |
639 | }; |
640 | |
641 | struct A2 |
642 | { |
643 | char _[34981]; |
644 | virtual ~A2() {} |
645 | |
646 | A2* getA2() {return this;} |
647 | }; |
648 | |
649 | struct A3 |
650 | : private virtual A1, |
651 | public virtual A2 |
652 | { |
653 | char _[93481]; |
654 | virtual ~A3() {} |
655 | |
656 | A1* getA1() {return this;} |
657 | A2* getA2() {return this;} |
658 | A3* getA3() {return this;} |
659 | }; |
660 | |
661 | void test() |
662 | { |
663 | A1 a1; |
664 | A2 a2; |
665 | A3 a3; |
666 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
667 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
668 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
669 | assert(dynamic_cast<A1*>(a3.getA2()) == 0); |
670 | |
671 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
672 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
673 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
674 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
675 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
676 | |
677 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
678 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
679 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
680 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
681 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
682 | } |
683 | |
684 | } // t12 |
685 | |
686 | namespace t13 |
687 | { |
688 | |
689 | struct A1 |
690 | { |
691 | char _[43981]; |
692 | virtual ~A1() {} |
693 | |
694 | A1* getA1() {return this;} |
695 | }; |
696 | |
697 | struct A2 |
698 | { |
699 | char _[34981]; |
700 | virtual ~A2() {} |
701 | |
702 | A2* getA2() {return this;} |
703 | }; |
704 | |
705 | struct A3 |
706 | : private A1, |
707 | private A2 |
708 | { |
709 | char _[93481]; |
710 | virtual ~A3() {} |
711 | |
712 | A1* getA1() {return this;} |
713 | A2* getA2() {return this;} |
714 | A3* getA3() {return this;} |
715 | }; |
716 | |
717 | void test() |
718 | { |
719 | A1 a1; |
720 | A2 a2; |
721 | A3 a3; |
722 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
723 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
724 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
725 | assert(dynamic_cast<A1*>(a3.getA2()) == 0); |
726 | |
727 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
728 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
729 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
730 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
731 | |
732 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
733 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
734 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
735 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
736 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
737 | } |
738 | |
739 | } // t13 |
740 | |
741 | namespace t14 |
742 | { |
743 | |
744 | struct A1 |
745 | { |
746 | char _[43981]; |
747 | virtual ~A1() {} |
748 | |
749 | A1* getA1() {return this;} |
750 | }; |
751 | |
752 | struct A2 |
753 | { |
754 | char _[34981]; |
755 | virtual ~A2() {} |
756 | |
757 | A2* getA2() {return this;} |
758 | }; |
759 | |
760 | struct A3 |
761 | : private virtual A1, |
762 | private A2 |
763 | { |
764 | char _[93481]; |
765 | virtual ~A3() {} |
766 | |
767 | A1* getA1() {return this;} |
768 | A2* getA2() {return this;} |
769 | A3* getA3() {return this;} |
770 | }; |
771 | |
772 | void test() |
773 | { |
774 | A1 a1; |
775 | A2 a2; |
776 | A3 a3; |
777 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
778 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
779 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
780 | assert(dynamic_cast<A1*>(a3.getA2()) == 0); |
781 | |
782 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
783 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
784 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
785 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
786 | |
787 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
788 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
789 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
790 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
791 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
792 | } |
793 | |
794 | } // t14 |
795 | |
796 | namespace t15 |
797 | { |
798 | |
799 | struct A1 |
800 | { |
801 | char _[43981]; |
802 | virtual ~A1() {} |
803 | |
804 | A1* getA1() {return this;} |
805 | }; |
806 | |
807 | struct A2 |
808 | { |
809 | char _[34981]; |
810 | virtual ~A2() {} |
811 | |
812 | A2* getA2() {return this;} |
813 | }; |
814 | |
815 | struct A3 |
816 | : private virtual A1, |
817 | private virtual A2 |
818 | { |
819 | char _[93481]; |
820 | virtual ~A3() {} |
821 | |
822 | A1* getA1() {return this;} |
823 | A2* getA2() {return this;} |
824 | A3* getA3() {return this;} |
825 | }; |
826 | |
827 | void test() |
828 | { |
829 | A1 a1; |
830 | A2 a2; |
831 | A3 a3; |
832 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
833 | assert(dynamic_cast<A1*>(a2.getA2()) == 0); |
834 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
835 | assert(dynamic_cast<A1*>(a3.getA2()) == 0); |
836 | |
837 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
838 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
839 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
840 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
841 | |
842 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
843 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
844 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
845 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
846 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
847 | } |
848 | |
849 | } // t15 |
850 | |
851 | /* |
852 | |
853 | A1 |
854 | | |
855 | A2 |
856 | | |
857 | A3 |
858 | |
859 | */ |
860 | |
861 | namespace t16 |
862 | { |
863 | |
864 | struct A1 |
865 | { |
866 | char _[43981]; |
867 | virtual ~A1() {} |
868 | |
869 | A1* getA1() {return this;} |
870 | }; |
871 | |
872 | struct A2 |
873 | : public A1 |
874 | { |
875 | char _[34981]; |
876 | virtual ~A2() {} |
877 | |
878 | A1* getA1() {return this;} |
879 | A2* getA2() {return this;} |
880 | }; |
881 | |
882 | struct A3 |
883 | : public A2 |
884 | { |
885 | char _[93481]; |
886 | virtual ~A3() {} |
887 | |
888 | A1* getA1() {return this;} |
889 | A2* getA2() {return this;} |
890 | A3* getA3() {return this;} |
891 | }; |
892 | |
893 | void test() |
894 | { |
895 | A1 a1; |
896 | A2 a2; |
897 | A3 a3; |
898 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
899 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
900 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
901 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
902 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); |
903 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
904 | |
905 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
906 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
907 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
908 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
909 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
910 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
911 | |
912 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
913 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
914 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
915 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
916 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
917 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
918 | } |
919 | |
920 | } // t16 |
921 | |
922 | namespace t17 |
923 | { |
924 | |
925 | struct A1 |
926 | { |
927 | char _[43981]; |
928 | virtual ~A1() {} |
929 | |
930 | A1* getA1() {return this;} |
931 | }; |
932 | |
933 | struct A2 |
934 | : public virtual A1 |
935 | { |
936 | char _[34981]; |
937 | virtual ~A2() {} |
938 | |
939 | A1* getA1() {return this;} |
940 | A2* getA2() {return this;} |
941 | }; |
942 | |
943 | struct A3 |
944 | : public A2 |
945 | { |
946 | char _[93481]; |
947 | virtual ~A3() {} |
948 | |
949 | A1* getA1() {return this;} |
950 | A2* getA2() {return this;} |
951 | A3* getA3() {return this;} |
952 | }; |
953 | |
954 | void test() |
955 | { |
956 | A1 a1; |
957 | A2 a2; |
958 | A3 a3; |
959 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
960 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
961 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
962 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
963 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); |
964 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
965 | |
966 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
967 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
968 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
969 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
970 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
971 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
972 | |
973 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
974 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
975 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
976 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
977 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
978 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
979 | } |
980 | |
981 | } // t17 |
982 | |
983 | namespace t18 |
984 | { |
985 | |
986 | struct A1 |
987 | { |
988 | char _[43981]; |
989 | virtual ~A1() {} |
990 | |
991 | A1* getA1() {return this;} |
992 | }; |
993 | |
994 | struct A2 |
995 | : private A1 |
996 | { |
997 | char _[34981]; |
998 | virtual ~A2() {} |
999 | |
1000 | A1* getA1() {return this;} |
1001 | A2* getA2() {return this;} |
1002 | }; |
1003 | |
1004 | struct A3 |
1005 | : public A2 |
1006 | { |
1007 | char _[93481]; |
1008 | virtual ~A3() {} |
1009 | |
1010 | A2* getA2() {return this;} |
1011 | A3* getA3() {return this;} |
1012 | }; |
1013 | |
1014 | void test() |
1015 | { |
1016 | A1 a1; |
1017 | A2 a2; |
1018 | A3 a3; |
1019 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1020 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1021 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
1022 | |
1023 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1024 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1025 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1026 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
1027 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1028 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
1029 | |
1030 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1031 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1032 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1033 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
1034 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
1035 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1036 | } |
1037 | |
1038 | } // t18 |
1039 | |
1040 | namespace t19 |
1041 | { |
1042 | |
1043 | struct A1 |
1044 | { |
1045 | char _[43981]; |
1046 | virtual ~A1() {} |
1047 | |
1048 | A1* getA1() {return this;} |
1049 | }; |
1050 | |
1051 | struct A2 |
1052 | : protected virtual A1 |
1053 | { |
1054 | char _[34981]; |
1055 | virtual ~A2() {} |
1056 | |
1057 | A1* getA1() {return this;} |
1058 | A2* getA2() {return this;} |
1059 | }; |
1060 | |
1061 | struct A3 |
1062 | : public A2 |
1063 | { |
1064 | char _[93481]; |
1065 | virtual ~A3() {} |
1066 | |
1067 | A2* getA2() {return this;} |
1068 | A3* getA3() {return this;} |
1069 | }; |
1070 | |
1071 | void test() |
1072 | { |
1073 | A1 a1; |
1074 | A2 a2; |
1075 | A3 a3; |
1076 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1077 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1078 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
1079 | |
1080 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1081 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1082 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1083 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
1084 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1085 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
1086 | |
1087 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1088 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1089 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1090 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
1091 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
1092 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1093 | } |
1094 | |
1095 | } // t19 |
1096 | |
1097 | namespace t20 |
1098 | { |
1099 | |
1100 | struct A1 |
1101 | { |
1102 | char _[43981]; |
1103 | virtual ~A1() {} |
1104 | |
1105 | A1* getA1() {return this;} |
1106 | }; |
1107 | |
1108 | struct A2 |
1109 | : public virtual A1 |
1110 | { |
1111 | char _[34981]; |
1112 | virtual ~A2() {} |
1113 | |
1114 | A1* getA1() {return this;} |
1115 | A2* getA2() {return this;} |
1116 | }; |
1117 | |
1118 | struct A3 |
1119 | : public virtual A2 |
1120 | { |
1121 | char _[93481]; |
1122 | virtual ~A3() {} |
1123 | |
1124 | A1* getA1() {return this;} |
1125 | A2* getA2() {return this;} |
1126 | A3* getA3() {return this;} |
1127 | }; |
1128 | |
1129 | void test() |
1130 | { |
1131 | A1 a1; |
1132 | A2 a2; |
1133 | A3 a3; |
1134 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1135 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1136 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
1137 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
1138 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); |
1139 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
1140 | |
1141 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1142 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
1143 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1144 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
1145 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1146 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
1147 | |
1148 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1149 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1150 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1151 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
1152 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
1153 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1154 | } |
1155 | |
1156 | } // t20 |
1157 | |
1158 | namespace t21 |
1159 | { |
1160 | |
1161 | struct A1 |
1162 | { |
1163 | char _[43981]; |
1164 | virtual ~A1() {} |
1165 | |
1166 | A1* getA1() {return this;} |
1167 | }; |
1168 | |
1169 | struct A2 |
1170 | : private A1 |
1171 | { |
1172 | char _[34981]; |
1173 | virtual ~A2() {} |
1174 | |
1175 | A1* getA1() {return this;} |
1176 | A2* getA2() {return this;} |
1177 | }; |
1178 | |
1179 | struct A3 |
1180 | : public virtual A2 |
1181 | { |
1182 | char _[93481]; |
1183 | virtual ~A3() {} |
1184 | |
1185 | A2* getA2() {return this;} |
1186 | A3* getA3() {return this;} |
1187 | }; |
1188 | |
1189 | void test() |
1190 | { |
1191 | A1 a1; |
1192 | A2 a2; |
1193 | A3 a3; |
1194 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1195 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1196 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
1197 | |
1198 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1199 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1200 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1201 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
1202 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1203 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
1204 | |
1205 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1206 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1207 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1208 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
1209 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
1210 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1211 | } |
1212 | |
1213 | } // t21 |
1214 | |
1215 | namespace t22 |
1216 | { |
1217 | |
1218 | struct A1 |
1219 | { |
1220 | char _[43981]; |
1221 | virtual ~A1() {} |
1222 | |
1223 | A1* getA1() {return this;} |
1224 | }; |
1225 | |
1226 | struct A2 |
1227 | : protected virtual A1 |
1228 | { |
1229 | char _[34981]; |
1230 | virtual ~A2() {} |
1231 | |
1232 | A1* getA1() {return this;} |
1233 | A2* getA2() {return this;} |
1234 | }; |
1235 | |
1236 | struct A3 |
1237 | : public virtual A2 |
1238 | { |
1239 | char _[93481]; |
1240 | virtual ~A3() {} |
1241 | |
1242 | A2* getA2() {return this;} |
1243 | A3* getA3() {return this;} |
1244 | }; |
1245 | |
1246 | void test() |
1247 | { |
1248 | A1 a1; |
1249 | A2 a2; |
1250 | A3 a3; |
1251 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1252 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1253 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
1254 | |
1255 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1256 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1257 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1258 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
1259 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1260 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
1261 | |
1262 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1263 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1264 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1265 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
1266 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
1267 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1268 | } |
1269 | |
1270 | } // t22 |
1271 | |
1272 | namespace t23 |
1273 | { |
1274 | |
1275 | struct A1 |
1276 | { |
1277 | char _[43981]; |
1278 | virtual ~A1() {} |
1279 | |
1280 | A1* getA1() {return this;} |
1281 | }; |
1282 | |
1283 | struct A2 |
1284 | : private A1 |
1285 | { |
1286 | char _[34981]; |
1287 | virtual ~A2() {} |
1288 | |
1289 | A1* getA1() {return this;} |
1290 | A2* getA2() {return this;} |
1291 | }; |
1292 | |
1293 | struct A3 |
1294 | : private A2 |
1295 | { |
1296 | char _[93481]; |
1297 | virtual ~A3() {} |
1298 | |
1299 | t23::A1* getA1() {return A2::getA1();} |
1300 | A2* getA2() {return this;} |
1301 | A3* getA3() {return this;} |
1302 | }; |
1303 | |
1304 | void test() |
1305 | { |
1306 | A1 a1; |
1307 | A2 a2; |
1308 | A3 a3; |
1309 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1310 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1311 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
1312 | |
1313 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1314 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1315 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1316 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
1317 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1318 | |
1319 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1320 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1321 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1322 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
1323 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
1324 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1325 | } |
1326 | |
1327 | } // t23 |
1328 | |
1329 | namespace t24 |
1330 | { |
1331 | |
1332 | struct A1 |
1333 | { |
1334 | char _[43981]; |
1335 | virtual ~A1() {} |
1336 | |
1337 | A1* getA1() {return this;} |
1338 | }; |
1339 | |
1340 | struct A2 |
1341 | : protected virtual A1 |
1342 | { |
1343 | char _[34981]; |
1344 | virtual ~A2() {} |
1345 | |
1346 | A1* getA1() {return this;} |
1347 | A2* getA2() {return this;} |
1348 | }; |
1349 | |
1350 | struct A3 |
1351 | : private A2 |
1352 | { |
1353 | char _[93481]; |
1354 | virtual ~A3() {} |
1355 | |
1356 | t24::A1* getA1() {return A2::getA1();} |
1357 | A2* getA2() {return this;} |
1358 | A3* getA3() {return this;} |
1359 | }; |
1360 | |
1361 | void test() |
1362 | { |
1363 | A1 a1; |
1364 | A2 a2; |
1365 | A3 a3; |
1366 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1367 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1368 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
1369 | |
1370 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1371 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1372 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1373 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
1374 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1375 | |
1376 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1377 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1378 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1379 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
1380 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
1381 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1382 | } |
1383 | |
1384 | } // t24 |
1385 | |
1386 | namespace t25 |
1387 | { |
1388 | |
1389 | struct A1 |
1390 | { |
1391 | char _[43981]; |
1392 | virtual ~A1() {} |
1393 | |
1394 | A1* getA1() {return this;} |
1395 | }; |
1396 | |
1397 | struct A2 |
1398 | : protected virtual A1 |
1399 | { |
1400 | char _[34981]; |
1401 | virtual ~A2() {} |
1402 | |
1403 | A1* getA1() {return this;} |
1404 | A2* getA2() {return this;} |
1405 | }; |
1406 | |
1407 | struct A3 |
1408 | : private virtual A2 |
1409 | { |
1410 | char _[93481]; |
1411 | virtual ~A3() {} |
1412 | |
1413 | t25::A1* getA1() {return A2::getA1();} |
1414 | A2* getA2() {return this;} |
1415 | A3* getA3() {return this;} |
1416 | }; |
1417 | |
1418 | void test() |
1419 | { |
1420 | A1 a1; |
1421 | A2 a2; |
1422 | A3 a3; |
1423 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1424 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1425 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
1426 | |
1427 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1428 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1429 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1430 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
1431 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1432 | |
1433 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1434 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1435 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1436 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
1437 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
1438 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1439 | } |
1440 | |
1441 | } // t25 |
1442 | |
1443 | /* |
1444 | |
1445 | A1 A1 |
1446 | | | |
1447 | A2 | |
1448 | \ | |
1449 | A3 |
1450 | |
1451 | */ |
1452 | |
1453 | namespace t26 |
1454 | { |
1455 | |
1456 | struct A1 |
1457 | { |
1458 | char _[43981]; |
1459 | virtual ~A1() {} |
1460 | |
1461 | A1* getA1() {return this;} |
1462 | }; |
1463 | |
1464 | struct A2 |
1465 | : public A1 |
1466 | { |
1467 | char _[34981]; |
1468 | virtual ~A2() {} |
1469 | |
1470 | A1* getA1() {return this;} |
1471 | A2* getA2() {return this;} |
1472 | }; |
1473 | |
1474 | struct A3 |
1475 | : public A1, |
1476 | public A2 |
1477 | { |
1478 | char _[93481]; |
1479 | virtual ~A3() {} |
1480 | |
1481 | A1* getA12() {return A2::getA1();} |
1482 | A2* getA2() {return this;} |
1483 | A3* getA3() {return this;} |
1484 | }; |
1485 | |
1486 | void test() |
1487 | { |
1488 | A1 a1; |
1489 | A2 a2; |
1490 | A3 a3; |
1491 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1492 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1493 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
1494 | assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12()); |
1495 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA12()); |
1496 | |
1497 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1498 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
1499 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1500 | assert(dynamic_cast<A2*>(a3.getA12()) == a3.getA2()); |
1501 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1502 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
1503 | |
1504 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1505 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1506 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1507 | assert(dynamic_cast<A3*>(a3.getA12()) == a3.getA3()); |
1508 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
1509 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1510 | } |
1511 | |
1512 | } // t26 |
1513 | |
1514 | namespace t27 |
1515 | { |
1516 | |
1517 | struct A1 |
1518 | { |
1519 | char _[43981]; |
1520 | virtual ~A1() {} |
1521 | |
1522 | A1* getA1() {return this;} |
1523 | }; |
1524 | |
1525 | struct A2 |
1526 | : private A1 |
1527 | { |
1528 | char _[34981]; |
1529 | virtual ~A2() {} |
1530 | |
1531 | A1* getA1() {return this;} |
1532 | A2* getA2() {return this;} |
1533 | }; |
1534 | |
1535 | struct A3 |
1536 | : public A1, |
1537 | public A2 |
1538 | { |
1539 | char _[93481]; |
1540 | virtual ~A3() {} |
1541 | |
1542 | A1* getA12() {return A2::getA1();} |
1543 | A2* getA2() {return this;} |
1544 | A3* getA3() {return this;} |
1545 | }; |
1546 | |
1547 | void test() |
1548 | { |
1549 | A1 a1; |
1550 | A2 a2; |
1551 | A3 a3; |
1552 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1553 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1554 | assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12()); |
1555 | |
1556 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1557 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1558 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1559 | assert(dynamic_cast<A2*>(a3.getA12()) == 0); |
1560 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1561 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
1562 | |
1563 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1564 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1565 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1566 | assert(dynamic_cast<A3*>(a3.getA12()) == 0); |
1567 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
1568 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1569 | } |
1570 | |
1571 | } // t27 |
1572 | |
1573 | namespace t28 |
1574 | { |
1575 | |
1576 | struct A1 |
1577 | { |
1578 | char _[43981]; |
1579 | virtual ~A1() {} |
1580 | |
1581 | A1* getA1() {return this;} |
1582 | }; |
1583 | |
1584 | struct A2 |
1585 | : public A1 |
1586 | { |
1587 | char _[34981]; |
1588 | virtual ~A2() {} |
1589 | |
1590 | A1* getA1() {return this;} |
1591 | A2* getA2() {return this;} |
1592 | }; |
1593 | |
1594 | struct A3 |
1595 | : private A1, |
1596 | public A2 |
1597 | { |
1598 | char _[93481]; |
1599 | virtual ~A3() {} |
1600 | |
1601 | A1* getA12() {return A2::getA1();} |
1602 | A2* getA2() {return this;} |
1603 | A3* getA3() {return this;} |
1604 | }; |
1605 | |
1606 | void test() |
1607 | { |
1608 | A1 a1; |
1609 | A2 a2; |
1610 | A3 a3; |
1611 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1612 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1613 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
1614 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA12()); |
1615 | |
1616 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1617 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
1618 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1619 | assert(dynamic_cast<A2*>(a3.getA12()) == a3.getA2()); |
1620 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1621 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
1622 | |
1623 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1624 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1625 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1626 | assert(dynamic_cast<A3*>(a3.getA12()) == a3.getA3()); |
1627 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
1628 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1629 | } |
1630 | |
1631 | } // t28 |
1632 | |
1633 | namespace t29 |
1634 | { |
1635 | |
1636 | struct A1 |
1637 | { |
1638 | char _[43981]; |
1639 | virtual ~A1() {} |
1640 | |
1641 | A1* getA1() {return this;} |
1642 | }; |
1643 | |
1644 | struct A2 |
1645 | : public A1 |
1646 | { |
1647 | char _[34981]; |
1648 | virtual ~A2() {} |
1649 | |
1650 | A1* getA1() {return this;} |
1651 | A2* getA2() {return this;} |
1652 | }; |
1653 | |
1654 | struct A3 |
1655 | : public A1, |
1656 | private A2 |
1657 | { |
1658 | char _[93481]; |
1659 | virtual ~A3() {} |
1660 | |
1661 | A1* getA12() {return A2::getA1();} |
1662 | A2* getA2() {return this;} |
1663 | A3* getA3() {return this;} |
1664 | }; |
1665 | |
1666 | void test() |
1667 | { |
1668 | A1 a1; |
1669 | A2 a2; |
1670 | A3 a3; |
1671 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1672 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1673 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
1674 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA12()); |
1675 | |
1676 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1677 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
1678 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1679 | assert(dynamic_cast<A2*>(a3.getA12()) == a3.getA2()); |
1680 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1681 | |
1682 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1683 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1684 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1685 | assert(dynamic_cast<A3*>(a3.getA12()) == 0); |
1686 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
1687 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1688 | } |
1689 | |
1690 | } // t29 |
1691 | |
1692 | namespace t30 |
1693 | { |
1694 | |
1695 | struct A1 |
1696 | { |
1697 | char _[43981]; |
1698 | virtual ~A1() {} |
1699 | |
1700 | A1* getA1() {return this;} |
1701 | }; |
1702 | |
1703 | struct A2 |
1704 | : public A1 |
1705 | { |
1706 | char _[34981]; |
1707 | virtual ~A2() {} |
1708 | |
1709 | A1* getA1() {return this;} |
1710 | A2* getA2() {return this;} |
1711 | }; |
1712 | |
1713 | struct A3 |
1714 | : private A1, |
1715 | private A2 |
1716 | { |
1717 | char _[93481]; |
1718 | virtual ~A3() {} |
1719 | |
1720 | A1* getA12() {return A2::getA1();} |
1721 | A2* getA2() {return this;} |
1722 | A3* getA3() {return this;} |
1723 | }; |
1724 | |
1725 | void test() |
1726 | { |
1727 | A1 a1; |
1728 | A2 a2; |
1729 | A3 a3; |
1730 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1731 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1732 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
1733 | assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12()); |
1734 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA12()); |
1735 | |
1736 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1737 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
1738 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1739 | assert(dynamic_cast<A2*>(a3.getA12()) == a3.getA2()); |
1740 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1741 | |
1742 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1743 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1744 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1745 | assert(dynamic_cast<A3*>(a3.getA12()) == 0); |
1746 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
1747 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1748 | } |
1749 | |
1750 | } // t30 |
1751 | |
1752 | namespace t31 |
1753 | { |
1754 | |
1755 | struct A1 |
1756 | { |
1757 | char _[43981]; |
1758 | virtual ~A1() {} |
1759 | |
1760 | A1* getA1() {return this;} |
1761 | }; |
1762 | |
1763 | struct A2 |
1764 | : private A1 |
1765 | { |
1766 | char _[34981]; |
1767 | virtual ~A2() {} |
1768 | |
1769 | A1* getA1() {return this;} |
1770 | A2* getA2() {return this;} |
1771 | }; |
1772 | |
1773 | struct A3 |
1774 | : public A1, |
1775 | private A2 |
1776 | { |
1777 | char _[93481]; |
1778 | virtual ~A3() {} |
1779 | |
1780 | A1* getA12() {return A2::getA1();} |
1781 | A2* getA2() {return this;} |
1782 | A3* getA3() {return this;} |
1783 | }; |
1784 | |
1785 | void test() |
1786 | { |
1787 | A1 a1; |
1788 | A2 a2; |
1789 | A3 a3; |
1790 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1791 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1792 | assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12()); |
1793 | |
1794 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1795 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1796 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1797 | assert(dynamic_cast<A2*>(a3.getA12()) == 0); |
1798 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1799 | |
1800 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1801 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1802 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1803 | assert(dynamic_cast<A3*>(a3.getA12()) == 0); |
1804 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
1805 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1806 | } |
1807 | |
1808 | } // t31 |
1809 | |
1810 | namespace t32 |
1811 | { |
1812 | |
1813 | struct A1 |
1814 | { |
1815 | char _[43981]; |
1816 | virtual ~A1() {} |
1817 | |
1818 | A1* getA1() {return this;} |
1819 | }; |
1820 | |
1821 | struct A2 |
1822 | : private A1 |
1823 | { |
1824 | char _[34981]; |
1825 | virtual ~A2() {} |
1826 | |
1827 | A1* getA1() {return this;} |
1828 | A2* getA2() {return this;} |
1829 | }; |
1830 | |
1831 | struct A3 |
1832 | : private A1, |
1833 | public A2 |
1834 | { |
1835 | char _[93481]; |
1836 | virtual ~A3() {} |
1837 | |
1838 | A1* getA12() {return A2::getA1();} |
1839 | A2* getA2() {return this;} |
1840 | A3* getA3() {return this;} |
1841 | }; |
1842 | |
1843 | void test() |
1844 | { |
1845 | A1 a1; |
1846 | A2 a2; |
1847 | A3 a3; |
1848 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1849 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1850 | assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12()); |
1851 | |
1852 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1853 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1854 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1855 | assert(dynamic_cast<A2*>(a3.getA12()) == 0); |
1856 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1857 | |
1858 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1859 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1860 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1861 | assert(dynamic_cast<A3*>(a3.getA12()) == 0); |
1862 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
1863 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1864 | } |
1865 | |
1866 | } // t32 |
1867 | |
1868 | namespace t33 |
1869 | { |
1870 | |
1871 | struct A1 |
1872 | { |
1873 | char _[43981]; |
1874 | virtual ~A1() {} |
1875 | |
1876 | A1* getA1() {return this;} |
1877 | }; |
1878 | |
1879 | struct A2 |
1880 | : private A1 |
1881 | { |
1882 | char _[34981]; |
1883 | virtual ~A2() {} |
1884 | |
1885 | A1* getA1() {return this;} |
1886 | A2* getA2() {return this;} |
1887 | }; |
1888 | |
1889 | struct A3 |
1890 | : private A1, |
1891 | private A2 |
1892 | { |
1893 | char _[93481]; |
1894 | virtual ~A3() {} |
1895 | |
1896 | A1* getA12() {return A2::getA1();} |
1897 | A2* getA2() {return this;} |
1898 | A3* getA3() {return this;} |
1899 | }; |
1900 | |
1901 | void test() |
1902 | { |
1903 | A1 a1; |
1904 | A2 a2; |
1905 | A3 a3; |
1906 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1907 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1908 | assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12()); |
1909 | |
1910 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1911 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
1912 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1913 | assert(dynamic_cast<A2*>(a3.getA12()) == 0); |
1914 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1915 | |
1916 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1917 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1918 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1919 | assert(dynamic_cast<A3*>(a3.getA12()) == 0); |
1920 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
1921 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1922 | } |
1923 | |
1924 | } // t33 |
1925 | |
1926 | /* |
1927 | |
1928 | A1 |
1929 | | \ |
1930 | A2 \ |
1931 | \ | |
1932 | A3 |
1933 | |
1934 | */ |
1935 | |
1936 | namespace t34 |
1937 | { |
1938 | |
1939 | struct A1 |
1940 | { |
1941 | char _[43981]; |
1942 | virtual ~A1() {} |
1943 | |
1944 | A1* getA1() {return this;} |
1945 | }; |
1946 | |
1947 | struct A2 |
1948 | : public virtual A1 |
1949 | { |
1950 | char _[34981]; |
1951 | virtual ~A2() {} |
1952 | |
1953 | A1* getA1() {return this;} |
1954 | A2* getA2() {return this;} |
1955 | }; |
1956 | |
1957 | struct A3 |
1958 | : public virtual A1, |
1959 | public A2 |
1960 | { |
1961 | char _[93481]; |
1962 | virtual ~A3() {} |
1963 | |
1964 | A1* getA1() {return A1::getA1();} |
1965 | A2* getA2() {return this;} |
1966 | A3* getA3() {return this;} |
1967 | }; |
1968 | |
1969 | void test() |
1970 | { |
1971 | A1 a1; |
1972 | A2 a2; |
1973 | A3 a3; |
1974 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
1975 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
1976 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
1977 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
1978 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); |
1979 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
1980 | |
1981 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
1982 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
1983 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
1984 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
1985 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
1986 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
1987 | |
1988 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
1989 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
1990 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
1991 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
1992 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
1993 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
1994 | } |
1995 | |
1996 | } // t34 |
1997 | |
1998 | namespace t35 |
1999 | { |
2000 | |
2001 | struct A1 |
2002 | { |
2003 | char _[43981]; |
2004 | virtual ~A1() {} |
2005 | |
2006 | A1* getA1() {return this;} |
2007 | }; |
2008 | |
2009 | struct A2 |
2010 | : private virtual A1 |
2011 | { |
2012 | char _[34981]; |
2013 | virtual ~A2() {} |
2014 | |
2015 | A1* getA1() {return this;} |
2016 | A2* getA2() {return this;} |
2017 | }; |
2018 | |
2019 | struct A3 |
2020 | : public virtual A1, |
2021 | public A2 |
2022 | { |
2023 | char _[93481]; |
2024 | virtual ~A3() {} |
2025 | |
2026 | A1* getA1() {return A1::getA1();} |
2027 | A2* getA2() {return this;} |
2028 | A3* getA3() {return this;} |
2029 | }; |
2030 | |
2031 | void test() |
2032 | { |
2033 | A1 a1; |
2034 | A2 a2; |
2035 | A3 a3; |
2036 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
2037 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
2038 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
2039 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
2040 | |
2041 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
2042 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
2043 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
2044 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
2045 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
2046 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
2047 | |
2048 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
2049 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
2050 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
2051 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
2052 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
2053 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
2054 | } |
2055 | |
2056 | } // t35 |
2057 | |
2058 | namespace t36 |
2059 | { |
2060 | |
2061 | struct A1 |
2062 | { |
2063 | char _[43981]; |
2064 | virtual ~A1() {} |
2065 | |
2066 | A1* getA1() {return this;} |
2067 | }; |
2068 | |
2069 | struct A2 |
2070 | : public virtual A1 |
2071 | { |
2072 | char _[34981]; |
2073 | virtual ~A2() {} |
2074 | |
2075 | A1* getA1() {return this;} |
2076 | A2* getA2() {return this;} |
2077 | }; |
2078 | |
2079 | struct A3 |
2080 | : private virtual A1, |
2081 | public A2 |
2082 | { |
2083 | char _[93481]; |
2084 | virtual ~A3() {} |
2085 | |
2086 | A1* getA1() {return A1::getA1();} |
2087 | A2* getA2() {return this;} |
2088 | A3* getA3() {return this;} |
2089 | }; |
2090 | |
2091 | void test() |
2092 | { |
2093 | A1 a1; |
2094 | A2 a2; |
2095 | A3 a3; |
2096 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
2097 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
2098 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
2099 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
2100 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); |
2101 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
2102 | |
2103 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
2104 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
2105 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
2106 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
2107 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
2108 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
2109 | |
2110 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
2111 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
2112 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
2113 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
2114 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
2115 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
2116 | } |
2117 | |
2118 | } // t36 |
2119 | |
2120 | namespace t37 |
2121 | { |
2122 | |
2123 | struct A1 |
2124 | { |
2125 | char _[43981]; |
2126 | virtual ~A1() {} |
2127 | |
2128 | A1* getA1() {return this;} |
2129 | }; |
2130 | |
2131 | struct A2 |
2132 | : public virtual A1 |
2133 | { |
2134 | char _[34981]; |
2135 | virtual ~A2() {} |
2136 | |
2137 | A1* getA1() {return this;} |
2138 | A2* getA2() {return this;} |
2139 | }; |
2140 | |
2141 | struct A3 |
2142 | : public virtual A1, |
2143 | private A2 |
2144 | { |
2145 | char _[93481]; |
2146 | virtual ~A3() {} |
2147 | |
2148 | A1* getA1() {return A1::getA1();} |
2149 | A2* getA2() {return this;} |
2150 | A3* getA3() {return this;} |
2151 | }; |
2152 | |
2153 | void test() |
2154 | { |
2155 | A1 a1; |
2156 | A2 a2; |
2157 | A3 a3; |
2158 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
2159 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
2160 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
2161 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
2162 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); |
2163 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
2164 | |
2165 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
2166 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
2167 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
2168 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
2169 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
2170 | |
2171 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
2172 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
2173 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
2174 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
2175 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
2176 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
2177 | } |
2178 | |
2179 | } // t37 |
2180 | |
2181 | namespace t38 |
2182 | { |
2183 | |
2184 | struct A1 |
2185 | { |
2186 | char _[43981]; |
2187 | virtual ~A1() {} |
2188 | |
2189 | A1* getA1() {return this;} |
2190 | }; |
2191 | |
2192 | struct A2 |
2193 | : public virtual A1 |
2194 | { |
2195 | char _[34981]; |
2196 | virtual ~A2() {} |
2197 | |
2198 | A1* getA1() {return this;} |
2199 | A2* getA2() {return this;} |
2200 | }; |
2201 | |
2202 | struct A3 |
2203 | : private virtual A1, |
2204 | private A2 |
2205 | { |
2206 | char _[93481]; |
2207 | virtual ~A3() {} |
2208 | |
2209 | A1* getA1() {return A1::getA1();} |
2210 | A2* getA2() {return this;} |
2211 | A3* getA3() {return this;} |
2212 | }; |
2213 | |
2214 | void test() |
2215 | { |
2216 | A1 a1; |
2217 | A2 a2; |
2218 | A3 a3; |
2219 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
2220 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
2221 | assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1()); |
2222 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
2223 | assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); |
2224 | |
2225 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
2226 | assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2()); |
2227 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
2228 | assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); |
2229 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
2230 | |
2231 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
2232 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
2233 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
2234 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
2235 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
2236 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
2237 | } |
2238 | |
2239 | } // t38 |
2240 | |
2241 | namespace t39 |
2242 | { |
2243 | |
2244 | struct A1 |
2245 | { |
2246 | char _[43981]; |
2247 | virtual ~A1() {} |
2248 | |
2249 | A1* getA1() {return this;} |
2250 | }; |
2251 | |
2252 | struct A2 |
2253 | : private virtual A1 |
2254 | { |
2255 | char _[34981]; |
2256 | virtual ~A2() {} |
2257 | |
2258 | A1* getA1() {return this;} |
2259 | A2* getA2() {return this;} |
2260 | }; |
2261 | |
2262 | struct A3 |
2263 | : public virtual A1, |
2264 | private A2 |
2265 | { |
2266 | char _[93481]; |
2267 | virtual ~A3() {} |
2268 | |
2269 | A1* getA1() {return A1::getA1();} |
2270 | A2* getA2() {return this;} |
2271 | A3* getA3() {return this;} |
2272 | }; |
2273 | |
2274 | void test() |
2275 | { |
2276 | A1 a1; |
2277 | A2 a2; |
2278 | A3 a3; |
2279 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
2280 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
2281 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
2282 | assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); |
2283 | |
2284 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
2285 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
2286 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
2287 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
2288 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
2289 | |
2290 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
2291 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
2292 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
2293 | assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); |
2294 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
2295 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
2296 | } |
2297 | |
2298 | } // t39 |
2299 | |
2300 | namespace t40 |
2301 | { |
2302 | |
2303 | struct A1 |
2304 | { |
2305 | char _[43981]; |
2306 | virtual ~A1() {} |
2307 | |
2308 | A1* getA1() {return this;} |
2309 | }; |
2310 | |
2311 | struct A2 |
2312 | : private virtual A1 |
2313 | { |
2314 | char _[34981]; |
2315 | virtual ~A2() {} |
2316 | |
2317 | A1* getA1() {return this;} |
2318 | A2* getA2() {return this;} |
2319 | }; |
2320 | |
2321 | struct A3 |
2322 | : private virtual A1, |
2323 | public A2 |
2324 | { |
2325 | char _[93481]; |
2326 | virtual ~A3() {} |
2327 | |
2328 | A1* getA1() {return A1::getA1();} |
2329 | A2* getA2() {return this;} |
2330 | A3* getA3() {return this;} |
2331 | }; |
2332 | |
2333 | void test() |
2334 | { |
2335 | A1 a1; |
2336 | A2 a2; |
2337 | A3 a3; |
2338 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
2339 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
2340 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
2341 | |
2342 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
2343 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
2344 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
2345 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
2346 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
2347 | assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); |
2348 | |
2349 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
2350 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
2351 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
2352 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
2353 | assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); |
2354 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
2355 | } |
2356 | |
2357 | } // t40 |
2358 | |
2359 | namespace t41 |
2360 | { |
2361 | |
2362 | struct A1 |
2363 | { |
2364 | char _[43981]; |
2365 | virtual ~A1() {} |
2366 | |
2367 | A1* getA1() {return this;} |
2368 | }; |
2369 | |
2370 | struct A2 |
2371 | : private virtual A1 |
2372 | { |
2373 | char _[34981]; |
2374 | virtual ~A2() {} |
2375 | |
2376 | A1* getA1() {return this;} |
2377 | A2* getA2() {return this;} |
2378 | }; |
2379 | |
2380 | struct A3 |
2381 | : private virtual A1, |
2382 | private A2 |
2383 | { |
2384 | char _[93481]; |
2385 | virtual ~A3() {} |
2386 | |
2387 | A1* getA1() {return A1::getA1();} |
2388 | A2* getA2() {return this;} |
2389 | A3* getA3() {return this;} |
2390 | }; |
2391 | |
2392 | void test() |
2393 | { |
2394 | A1 a1; |
2395 | A2 a2; |
2396 | A3 a3; |
2397 | assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); |
2398 | assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1()); |
2399 | assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); |
2400 | |
2401 | assert(dynamic_cast<A2*>(a1.getA1()) == 0); |
2402 | assert(dynamic_cast<A2*>(a2.getA1()) == 0); |
2403 | assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); |
2404 | assert(dynamic_cast<A2*>(a3.getA1()) == 0); |
2405 | assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); |
2406 | |
2407 | assert(dynamic_cast<A3*>(a1.getA1()) == 0); |
2408 | assert(dynamic_cast<A3*>(a2.getA1()) == 0); |
2409 | assert(dynamic_cast<A3*>(a2.getA2()) == 0); |
2410 | assert(dynamic_cast<A3*>(a3.getA1()) == 0); |
2411 | assert(dynamic_cast<A3*>(a3.getA2()) == 0); |
2412 | assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); |
2413 | } |
2414 | |
2415 | } // t41 |
2416 | |
2417 | int main(int, char**) |
2418 | { |
2419 | timer t; |
2420 | t1::test(); |
2421 | t2::test(); |
2422 | t3::test(); |
2423 | t4::test(); |
2424 | t5::test(); |
2425 | t6::test(); |
2426 | t7::test(); |
2427 | t8::test(); |
2428 | t9::test(); |
2429 | t10::test(); |
2430 | t11::test(); |
2431 | t12::test(); |
2432 | t13::test(); |
2433 | t14::test(); |
2434 | t15::test(); |
2435 | t16::test(); |
2436 | t17::test(); |
2437 | t18::test(); |
2438 | t19::test(); |
2439 | t20::test(); |
2440 | t21::test(); |
2441 | t22::test(); |
2442 | t23::test(); |
2443 | t24::test(); |
2444 | t25::test(); |
2445 | t26::test(); |
2446 | t27::test(); |
2447 | t28::test(); |
2448 | t29::test(); |
2449 | t30::test(); |
2450 | t31::test(); |
2451 | t32::test(); |
2452 | t33::test(); |
2453 | t34::test(); |
2454 | t35::test(); |
2455 | t36::test(); |
2456 | t37::test(); |
2457 | t38::test(); |
2458 | t39::test(); |
2459 | t40::test(); |
2460 | t41::test(); |
2461 | |
2462 | return 0; |
2463 | } |
2464 | |