2 // Author: Alfred Miniarik <a8601248@unet.univie.ac.at>
3 // test of dynamic_cast
4 // runtime detecting of valid
5 // downcasts within nonpublic
8 extern "C" void abort();
9 extern "C" int printf (const char *, ...);
11 static int errors = 0;
15 printf("Error %i\n",i);
20 // 1.1 single inheritance case
22 struct A {virtual ~A(){} int i;};
23 struct B : A {int i;};
24 struct C : B {int i;};
28 struct E : D {int i;};
35 if((C*)&d != dynamic_cast<C*> ((A*)&d)) error(1);
36 if((C*)&d != dynamic_cast<C*> ((B*)&d)) error(2);
37 if((B*)&d != dynamic_cast<B*> ((A*)&d)) error(3);
40 if((C*)&e != dynamic_cast<C*> ((A*)&e)) error(4);
43 if((C*)&f != dynamic_cast<C*> ((B*)&f)) error(5);
44 if((B*)&f != dynamic_cast<B*> ((A*)&f)) error(6);
45 if((E*)&f != dynamic_cast<E*> ((D*)&f)) error(7);
46 if(dynamic_cast<E*> ((C*)&f)) error(8); //counter example
49 // 1.2 multiple inheritance case
57 if((B*)(F*)&g != dynamic_cast<B*> ((A*)(F*)&g)) error(9);
58 if(dynamic_cast<D*> ((A*)(F*)&g)) error(10);
59 if(dynamic_cast<G*> ((B*)(F*)&g)) error(11);
62 // 2. crosscast (always fail)
73 if(dynamic_cast<J*> ((I*)&l)) error(12);
74 if(dynamic_cast<J*> ((E*)&l)) error(13);
75 if(dynamic_cast<I*> ((J*)&l)) error(14);
84 return errors ? 1 : 0;