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