| // { dg-do run } |
| // { dg-options "-w" } |
| // test of rtti of single inheritance and multiple inheritance with |
| // virtual inheritance |
| // dynamic casting |
| |
| #include <typeinfo> |
| |
| extern "C" { |
| int printf(const char *, ...); |
| void exit(int); |
| } |
| |
| class X { |
| public: |
| int xi; |
| virtual int f() {}; |
| }; |
| |
| class Y : public virtual X { |
| short ys; |
| }; |
| |
| class Z : public virtual Y { |
| int zi; |
| }; |
| |
| Z z; |
| Y y; |
| Y *yp = &z; |
| X *xp = &z; |
| Z *zp = &z; |
| |
| class A { |
| public: |
| int Ai; |
| virtual int a() {}; |
| }; |
| |
| class B { |
| public: |
| int Bi; |
| virtual int g() {}; |
| }; |
| |
| class D : public virtual A, private B { |
| int Di; |
| }; |
| |
| class E : public virtual D, public B { |
| int Ei; |
| }; |
| |
| class F : public E, public virtual D { |
| int Fi; |
| }; |
| |
| D d; |
| A *ap = &d; |
| B *bp = (B *)&d; |
| F f; |
| F *fp = &f; |
| A *aap = &f; |
| D *dp = &f; |
| E *ep = &f; |
| B *bbp = (B *)dp; |
| |
| void *vp = zp; |
| |
| /* |
| void error (int i) |
| { |
| printf("FAIL\n"); |
| exit(i); |
| } |
| */ |
| |
| void error (int i) |
| { |
| exit(i); |
| } |
| |
| int main () |
| { |
| vp = (void *)0; |
| |
| vp = dynamic_cast<Y *> (&z); |
| if (vp == 0) error(11); |
| |
| vp = dynamic_cast<Z *> (yp); |
| if (vp == 0) error(11); |
| |
| vp = dynamic_cast<X *> (yp); |
| if (vp == 0) error(12); |
| |
| vp = dynamic_cast<D *> (dp); |
| if (vp != (void *)dp) error(21); |
| |
| // Ill-formed: dynamic_cast to private or ambiguous base |
| // vp = dynamic_cast<B *> (dp); |
| // if (vp == (void *)dp) error(21); |
| |
| // vp = dynamic_cast<B *> (fp); |
| // if (vp == (void *)bbp) error(22); |
| |
| vp = dynamic_cast<void *> (aap); |
| if (vp != (void *)fp) error(23); |
| |
| vp = dynamic_cast<B *> (aap); |
| if (vp == (void *)bbp) error(24); |
| |
| } |