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