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()18 int 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