dynamic_cast5.pass.cpp
1 //===------------------------- dynamic_cast5.cpp --------------------------===// 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 // XFAIL: gcc-7, gcc-8, gcc-9 10 11 #include <cassert> 12 #include "support/timer.h" 13 14 // This test explicitly tests dynamic cast with types that have inaccessible 15 // bases. 16 #if defined(__clang__) 17 # pragma clang diagnostic ignored "-Winaccessible-base" 18 #elif defined(__GNUC__) && (__GNUC__ >= 10) 19 # pragma GCC diagnostic ignored "-Winaccessible-base" 20 #endif 21 22 namespace t1 23 { 24 25 struct A1 26 { 27 char _[43981]; 28 virtual ~A1() {} 29 30 A1* getA1() {return this;} 31 }; 32 33 struct A2 34 { 35 char _[34981]; 36 virtual ~A2() {} 37 38 A2* getA2() {return this;} 39 }; 40 41 struct A3 42 : public virtual A1, 43 private A2 44 { 45 char _[93481]; 46 virtual ~A3() {} 47 48 A1* getA1() {return A1::getA1();} 49 A2* getA2() {return A2::getA2();} 50 A3* getA3() {return this;} 51 }; 52 53 struct A4 54 : public A3, 55 public A2 56 { 57 char _[13489]; 58 virtual ~A4() {} 59 60 t1::A1* getA1() {return A3::getA1();} 61 A2* getA2() {return A3::getA2();} 62 A3* getA3() {return A3::getA3();} 63 A4* getA4() {return this;} 64 }; 65 66 struct A5 67 : public A4, 68 public A3 69 { 70 char _[13489]; 71 virtual ~A5() {} 72 73 t1::A1* getA1() {return A4::getA1();} 74 A2* getA2() {return A4::getA2();} 75 A3* getA3() {return A4::getA3();} 76 A4* getA4() {return A4::getA4();} 77 A5* getA5() {return this;} 78 }; 79 80 void test() 81 { 82 A1 a1; 83 A2 a2; 84 A3 a3; 85 A4 a4; 86 A5 a5; 87 88 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); 89 assert(dynamic_cast<A1*>(a2.getA2()) == 0); 90 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); 91 assert(dynamic_cast<A1*>(a3.getA2()) == 0); 92 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); 93 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1()); 94 assert(dynamic_cast<A1*>(a4.getA2()) == 0); 95 assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1()); 96 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); 97 assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1()); 98 assert(dynamic_cast<A1*>(a5.getA2()) == 0); 99 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1()); 100 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1()); 101 assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1()); 102 103 assert(dynamic_cast<A2*>(a1.getA1()) == 0); 104 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); 105 assert(dynamic_cast<A2*>(a3.getA1()) == 0); 106 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); 107 // assert(dynamic_cast<A2*>(a3.getA3()) == 0); // cast to private base 108 assert(dynamic_cast<A2*>(a4.getA1()) == 0); 109 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2()); 110 // assert(dynamic_cast<A2*>(a4.getA3()) == 0); // cast to private base 111 // assert(dynamic_cast<A2*>(a4.getA4()) == 0); // cast to ambiguous base 112 assert(dynamic_cast<A2*>(a5.getA1()) == 0); 113 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2()); 114 // assert(dynamic_cast<A2*>(a5.getA3()) == 0); // cast to private base 115 // assert(dynamic_cast<A2*>(a5.getA4()) == 0); // cast to ambiguous base 116 // assert(dynamic_cast<A2*>(a5.getA5()) == 0); // cast to ambiguous base 117 118 assert(dynamic_cast<A3*>(a1.getA1()) == 0); 119 assert(dynamic_cast<A3*>(a2.getA2()) == 0); 120 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); 121 assert(dynamic_cast<A3*>(a3.getA2()) == 0); 122 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); 123 assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3()); 124 assert(dynamic_cast<A3*>(a4.getA2()) == 0); 125 assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3()); 126 assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3()); 127 assert(dynamic_cast<A3*>(a5.getA1()) == 0); 128 assert(dynamic_cast<A3*>(a5.getA2()) == 0); 129 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3()); 130 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3()); 131 // assert(dynamic_cast<A3*>(a5.getA5()) == 0); // cast to ambiguous base 132 133 assert(dynamic_cast<A4*>(a1.getA1()) == 0); 134 assert(dynamic_cast<A4*>(a2.getA2()) == 0); 135 assert(dynamic_cast<A4*>(a3.getA1()) == 0); 136 assert(dynamic_cast<A4*>(a3.getA2()) == 0); 137 assert(dynamic_cast<A4*>(a3.getA3()) == 0); 138 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4()); 139 assert(dynamic_cast<A4*>(a4.getA2()) == 0); 140 assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4()); 141 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4()); 142 assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4()); 143 assert(dynamic_cast<A4*>(a5.getA2()) == 0); 144 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4()); 145 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4()); 146 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); 147 148 assert(dynamic_cast<A5*>(a1.getA1()) == 0); 149 assert(dynamic_cast<A5*>(a2.getA2()) == 0); 150 assert(dynamic_cast<A5*>(a3.getA1()) == 0); 151 assert(dynamic_cast<A5*>(a3.getA2()) == 0); 152 assert(dynamic_cast<A5*>(a3.getA3()) == 0); 153 assert(dynamic_cast<A5*>(a4.getA1()) == 0); 154 assert(dynamic_cast<A5*>(a4.getA2()) == 0); 155 assert(dynamic_cast<A5*>(a4.getA3()) == 0); 156 assert(dynamic_cast<A5*>(a4.getA4()) == 0); 157 assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5()); 158 assert(dynamic_cast<A5*>(a5.getA2()) == 0); 159 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5()); 160 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5()); 161 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5()); 162 } 163 164 } // t1 165 166 namespace t2 167 { 168 169 struct A1 170 { 171 char _[43981]; 172 virtual ~A1() {} 173 174 A1* getA1() {return this;} 175 }; 176 177 struct A2 178 { 179 char _[34981]; 180 virtual ~A2() {} 181 182 A2* getA2() {return this;} 183 }; 184 185 struct A3 186 : public virtual A1, 187 public A2 188 { 189 char _[93481]; 190 virtual ~A3() {} 191 192 A1* getA1() {return A1::getA1();} 193 A2* getA2() {return A2::getA2();} 194 A3* getA3() {return this;} 195 }; 196 197 struct A4 198 : public A3, 199 public A2 200 { 201 char _[13489]; 202 virtual ~A4() {} 203 204 t2::A1* getA1() {return A3::getA1();} 205 A2* getA2() {return A3::getA2();} 206 A3* getA3() {return A3::getA3();} 207 A4* getA4() {return this;} 208 }; 209 210 struct A5 211 : public A4, 212 public A3 213 { 214 char _[13489]; 215 virtual ~A5() {} 216 217 t2::A1* getA1() {return A4::getA1();} 218 A2* getA2() {return A4::getA2();} 219 A3* getA3() {return A4::getA3();} 220 A4* getA4() {return A4::getA4();} 221 A5* getA5() {return this;} 222 }; 223 224 void test() 225 { 226 A1 a1; 227 A2 a2; 228 A3 a3; 229 A4 a4; 230 A5 a5; 231 232 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); 233 assert(dynamic_cast<A1*>(a2.getA2()) == 0); 234 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); 235 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); 236 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); 237 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1()); 238 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1()); 239 assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1()); 240 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); 241 assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1()); 242 assert(dynamic_cast<A1*>(a5.getA2()) == a5.getA1()); 243 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1()); 244 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1()); 245 assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1()); 246 247 assert(dynamic_cast<A2*>(a1.getA1()) == 0); 248 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); 249 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); 250 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); 251 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); 252 assert(dynamic_cast<A2*>(a4.getA1()) == 0); 253 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2()); 254 assert(dynamic_cast<A2*>(a4.getA3()) == a4.getA2()); 255 // assert(dynamic_cast<A2*>(a4.getA4()) == 0); // cast to ambiguous base 256 assert(dynamic_cast<A2*>(a5.getA1()) == 0); 257 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2()); 258 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); 259 // assert(dynamic_cast<A2*>(a5.getA4()) == 0); // cast to ambiguous base 260 // assert(dynamic_cast<A2*>(a5.getA5()) == 0); // cast to ambiguous base 261 262 assert(dynamic_cast<A3*>(a1.getA1()) == 0); 263 assert(dynamic_cast<A3*>(a2.getA2()) == 0); 264 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); 265 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); 266 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); 267 assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3()); 268 assert(dynamic_cast<A3*>(a4.getA2()) == a4.getA3()); 269 assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3()); 270 assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3()); 271 assert(dynamic_cast<A3*>(a5.getA1()) == 0); 272 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3()); 273 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3()); 274 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3()); 275 // assert(dynamic_cast<A3*>(a5.getA5()) == 0); // cast to ambiguous base 276 277 assert(dynamic_cast<A4*>(a1.getA1()) == 0); 278 assert(dynamic_cast<A4*>(a2.getA2()) == 0); 279 assert(dynamic_cast<A4*>(a3.getA1()) == 0); 280 assert(dynamic_cast<A4*>(a3.getA2()) == 0); 281 assert(dynamic_cast<A4*>(a3.getA3()) == 0); 282 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4()); 283 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4()); 284 assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4()); 285 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4()); 286 assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4()); 287 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4()); 288 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4()); 289 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4()); 290 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); 291 292 assert(dynamic_cast<A5*>(a1.getA1()) == 0); 293 assert(dynamic_cast<A5*>(a2.getA2()) == 0); 294 assert(dynamic_cast<A5*>(a3.getA1()) == 0); 295 assert(dynamic_cast<A5*>(a3.getA2()) == 0); 296 assert(dynamic_cast<A5*>(a3.getA3()) == 0); 297 assert(dynamic_cast<A5*>(a4.getA1()) == 0); 298 assert(dynamic_cast<A5*>(a4.getA2()) == 0); 299 assert(dynamic_cast<A5*>(a4.getA3()) == 0); 300 assert(dynamic_cast<A5*>(a4.getA4()) == 0); 301 assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5()); 302 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5()); 303 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5()); 304 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5()); 305 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5()); 306 } 307 308 } // t2 309 310 namespace t3 311 { 312 313 struct A1 314 { 315 char _[43981]; 316 virtual ~A1() {} 317 318 A1* getA1() {return this;} 319 }; 320 321 struct A2 322 { 323 char _[34981]; 324 virtual ~A2() {} 325 326 A2* getA2() {return this;} 327 }; 328 329 struct A3 330 : public A1, 331 public virtual A2 332 { 333 char _[93481]; 334 virtual ~A3() {} 335 336 A1* getA1() {return A1::getA1();} 337 A2* getA2() {return A2::getA2();} 338 A3* getA3() {return this;} 339 }; 340 341 struct A4 342 : public A1, 343 public virtual A2 344 { 345 char _[13489]; 346 virtual ~A4() {} 347 348 A1* getA1() {return A1::getA1();} 349 A2* getA2() {return A2::getA2();} 350 A4* getA4() {return this;} 351 }; 352 353 struct A5 354 : public A3, 355 public A4 356 { 357 char _[41389]; 358 virtual ~A5() {} 359 360 A1* getA14() {return A4::getA1();} 361 A1* getA13() {return A3::getA1();} 362 A2* getA2() {return A4::getA2();} 363 A3* getA3() {return A3::getA3();} 364 A4* getA4() {return A4::getA4();} 365 A5* getA5() {return this;} 366 }; 367 368 void test() 369 { 370 A1 a1; 371 A2 a2; 372 A3 a3; 373 A4 a4; 374 A5 a5; 375 376 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); 377 assert(dynamic_cast<A1*>(a2.getA2()) == 0); 378 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); 379 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); 380 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); 381 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1()); 382 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1()); 383 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); 384 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14()); 385 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13()); 386 assert(dynamic_cast<A1*>(a5.getA2()) == 0); 387 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13()); 388 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14()); 389 390 assert(dynamic_cast<A2*>(a1.getA1()) == 0); 391 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); 392 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); 393 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); 394 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); 395 assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2()); 396 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2()); 397 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2()); 398 assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2()); 399 assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2()); 400 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2()); 401 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); 402 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2()); 403 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2()); 404 405 assert(dynamic_cast<A3*>(a1.getA1()) == 0); 406 assert(dynamic_cast<A3*>(a2.getA2()) == 0); 407 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); 408 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); 409 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); 410 assert(dynamic_cast<A3*>(a4.getA1()) == 0); 411 assert(dynamic_cast<A3*>(a4.getA2()) == 0); 412 assert(dynamic_cast<A3*>(a4.getA4()) == 0); 413 assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3()); 414 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3()); 415 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3()); 416 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3()); 417 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3()); 418 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3()); 419 420 assert(dynamic_cast<A4*>(a1.getA1()) == 0); 421 assert(dynamic_cast<A4*>(a2.getA2()) == 0); 422 assert(dynamic_cast<A4*>(a3.getA1()) == 0); 423 assert(dynamic_cast<A4*>(a3.getA2()) == 0); 424 assert(dynamic_cast<A4*>(a3.getA3()) == 0); 425 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4()); 426 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4()); 427 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4()); 428 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4()); 429 assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4()); 430 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4()); 431 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4()); 432 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4()); 433 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); 434 435 assert(dynamic_cast<A5*>(a1.getA1()) == 0); 436 assert(dynamic_cast<A5*>(a2.getA2()) == 0); 437 assert(dynamic_cast<A5*>(a3.getA1()) == 0); 438 assert(dynamic_cast<A5*>(a3.getA2()) == 0); 439 assert(dynamic_cast<A5*>(a3.getA3()) == 0); 440 assert(dynamic_cast<A5*>(a4.getA1()) == 0); 441 assert(dynamic_cast<A5*>(a4.getA2()) == 0); 442 assert(dynamic_cast<A5*>(a4.getA4()) == 0); 443 assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5()); 444 assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5()); 445 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5()); 446 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5()); 447 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5()); 448 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5()); 449 } 450 451 } // t3 452 453 namespace t4 454 { 455 456 struct A1 457 { 458 char _[43981]; 459 virtual ~A1() {} 460 461 A1* getA1() {return this;} 462 }; 463 464 struct A2 465 { 466 char _[34981]; 467 virtual ~A2() {} 468 469 A2* getA2() {return this;} 470 }; 471 472 struct A3 473 : protected A1, 474 public virtual A2 475 { 476 char _[93481]; 477 virtual ~A3() {} 478 479 A1* getA1() {return A1::getA1();} 480 A2* getA2() {return A2::getA2();} 481 A3* getA3() {return this;} 482 }; 483 484 struct A4 485 : public A1, 486 public virtual A2 487 { 488 char _[13489]; 489 virtual ~A4() {} 490 491 A1* getA1() {return A1::getA1();} 492 A2* getA2() {return A2::getA2();} 493 A4* getA4() {return this;} 494 }; 495 496 struct A5 497 : public A3, 498 public A4 499 { 500 char _[41389]; 501 virtual ~A5() {} 502 503 A1* getA14() {return A4::getA1();} 504 A1* getA13() {return A3::getA1();} 505 A2* getA2() {return A4::getA2();} 506 A3* getA3() {return A3::getA3();} 507 A4* getA4() {return A4::getA4();} 508 A5* getA5() {return this;} 509 }; 510 511 void test() 512 { 513 A1 a1; 514 A2 a2; 515 A3 a3; 516 A4 a4; 517 A5 a5; 518 519 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); 520 assert(dynamic_cast<A1*>(a2.getA2()) == 0); 521 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); 522 assert(dynamic_cast<A1*>(a3.getA2()) == 0); 523 // assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); // cast to protected base 524 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1()); 525 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1()); 526 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); 527 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14()); 528 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13()); 529 assert(dynamic_cast<A1*>(a5.getA2()) == 0); 530 // assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13()); // cast to protected base 531 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14()); 532 533 assert(dynamic_cast<A2*>(a1.getA1()) == 0); 534 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); 535 assert(dynamic_cast<A2*>(a3.getA1()) == 0); 536 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); 537 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); 538 assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2()); 539 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2()); 540 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2()); 541 assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2()); 542 assert(dynamic_cast<A2*>(a5.getA13()) == 0); 543 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2()); 544 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); 545 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2()); 546 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2()); 547 548 assert(dynamic_cast<A3*>(a1.getA1()) == 0); 549 assert(dynamic_cast<A3*>(a2.getA2()) == 0); 550 assert(dynamic_cast<A3*>(a3.getA1()) == 0); 551 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); 552 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); 553 assert(dynamic_cast<A3*>(a4.getA1()) == 0); 554 assert(dynamic_cast<A3*>(a4.getA2()) == 0); 555 assert(dynamic_cast<A3*>(a4.getA4()) == 0); 556 assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3()); 557 assert(dynamic_cast<A3*>(a5.getA13()) == 0); 558 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3()); 559 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3()); 560 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3()); 561 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3()); 562 563 assert(dynamic_cast<A4*>(a1.getA1()) == 0); 564 assert(dynamic_cast<A4*>(a2.getA2()) == 0); 565 assert(dynamic_cast<A4*>(a3.getA1()) == 0); 566 assert(dynamic_cast<A4*>(a3.getA2()) == 0); 567 assert(dynamic_cast<A4*>(a3.getA3()) == 0); 568 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4()); 569 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4()); 570 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4()); 571 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4()); 572 assert(dynamic_cast<A4*>(a5.getA13()) == 0); 573 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4()); 574 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4()); 575 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4()); 576 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); 577 578 assert(dynamic_cast<A5*>(a1.getA1()) == 0); 579 assert(dynamic_cast<A5*>(a2.getA2()) == 0); 580 assert(dynamic_cast<A5*>(a3.getA1()) == 0); 581 assert(dynamic_cast<A5*>(a3.getA2()) == 0); 582 assert(dynamic_cast<A5*>(a3.getA3()) == 0); 583 assert(dynamic_cast<A5*>(a4.getA1()) == 0); 584 assert(dynamic_cast<A5*>(a4.getA2()) == 0); 585 assert(dynamic_cast<A5*>(a4.getA4()) == 0); 586 assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5()); 587 assert(dynamic_cast<A5*>(a5.getA13()) == 0); 588 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5()); 589 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5()); 590 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5()); 591 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5()); 592 } 593 594 } // t4 595 596 namespace t5 597 { 598 599 struct A1 600 { 601 char _[43981]; 602 virtual ~A1() {} 603 604 A1* getA1() {return this;} 605 }; 606 607 struct A2 608 { 609 char _[34981]; 610 virtual ~A2() {} 611 612 A2* getA2() {return this;} 613 }; 614 615 struct A3 616 : public A1, 617 protected virtual A2 618 { 619 char _[93481]; 620 virtual ~A3() {} 621 622 A1* getA1() {return A1::getA1();} 623 A2* getA2() {return A2::getA2();} 624 A3* getA3() {return this;} 625 }; 626 627 struct A4 628 : public A1, 629 public virtual A2 630 { 631 char _[13489]; 632 virtual ~A4() {} 633 634 A1* getA1() {return A1::getA1();} 635 A2* getA2() {return A2::getA2();} 636 A4* getA4() {return this;} 637 }; 638 639 struct A5 640 : public A3, 641 public A4 642 { 643 char _[41389]; 644 virtual ~A5() {} 645 646 A1* getA14() {return A4::getA1();} 647 A1* getA13() {return A3::getA1();} 648 A2* getA2() {return A4::getA2();} 649 A3* getA3() {return A3::getA3();} 650 A4* getA4() {return A4::getA4();} 651 A5* getA5() {return this;} 652 }; 653 654 void test() 655 { 656 A1 a1; 657 A2 a2; 658 A3 a3; 659 A4 a4; 660 A5 a5; 661 662 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); 663 assert(dynamic_cast<A1*>(a2.getA2()) == 0); 664 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); 665 assert(dynamic_cast<A1*>(a3.getA2()) == 0); 666 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); 667 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1()); 668 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1()); 669 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); 670 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14()); 671 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13()); 672 assert(dynamic_cast<A1*>(a5.getA2()) == 0); 673 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13()); 674 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14()); 675 676 assert(dynamic_cast<A2*>(a1.getA1()) == 0); 677 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); 678 assert(dynamic_cast<A2*>(a3.getA1()) == 0); 679 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); 680 // assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); // cast to protected base 681 assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2()); 682 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2()); 683 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2()); 684 assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2()); 685 assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2()); 686 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2()); 687 // assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); // cast to protected base 688 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2()); 689 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2()); 690 691 assert(dynamic_cast<A3*>(a1.getA1()) == 0); 692 assert(dynamic_cast<A3*>(a2.getA2()) == 0); 693 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); 694 assert(dynamic_cast<A3*>(a3.getA2()) == 0); 695 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); 696 assert(dynamic_cast<A3*>(a4.getA1()) == 0); 697 assert(dynamic_cast<A3*>(a4.getA2()) == 0); 698 assert(dynamic_cast<A3*>(a4.getA4()) == 0); 699 assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3()); 700 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3()); 701 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3()); 702 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3()); 703 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3()); 704 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3()); 705 706 assert(dynamic_cast<A4*>(a1.getA1()) == 0); 707 assert(dynamic_cast<A4*>(a2.getA2()) == 0); 708 assert(dynamic_cast<A4*>(a3.getA1()) == 0); 709 assert(dynamic_cast<A4*>(a3.getA2()) == 0); 710 assert(dynamic_cast<A4*>(a3.getA3()) == 0); 711 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4()); 712 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4()); 713 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4()); 714 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4()); 715 assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4()); 716 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4()); 717 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4()); 718 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4()); 719 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); 720 721 assert(dynamic_cast<A5*>(a1.getA1()) == 0); 722 assert(dynamic_cast<A5*>(a2.getA2()) == 0); 723 assert(dynamic_cast<A5*>(a3.getA1()) == 0); 724 assert(dynamic_cast<A5*>(a3.getA2()) == 0); 725 assert(dynamic_cast<A5*>(a3.getA3()) == 0); 726 assert(dynamic_cast<A5*>(a4.getA1()) == 0); 727 assert(dynamic_cast<A5*>(a4.getA2()) == 0); 728 assert(dynamic_cast<A5*>(a4.getA4()) == 0); 729 assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5()); 730 assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5()); 731 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5()); 732 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5()); 733 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5()); 734 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5()); 735 } 736 737 } // t5 738 739 namespace t6 740 { 741 742 struct A1 743 { 744 char _[43981]; 745 virtual ~A1() {} 746 747 A1* getA1() {return this;} 748 }; 749 750 struct A2 751 { 752 char _[34981]; 753 virtual ~A2() {} 754 755 A2* getA2() {return this;} 756 }; 757 758 struct A3 759 : public A1, 760 public virtual A2 761 { 762 char _[93481]; 763 virtual ~A3() {} 764 765 A1* getA1() {return A1::getA1();} 766 A2* getA2() {return A2::getA2();} 767 A3* getA3() {return this;} 768 }; 769 770 struct A4 771 : protected A1, 772 public virtual A2 773 { 774 char _[13489]; 775 virtual ~A4() {} 776 777 A1* getA1() {return A1::getA1();} 778 A2* getA2() {return A2::getA2();} 779 A4* getA4() {return this;} 780 }; 781 782 struct A5 783 : public A3, 784 public A4 785 { 786 char _[41389]; 787 virtual ~A5() {} 788 789 A1* getA14() {return A4::getA1();} 790 A1* getA13() {return A3::getA1();} 791 A2* getA2() {return A4::getA2();} 792 A3* getA3() {return A3::getA3();} 793 A4* getA4() {return A4::getA4();} 794 A5* getA5() {return this;} 795 }; 796 797 void test() 798 { 799 A1 a1; 800 A2 a2; 801 A3 a3; 802 A4 a4; 803 A5 a5; 804 805 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); 806 assert(dynamic_cast<A1*>(a2.getA2()) == 0); 807 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); 808 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); 809 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); 810 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1()); 811 assert(dynamic_cast<A1*>(a4.getA2()) == 0); 812 // assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); // cast to protected base 813 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14()); 814 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13()); 815 assert(dynamic_cast<A1*>(a5.getA2()) == 0); 816 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13()); 817 // assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14()); // cast to protected base 818 819 assert(dynamic_cast<A2*>(a1.getA1()) == 0); 820 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); 821 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); 822 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); 823 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); 824 assert(dynamic_cast<A2*>(a4.getA1()) == 0); 825 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2()); 826 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2()); 827 assert(dynamic_cast<A2*>(a5.getA14()) == 0); 828 assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2()); 829 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2()); 830 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); 831 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2()); 832 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2()); 833 834 assert(dynamic_cast<A3*>(a1.getA1()) == 0); 835 assert(dynamic_cast<A3*>(a2.getA2()) == 0); 836 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); 837 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); 838 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); 839 assert(dynamic_cast<A3*>(a4.getA1()) == 0); 840 assert(dynamic_cast<A3*>(a4.getA2()) == 0); 841 assert(dynamic_cast<A3*>(a4.getA4()) == 0); 842 assert(dynamic_cast<A3*>(a5.getA14()) == 0); 843 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3()); 844 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3()); 845 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3()); 846 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3()); 847 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3()); 848 849 assert(dynamic_cast<A4*>(a1.getA1()) == 0); 850 assert(dynamic_cast<A4*>(a2.getA2()) == 0); 851 assert(dynamic_cast<A4*>(a3.getA1()) == 0); 852 assert(dynamic_cast<A4*>(a3.getA2()) == 0); 853 assert(dynamic_cast<A4*>(a3.getA3()) == 0); 854 assert(dynamic_cast<A4*>(a4.getA1()) == 0); 855 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4()); 856 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4()); 857 assert(dynamic_cast<A4*>(a5.getA14()) == 0); 858 assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4()); 859 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4()); 860 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4()); 861 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4()); 862 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); 863 864 assert(dynamic_cast<A5*>(a1.getA1()) == 0); 865 assert(dynamic_cast<A5*>(a2.getA2()) == 0); 866 assert(dynamic_cast<A5*>(a3.getA1()) == 0); 867 assert(dynamic_cast<A5*>(a3.getA2()) == 0); 868 assert(dynamic_cast<A5*>(a3.getA3()) == 0); 869 assert(dynamic_cast<A5*>(a4.getA1()) == 0); 870 assert(dynamic_cast<A5*>(a4.getA2()) == 0); 871 assert(dynamic_cast<A5*>(a4.getA4()) == 0); 872 assert(dynamic_cast<A5*>(a5.getA14()) == 0); 873 assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5()); 874 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5()); 875 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5()); 876 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5()); 877 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5()); 878 } 879 880 } // t6 881 882 namespace t7 883 { 884 885 struct A1 886 { 887 char _[43981]; 888 virtual ~A1() {} 889 890 A1* getA1() {return this;} 891 }; 892 893 struct A2 894 { 895 char _[34981]; 896 virtual ~A2() {} 897 898 A2* getA2() {return this;} 899 }; 900 901 struct A3 902 : public A1, 903 public virtual A2 904 { 905 char _[93481]; 906 virtual ~A3() {} 907 908 A1* getA1() {return A1::getA1();} 909 A2* getA2() {return A2::getA2();} 910 A3* getA3() {return this;} 911 }; 912 913 struct A4 914 : public A1, 915 protected virtual A2 916 { 917 char _[13489]; 918 virtual ~A4() {} 919 920 A1* getA1() {return A1::getA1();} 921 A2* getA2() {return A2::getA2();} 922 A4* getA4() {return this;} 923 }; 924 925 struct A5 926 : public A3, 927 public A4 928 { 929 char _[41389]; 930 virtual ~A5() {} 931 932 A1* getA14() {return A4::getA1();} 933 A1* getA13() {return A3::getA1();} 934 A2* getA2() {return A4::getA2();} 935 A3* getA3() {return A3::getA3();} 936 A4* getA4() {return A4::getA4();} 937 A5* getA5() {return this;} 938 }; 939 940 void test() 941 { 942 A1 a1; 943 A2 a2; 944 A3 a3; 945 A4 a4; 946 A5 a5; 947 948 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); 949 assert(dynamic_cast<A1*>(a2.getA2()) == 0); 950 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); 951 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); 952 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); 953 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1()); 954 assert(dynamic_cast<A1*>(a4.getA2()) == 0); 955 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); 956 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14()); 957 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13()); 958 assert(dynamic_cast<A1*>(a5.getA2()) == 0); 959 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13()); 960 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14()); 961 962 assert(dynamic_cast<A2*>(a1.getA1()) == 0); 963 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); 964 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); 965 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); 966 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); 967 assert(dynamic_cast<A2*>(a4.getA1()) == 0); 968 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2()); 969 // assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2()); // cast to protected base 970 assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2()); 971 assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2()); 972 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2()); 973 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); 974 // assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2()); // cast to protected base 975 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2()); 976 977 assert(dynamic_cast<A3*>(a1.getA1()) == 0); 978 assert(dynamic_cast<A3*>(a2.getA2()) == 0); 979 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); 980 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); 981 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); 982 assert(dynamic_cast<A3*>(a4.getA1()) == 0); 983 assert(dynamic_cast<A3*>(a4.getA2()) == 0); 984 assert(dynamic_cast<A3*>(a4.getA4()) == 0); 985 assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3()); 986 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3()); 987 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3()); 988 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3()); 989 assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3()); 990 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3()); 991 992 assert(dynamic_cast<A4*>(a1.getA1()) == 0); 993 assert(dynamic_cast<A4*>(a2.getA2()) == 0); 994 assert(dynamic_cast<A4*>(a3.getA1()) == 0); 995 assert(dynamic_cast<A4*>(a3.getA2()) == 0); 996 assert(dynamic_cast<A4*>(a3.getA3()) == 0); 997 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4()); 998 assert(dynamic_cast<A4*>(a4.getA2()) == 0); 999 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4()); 1000 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4()); 1001 assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4()); 1002 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4()); 1003 assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4()); 1004 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4()); 1005 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); 1006 1007 assert(dynamic_cast<A5*>(a1.getA1()) == 0); 1008 assert(dynamic_cast<A5*>(a2.getA2()) == 0); 1009 assert(dynamic_cast<A5*>(a3.getA1()) == 0); 1010 assert(dynamic_cast<A5*>(a3.getA2()) == 0); 1011 assert(dynamic_cast<A5*>(a3.getA3()) == 0); 1012 assert(dynamic_cast<A5*>(a4.getA1()) == 0); 1013 assert(dynamic_cast<A5*>(a4.getA2()) == 0); 1014 assert(dynamic_cast<A5*>(a4.getA4()) == 0); 1015 assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5()); 1016 assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5()); 1017 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5()); 1018 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5()); 1019 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5()); 1020 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5()); 1021 } 1022 1023 } // t7 1024 1025 namespace t8 1026 { 1027 1028 struct A1 1029 { 1030 char _[43981]; 1031 virtual ~A1() {} 1032 1033 A1* getA1() {return this;} 1034 }; 1035 1036 struct A2 1037 { 1038 char _[34981]; 1039 virtual ~A2() {} 1040 1041 A2* getA2() {return this;} 1042 }; 1043 1044 struct A3 1045 : public A1, 1046 public virtual A2 1047 { 1048 char _[93481]; 1049 virtual ~A3() {} 1050 1051 A1* getA1() {return A1::getA1();} 1052 A2* getA2() {return A2::getA2();} 1053 A3* getA3() {return this;} 1054 }; 1055 1056 struct A4 1057 : public A1, 1058 public virtual A2 1059 { 1060 char _[13489]; 1061 virtual ~A4() {} 1062 1063 A1* getA1() {return A1::getA1();} 1064 A2* getA2() {return A2::getA2();} 1065 A4* getA4() {return this;} 1066 }; 1067 1068 struct A5 1069 : protected A3, 1070 public A4 1071 { 1072 char _[41389]; 1073 virtual ~A5() {} 1074 1075 A1* getA14() {return A4::getA1();} 1076 A1* getA13() {return A3::getA1();} 1077 A2* getA2() {return A4::getA2();} 1078 A3* getA3() {return A3::getA3();} 1079 A4* getA4() {return A4::getA4();} 1080 A5* getA5() {return this;} 1081 }; 1082 1083 void test() 1084 { 1085 A1 a1; 1086 A2 a2; 1087 A3 a3; 1088 A4 a4; 1089 A5 a5; 1090 1091 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); 1092 assert(dynamic_cast<A1*>(a2.getA2()) == 0); 1093 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); 1094 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); 1095 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); 1096 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1()); 1097 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1()); 1098 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); 1099 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14()); 1100 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13()); 1101 assert(dynamic_cast<A1*>(a5.getA2()) == 0); 1102 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13()); 1103 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14()); 1104 1105 assert(dynamic_cast<A2*>(a1.getA1()) == 0); 1106 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); 1107 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); 1108 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); 1109 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); 1110 assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2()); 1111 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2()); 1112 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2()); 1113 assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2()); 1114 assert(dynamic_cast<A2*>(a5.getA13()) == 0); 1115 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2()); 1116 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); 1117 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2()); 1118 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2()); 1119 1120 assert(dynamic_cast<A3*>(a1.getA1()) == 0); 1121 assert(dynamic_cast<A3*>(a2.getA2()) == 0); 1122 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); 1123 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); 1124 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); 1125 assert(dynamic_cast<A3*>(a4.getA1()) == 0); 1126 assert(dynamic_cast<A3*>(a4.getA2()) == 0); 1127 assert(dynamic_cast<A3*>(a4.getA4()) == 0); 1128 assert(dynamic_cast<A3*>(a5.getA14()) == 0); 1129 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3()); 1130 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3()); 1131 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3()); 1132 assert(dynamic_cast<A3*>(a5.getA4()) == 0); 1133 // assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3()); // cast to protected base 1134 1135 assert(dynamic_cast<A4*>(a1.getA1()) == 0); 1136 assert(dynamic_cast<A4*>(a2.getA2()) == 0); 1137 assert(dynamic_cast<A4*>(a3.getA1()) == 0); 1138 assert(dynamic_cast<A4*>(a3.getA2()) == 0); 1139 assert(dynamic_cast<A4*>(a3.getA3()) == 0); 1140 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4()); 1141 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4()); 1142 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4()); 1143 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4()); 1144 assert(dynamic_cast<A4*>(a5.getA13()) == 0); 1145 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4()); 1146 assert(dynamic_cast<A4*>(a5.getA3()) == 0); 1147 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4()); 1148 assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); 1149 1150 assert(dynamic_cast<A5*>(a1.getA1()) == 0); 1151 assert(dynamic_cast<A5*>(a2.getA2()) == 0); 1152 assert(dynamic_cast<A5*>(a3.getA1()) == 0); 1153 assert(dynamic_cast<A5*>(a3.getA2()) == 0); 1154 assert(dynamic_cast<A5*>(a3.getA3()) == 0); 1155 assert(dynamic_cast<A5*>(a4.getA1()) == 0); 1156 assert(dynamic_cast<A5*>(a4.getA2()) == 0); 1157 assert(dynamic_cast<A5*>(a4.getA4()) == 0); 1158 assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5()); 1159 assert(dynamic_cast<A5*>(a5.getA13()) == 0); 1160 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5()); 1161 assert(dynamic_cast<A5*>(a5.getA3()) == 0); 1162 assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5()); 1163 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5()); 1164 } 1165 1166 } // t8 1167 1168 namespace t9 1169 { 1170 1171 struct A1 1172 { 1173 char _[43981]; 1174 virtual ~A1() {} 1175 1176 A1* getA1() {return this;} 1177 }; 1178 1179 struct A2 1180 { 1181 char _[34981]; 1182 virtual ~A2() {} 1183 1184 A2* getA2() {return this;} 1185 }; 1186 1187 struct A3 1188 : public A1, 1189 public virtual A2 1190 { 1191 char _[93481]; 1192 virtual ~A3() {} 1193 1194 A1* getA1() {return A1::getA1();} 1195 A2* getA2() {return A2::getA2();} 1196 A3* getA3() {return this;} 1197 }; 1198 1199 struct A4 1200 : public A1, 1201 public virtual A2 1202 { 1203 char _[13489]; 1204 virtual ~A4() {} 1205 1206 A1* getA1() {return A1::getA1();} 1207 A2* getA2() {return A2::getA2();} 1208 A4* getA4() {return this;} 1209 }; 1210 1211 struct A5 1212 : public A3, 1213 protected A4 1214 { 1215 char _[41389]; 1216 virtual ~A5() {} 1217 1218 A1* getA14() {return A4::getA1();} 1219 A1* getA13() {return A3::getA1();} 1220 A2* getA2() {return A4::getA2();} 1221 A3* getA3() {return A3::getA3();} 1222 A4* getA4() {return A4::getA4();} 1223 A5* getA5() {return this;} 1224 }; 1225 1226 void test() 1227 { 1228 A1 a1; 1229 A2 a2; 1230 A3 a3; 1231 A4 a4; 1232 A5 a5; 1233 1234 assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1()); 1235 assert(dynamic_cast<A1*>(a2.getA2()) == 0); 1236 assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1()); 1237 assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1()); 1238 assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); 1239 assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1()); 1240 assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1()); 1241 assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); 1242 assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14()); 1243 assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13()); 1244 assert(dynamic_cast<A1*>(a5.getA2()) == 0); 1245 assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13()); 1246 assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14()); 1247 1248 assert(dynamic_cast<A2*>(a1.getA1()) == 0); 1249 assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2()); 1250 assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2()); 1251 assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2()); 1252 assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); 1253 assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2()); 1254 assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2()); 1255 assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2()); 1256 assert(dynamic_cast<A2*>(a5.getA14()) == 0); 1257 assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2()); 1258 assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2()); 1259 assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); 1260 assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2()); 1261 assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2()); 1262 1263 assert(dynamic_cast<A3*>(a1.getA1()) == 0); 1264 assert(dynamic_cast<A3*>(a2.getA2()) == 0); 1265 assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3()); 1266 assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3()); 1267 assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3()); 1268 assert(dynamic_cast<A3*>(a4.getA1()) == 0); 1269 assert(dynamic_cast<A3*>(a4.getA2()) == 0); 1270 assert(dynamic_cast<A3*>(a4.getA4()) == 0); 1271 assert(dynamic_cast<A3*>(a5.getA14()) == 0); 1272 assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3()); 1273 assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3()); 1274 assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3()); 1275 assert(dynamic_cast<A3*>(a5.getA4()) == 0); 1276 assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3()); 1277 1278 assert(dynamic_cast<A4*>(a1.getA1()) == 0); 1279 assert(dynamic_cast<A4*>(a2.getA2()) == 0); 1280 assert(dynamic_cast<A4*>(a3.getA1()) == 0); 1281 assert(dynamic_cast<A4*>(a3.getA2()) == 0); 1282 assert(dynamic_cast<A4*>(a3.getA3()) == 0); 1283 assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4()); 1284 assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4()); 1285 assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4()); 1286 assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4()); 1287 assert(dynamic_cast<A4*>(a5.getA13()) == 0); 1288 assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4()); 1289 assert(dynamic_cast<A4*>(a5.getA3()) == 0); 1290 assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4()); 1291 // assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); // cast to protected base 1292 1293 assert(dynamic_cast<A5*>(a1.getA1()) == 0); 1294 assert(dynamic_cast<A5*>(a2.getA2()) == 0); 1295 assert(dynamic_cast<A5*>(a3.getA1()) == 0); 1296 assert(dynamic_cast<A5*>(a3.getA2()) == 0); 1297 assert(dynamic_cast<A5*>(a3.getA3()) == 0); 1298 assert(dynamic_cast<A5*>(a4.getA1()) == 0); 1299 assert(dynamic_cast<A5*>(a4.getA2()) == 0); 1300 assert(dynamic_cast<A5*>(a4.getA4()) == 0); 1301 assert(dynamic_cast<A5*>(a5.getA14()) == 0); 1302 assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5()); 1303 assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5()); 1304 assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5()); 1305 assert(dynamic_cast<A5*>(a5.getA4()) == 0); 1306 assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5()); 1307 } 1308 1309 } // t9 1310 1311 1312 int main(int, char**) 1313 { 1314 timer t; 1315 t1::test(); 1316 t2::test(); 1317 t3::test(); 1318 t4::test(); 1319 t5::test(); 1320 t6::test(); 1321 t7::test(); 1322 t8::test(); 1323 t9::test(); 1324 1325 return 0; 1326 }