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]; |
26 | virtual ~A1() {} |
27 | |
28 | A1* getA1() {return this;} |
29 | }; |
30 | |
31 | struct A2 |
32 | { |
33 | char _[34981]; |
34 | virtual ~A2() {} |
35 | |
36 | A2* getA2() {return this;} |
37 | }; |
38 | |
39 | struct A3 |
40 | : public virtual A1, |
41 | private A2 |
42 | { |
43 | char _[93481]; |
44 | virtual ~A3() {} |
45 | |
46 | A1* getA1() {return A1::getA1();} |
47 | A2* getA2() {return A2::getA2();} |
48 | A3* getA3() {return this;} |
49 | }; |
50 | |
51 | struct A4 |
52 | : public A3, |
53 | public A2 |
54 | { |
55 | char _[13489]; |
56 | virtual ~A4() {} |
57 | |
58 | t1::A1* getA1() {return A3::getA1();} |
59 | A2* getA2() {return A3::getA2();} |
60 | A3* getA3() {return A3::getA3();} |
61 | A4* getA4() {return this;} |
62 | }; |
63 | |
64 | struct A5 |
65 | : public A4, |
66 | public A3 |
67 | { |
68 | char _[13489]; |
69 | virtual ~A5() {} |
70 | |
71 | t1::A1* getA1() {return A4::getA1();} |
72 | A2* getA2() {return A4::getA2();} |
73 | A3* getA3() {return A4::getA3();} |
74 | A4* getA4() {return A4::getA4();} |
75 | A5* getA5() {return this;} |
76 | }; |
77 | |
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]; |
170 | virtual ~A1() {} |
171 | |
172 | A1* getA1() {return this;} |
173 | }; |
174 | |
175 | struct A2 |
176 | { |
177 | char _[34981]; |
178 | virtual ~A2() {} |
179 | |
180 | A2* getA2() {return this;} |
181 | }; |
182 | |
183 | struct A3 |
184 | : public virtual A1, |
185 | public A2 |
186 | { |
187 | char _[93481]; |
188 | virtual ~A3() {} |
189 | |
190 | A1* getA1() {return A1::getA1();} |
191 | A2* getA2() {return A2::getA2();} |
192 | A3* getA3() {return this;} |
193 | }; |
194 | |
195 | struct A4 |
196 | : public A3, |
197 | public A2 |
198 | { |
199 | char _[13489]; |
200 | virtual ~A4() {} |
201 | |
202 | t2::A1* getA1() {return A3::getA1();} |
203 | A2* getA2() {return A3::getA2();} |
204 | A3* getA3() {return A3::getA3();} |
205 | A4* getA4() {return this;} |
206 | }; |
207 | |
208 | struct A5 |
209 | : public A4, |
210 | public A3 |
211 | { |
212 | char _[13489]; |
213 | virtual ~A5() {} |
214 | |
215 | t2::A1* getA1() {return A4::getA1();} |
216 | A2* getA2() {return A4::getA2();} |
217 | A3* getA3() {return A4::getA3();} |
218 | A4* getA4() {return A4::getA4();} |
219 | A5* getA5() {return this;} |
220 | }; |
221 | |
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]; |
314 | virtual ~A1() {} |
315 | |
316 | A1* getA1() {return this;} |
317 | }; |
318 | |
319 | struct A2 |
320 | { |
321 | char _[34981]; |
322 | virtual ~A2() {} |
323 | |
324 | A2* getA2() {return this;} |
325 | }; |
326 | |
327 | struct A3 |
328 | : public A1, |
329 | public virtual A2 |
330 | { |
331 | char _[93481]; |
332 | virtual ~A3() {} |
333 | |
334 | A1* getA1() {return A1::getA1();} |
335 | A2* getA2() {return A2::getA2();} |
336 | A3* getA3() {return this;} |
337 | }; |
338 | |
339 | struct A4 |
340 | : public A1, |
341 | public virtual A2 |
342 | { |
343 | char _[13489]; |
344 | virtual ~A4() {} |
345 | |
346 | A1* getA1() {return A1::getA1();} |
347 | A2* getA2() {return A2::getA2();} |
348 | A4* getA4() {return this;} |
349 | }; |
350 | |
351 | struct A5 |
352 | : public A3, |
353 | public A4 |
354 | { |
355 | char _[41389]; |
356 | virtual ~A5() {} |
357 | |
358 | A1* getA14() {return A4::getA1();} |
359 | A1* getA13() {return A3::getA1();} |
360 | A2* getA2() {return A4::getA2();} |
361 | A3* getA3() {return A3::getA3();} |
362 | A4* getA4() {return A4::getA4();} |
363 | A5* getA5() {return this;} |
364 | }; |
365 | |
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]; |
457 | virtual ~A1() {} |
458 | |
459 | A1* getA1() {return this;} |
460 | }; |
461 | |
462 | struct A2 |
463 | { |
464 | char _[34981]; |
465 | virtual ~A2() {} |
466 | |
467 | A2* getA2() {return this;} |
468 | }; |
469 | |
470 | struct A3 |
471 | : protected A1, |
472 | public virtual A2 |
473 | { |
474 | char _[93481]; |
475 | virtual ~A3() {} |
476 | |
477 | A1* getA1() {return A1::getA1();} |
478 | A2* getA2() {return A2::getA2();} |
479 | A3* getA3() {return this;} |
480 | }; |
481 | |
482 | struct A4 |
483 | : public A1, |
484 | public virtual A2 |
485 | { |
486 | char _[13489]; |
487 | virtual ~A4() {} |
488 | |
489 | A1* getA1() {return A1::getA1();} |
490 | A2* getA2() {return A2::getA2();} |
491 | A4* getA4() {return this;} |
492 | }; |
493 | |
494 | struct A5 |
495 | : public A3, |
496 | public A4 |
497 | { |
498 | char _[41389]; |
499 | virtual ~A5() {} |
500 | |
501 | A1* getA14() {return A4::getA1();} |
502 | A1* getA13() {return A3::getA1();} |
503 | A2* getA2() {return A4::getA2();} |
504 | A3* getA3() {return A3::getA3();} |
505 | A4* getA4() {return A4::getA4();} |
506 | A5* getA5() {return this;} |
507 | }; |
508 | |
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]; |
600 | virtual ~A1() {} |
601 | |
602 | A1* getA1() {return this;} |
603 | }; |
604 | |
605 | struct A2 |
606 | { |
607 | char _[34981]; |
608 | virtual ~A2() {} |
609 | |
610 | A2* getA2() {return this;} |
611 | }; |
612 | |
613 | struct A3 |
614 | : public A1, |
615 | protected virtual A2 |
616 | { |
617 | char _[93481]; |
618 | virtual ~A3() {} |
619 | |
620 | A1* getA1() {return A1::getA1();} |
621 | A2* getA2() {return A2::getA2();} |
622 | A3* getA3() {return this;} |
623 | }; |
624 | |
625 | struct A4 |
626 | : public A1, |
627 | public virtual A2 |
628 | { |
629 | char _[13489]; |
630 | virtual ~A4() {} |
631 | |
632 | A1* getA1() {return A1::getA1();} |
633 | A2* getA2() {return A2::getA2();} |
634 | A4* getA4() {return this;} |
635 | }; |
636 | |
637 | struct A5 |
638 | : public A3, |
639 | public A4 |
640 | { |
641 | char _[41389]; |
642 | virtual ~A5() {} |
643 | |
644 | A1* getA14() {return A4::getA1();} |
645 | A1* getA13() {return A3::getA1();} |
646 | A2* getA2() {return A4::getA2();} |
647 | A3* getA3() {return A3::getA3();} |
648 | A4* getA4() {return A4::getA4();} |
649 | A5* getA5() {return this;} |
650 | }; |
651 | |
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]; |
743 | virtual ~A1() {} |
744 | |
745 | A1* getA1() {return this;} |
746 | }; |
747 | |
748 | struct A2 |
749 | { |
750 | char _[34981]; |
751 | virtual ~A2() {} |
752 | |
753 | A2* getA2() {return this;} |
754 | }; |
755 | |
756 | struct A3 |
757 | : public A1, |
758 | public virtual A2 |
759 | { |
760 | char _[93481]; |
761 | virtual ~A3() {} |
762 | |
763 | A1* getA1() {return A1::getA1();} |
764 | A2* getA2() {return A2::getA2();} |
765 | A3* getA3() {return this;} |
766 | }; |
767 | |
768 | struct A4 |
769 | : protected A1, |
770 | public virtual A2 |
771 | { |
772 | char _[13489]; |
773 | virtual ~A4() {} |
774 | |
775 | A1* getA1() {return A1::getA1();} |
776 | A2* getA2() {return A2::getA2();} |
777 | A4* getA4() {return this;} |
778 | }; |
779 | |
780 | struct A5 |
781 | : public A3, |
782 | public A4 |
783 | { |
784 | char _[41389]; |
785 | virtual ~A5() {} |
786 | |
787 | A1* getA14() {return A4::getA1();} |
788 | A1* getA13() {return A3::getA1();} |
789 | A2* getA2() {return A4::getA2();} |
790 | A3* getA3() {return A3::getA3();} |
791 | A4* getA4() {return A4::getA4();} |
792 | A5* getA5() {return this;} |
793 | }; |
794 | |
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]; |
886 | virtual ~A1() {} |
887 | |
888 | A1* getA1() {return this;} |
889 | }; |
890 | |
891 | struct A2 |
892 | { |
893 | char _[34981]; |
894 | virtual ~A2() {} |
895 | |
896 | A2* getA2() {return this;} |
897 | }; |
898 | |
899 | struct A3 |
900 | : public A1, |
901 | public virtual A2 |
902 | { |
903 | char _[93481]; |
904 | virtual ~A3() {} |
905 | |
906 | A1* getA1() {return A1::getA1();} |
907 | A2* getA2() {return A2::getA2();} |
908 | A3* getA3() {return this;} |
909 | }; |
910 | |
911 | struct A4 |
912 | : public A1, |
913 | protected virtual A2 |
914 | { |
915 | char _[13489]; |
916 | virtual ~A4() {} |
917 | |
918 | A1* getA1() {return A1::getA1();} |
919 | A2* getA2() {return A2::getA2();} |
920 | A4* getA4() {return this;} |
921 | }; |
922 | |
923 | struct A5 |
924 | : public A3, |
925 | public A4 |
926 | { |
927 | char _[41389]; |
928 | virtual ~A5() {} |
929 | |
930 | A1* getA14() {return A4::getA1();} |
931 | A1* getA13() {return A3::getA1();} |
932 | A2* getA2() {return A4::getA2();} |
933 | A3* getA3() {return A3::getA3();} |
934 | A4* getA4() {return A4::getA4();} |
935 | A5* getA5() {return this;} |
936 | }; |
937 | |
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]; |
1029 | virtual ~A1() {} |
1030 | |
1031 | A1* getA1() {return this;} |
1032 | }; |
1033 | |
1034 | struct A2 |
1035 | { |
1036 | char _[34981]; |
1037 | virtual ~A2() {} |
1038 | |
1039 | A2* getA2() {return this;} |
1040 | }; |
1041 | |
1042 | struct A3 |
1043 | : public A1, |
1044 | public virtual A2 |
1045 | { |
1046 | char _[93481]; |
1047 | virtual ~A3() {} |
1048 | |
1049 | A1* getA1() {return A1::getA1();} |
1050 | A2* getA2() {return A2::getA2();} |
1051 | A3* getA3() {return this;} |
1052 | }; |
1053 | |
1054 | struct A4 |
1055 | : public A1, |
1056 | public virtual A2 |
1057 | { |
1058 | char _[13489]; |
1059 | virtual ~A4() {} |
1060 | |
1061 | A1* getA1() {return A1::getA1();} |
1062 | A2* getA2() {return A2::getA2();} |
1063 | A4* getA4() {return this;} |
1064 | }; |
1065 | |
1066 | struct A5 |
1067 | : protected A3, |
1068 | public A4 |
1069 | { |
1070 | char _[41389]; |
1071 | virtual ~A5() {} |
1072 | |
1073 | A1* getA14() {return A4::getA1();} |
1074 | A1* getA13() {return A3::getA1();} |
1075 | A2* getA2() {return A4::getA2();} |
1076 | A3* getA3() {return A3::getA3();} |
1077 | A4* getA4() {return A4::getA4();} |
1078 | A5* getA5() {return this;} |
1079 | }; |
1080 | |
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]; |
1172 | virtual ~A1() {} |
1173 | |
1174 | A1* getA1() {return this;} |
1175 | }; |
1176 | |
1177 | struct A2 |
1178 | { |
1179 | char _[34981]; |
1180 | virtual ~A2() {} |
1181 | |
1182 | A2* getA2() {return this;} |
1183 | }; |
1184 | |
1185 | struct A3 |
1186 | : public A1, |
1187 | public virtual A2 |
1188 | { |
1189 | char _[93481]; |
1190 | virtual ~A3() {} |
1191 | |
1192 | A1* getA1() {return A1::getA1();} |
1193 | A2* getA2() {return A2::getA2();} |
1194 | A3* getA3() {return this;} |
1195 | }; |
1196 | |
1197 | struct A4 |
1198 | : public A1, |
1199 | public virtual A2 |
1200 | { |
1201 | char _[13489]; |
1202 | virtual ~A4() {} |
1203 | |
1204 | A1* getA1() {return A1::getA1();} |
1205 | A2* getA2() {return A2::getA2();} |
1206 | A4* getA4() {return this;} |
1207 | }; |
1208 | |
1209 | struct A5 |
1210 | : public A3, |
1211 | protected A4 |
1212 | { |
1213 | char _[41389]; |
1214 | virtual ~A5() {} |
1215 | |
1216 | A1* getA14() {return A4::getA1();} |
1217 | A1* getA13() {return A3::getA1();} |
1218 | A2* getA2() {return A4::getA2();} |
1219 | A3* getA3() {return A3::getA3();} |
1220 | A4* getA4() {return A4::getA4();} |
1221 | A5* getA5() {return this;} |
1222 | }; |
1223 | |
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 | |
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 | |