+++ /dev/null
-// Copyright (C) 2001 Free Software Foundation, Inc.
-// Contributed by Nathan Sidwell 9 Jun 2001 <nathan@codesourcery.com>
-
-// Bug 3089. We ICE'd in construction vtables.
-
-int failed;
-
-void fail (int val)
-{
- if (!failed)
- failed = val;
-}
-
-struct A
-{
- virtual ~A();
- A ();
- virtual void check (void *whole, void *base);
-};
-
-A::A ()
-{
- check (this, this);
-}
-A::~A ()
-{
- check (this, this);
-}
-
-void A::check (void *whole, void *base)
-{
- if (dynamic_cast <void *> (this) != whole)
- fail (1);
- else if (this != base)
- fail (2);
-}
-
-struct B
-{
- virtual ~B ();
- B ();
- virtual void check (void *whole, void *base);
-};
-
-B::B ()
-{
- check (this, this);
-}
-B::~B ()
-{
- check (this, this);
-}
-void B::check (void *whole, void *base)
-{
- if (dynamic_cast <void *> (this) != whole)
- fail (3);
- else if (this != base)
- fail (4);
-}
-
-struct C : virtual public B, virtual public A
-{
- virtual ~C ();
- C ();
- virtual void check (void *whole, void *base);
-};
-C::C ()
-{
- check (this, this);
-}
-C::~C ()
-{
- check (this, this);
-}
-void C::check (void *whole, void *base)
-{
- if (dynamic_cast <void *> (this) != whole)
- fail (5);
- else if (this != base)
- fail (6);
- A::check (whole, static_cast <A *> (this));
- B::check (whole, static_cast <B *> (this));
-}
-
-struct D : virtual public A
-{
- virtual ~D ();
- D ();
- virtual void check (void *whole, void *base);
-};
-D::D ()
-{
- check (this, this);
-}
-D::~D ()
-{
- check (this, this);
-}
-void D::check (void *whole, void *base)
-{
- if (dynamic_cast <void *> (this) != whole)
- fail (5);
- else if (this != base)
- fail (6);
- A::check (whole, static_cast <A *> (this));
-}
-
-struct E : virtual public C, virtual public D
-{
- virtual ~E ();
- E ();
- virtual void check (void *whole, void *base);
-};
-E::E ()
-{
- check (this, this);
-}
-E::~E ()
-{
- check (this, this);
-}
-void E::check (void *whole, void *base)
-{
- if (dynamic_cast <void *> (this) != whole)
- fail (5);
- else if (this != base)
- fail (6);
- C::check (whole, static_cast <C *> (this));
- D::check (whole, static_cast <D *> (this));
-}
-
-struct F : virtual public E
-{
- virtual ~F ();
- F ();
- virtual void check (void *whole, void *base);
-};
-F::F ()
-{
- check (this, this);
-}
-F::~F ()
-{
- check (this, this);
-}
-void F::check (void *whole, void *base)
-{
- if (dynamic_cast <void *> (this) != whole)
- fail (5);
- else if (this != base)
- fail (6);
- E::check (whole, static_cast <F *> (this));
-}
-
-int main ()
-{
- A a;
- B b;
- C c;
- D d;
- E e;
- F f;
-
- return failed;
-}