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