| // { dg-do run } |
| // { dg-options "-frtti" } |
| // test of rtti of single inheritance and multiple inheritance with |
| // virtual functions |
| |
| #include <typeinfo> |
| |
| extern "C" { |
| int printf(const char *, ...); |
| void exit(int); |
| } |
| |
| class X { |
| public: |
| int xi; |
| virtual int f() {return 0;}; |
| }; |
| |
| class Y : public X { |
| short ys; |
| }; |
| |
| class Z : public Y { |
| int zi; |
| }; |
| |
| Z z; |
| Y y; |
| Y *yp = &z; |
| X *xp = &z; |
| Z *zp = &z; |
| |
| class A { |
| public: |
| int Ai; |
| virtual int a() {return 0;}; |
| }; |
| |
| class B { |
| public: |
| int Bi; |
| virtual int g() {return 0;}; |
| }; |
| |
| class D : public A, public B { |
| int Di; |
| }; |
| |
| /* |
| class E : public D, public B { |
| int Ei; |
| }; |
| */ |
| class E { |
| int Ei; |
| }; |
| |
| class F : public E, public D { |
| int Fi; |
| }; |
| |
| D d; |
| A *ap = &d; |
| B *bp = &d; |
| D *dp = &d; |
| F f; |
| A *aap = &f; |
| B *bbp = &f; |
| |
| void *vp = zp; |
| |
| void error (int i) |
| { |
| exit(i); |
| } |
| |
| int main () |
| { |
| if (typeid(z) != typeid(Z)) error(1); |
| if (typeid(*yp) != typeid(Z)) error(2); |
| if (typeid(*yp) != typeid(*zp)) error(3); |
| if (typeid(xp) == typeid(yp)) error(4); |
| |
| xp = (X *)&y; |
| if (typeid(*xp) == typeid(*yp)) error(5); |
| if (typeid(*xp) != typeid(Y)) error(6); |
| |
| if (typeid(*ap) != typeid(*bp)) error (31); |
| if (typeid(*ap) != typeid(D)) error(32); |
| vp = dp; |
| vp = dynamic_cast<void*> ((B *)vp); |
| if (dp != (D *)vp) error(35); |
| |
| dp = (D *)&f; |
| if (typeid(*aap) != typeid(*bbp)) error(37); |
| if (typeid(*dp) != typeid(*aap)) error(38); |
| } |