1 // { dg-do run } 2 // Testcase for tricky dynamic cast situations. 3 4 struct A { fA5 virtual void f () { } 6 }; 7 8 struct B : public A { }; 9 struct C : public B { }; 10 struct D : public B { }; 11 struct E : public C, public D { }; 12 13 struct B2 : public virtual A { }; 14 struct C2 : public B2 { }; 15 struct D2 : public B2 { }; 16 struct E2 : public C2, public D2 { }; 17 main()18int main () 19 { 20 E e; 21 E2 e2; 22 23 A* ap = (C*)&e; 24 25 // ap points to base subobject of unique B; succeeds 26 if (dynamic_cast <B*> (ap) == 0) 27 return 1; 28 29 ap = (C2*)&e2; 30 // ap points to base subobject shared by two Bs; fails 31 if (dynamic_cast <B2*> (ap) != 0) 32 return 2; 33 } 34