llvm-project

Форк
0
/
dynamic_cast5.pass.cpp 
1324 строки · 42.9 Кб
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

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.