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