1#include "../src/typeinfo.h" 2#include "test.h" 3#include <stdio.h> 4 5struct Virt1; 6struct Virt2; 7struct Diamond; 8struct Virt1a; 9struct Virt2a; 10struct Diamond2; 11 12struct Root 13{ 14 int test; 15 void * foo; 16 virtual Virt1 *as_v1() { return 0; } 17 virtual Virt2 *as_v2() { return 0; } 18 virtual Diamond *as_diamond() { return 0; } 19 virtual Virt1a *as_v1a() { return 0; } 20 virtual Virt2a *as_v2a() { return 0; } 21 virtual Diamond2 *as_diamond2() { return 0; } 22}; 23 24struct Sub1 : public Root 25{ 26 double a; 27}; 28 29struct Sub2 : public Sub1 30{ 31 float ignored; 32}; 33 34struct Virt1a : public virtual Root 35{ 36 int b; 37 virtual Virt1a *as_v1a() { return this; } 38}; 39 40struct Virt2a : public virtual Root 41{ 42 int b; 43 virtual Virt2a *as_v2a() { return this; } 44}; 45 46struct Virt1 : public virtual Virt1a 47{ 48 double a; 49 virtual Virt1 *as_v1() { return this; } 50}; 51 52struct Virt2 : public virtual Virt2a 53{ 54 double b; 55 virtual Virt2 *as_v2() { return this; } 56}; 57 58struct Diamond : public virtual Virt1, public virtual Virt2 59{ 60 int c; 61 virtual Diamond *as_diamond() { return this; } 62}; 63 64struct Diamond2 : public virtual Virt1a, public virtual Virt2a 65{ 66 int c; 67 virtual Diamond2 *as_diamond2() { return this; } 68}; 69 70void test_type_info(void) 71{ 72 Sub2 sub2; 73 Root root; 74 Virt1 virt1; 75 Diamond diamond; 76 Root *b = &sub2; 77 Root *f = &sub2; 78 Root *s2 = &sub2; 79 Root *b2 = &root; 80 Root *v1 = &virt1; 81 Virt1 *d1 = ⋄ 82 Root *up = ⋄ 83 b->test = 12; 84 f->test = 12; 85 b2->test = 12; 86 s2->test = 12; 87 TEST(12 == b->test, "Setting field"); 88 b = dynamic_cast<Root*>(f); 89 90 TEST(12 == b->test, "Casting Sub1 to superclass"); 91 ((Sub1*)(s2))->a = 12; 92 TEST(12 == dynamic_cast<Sub1*>(s2)->a, "Casting Sub2 -> Sub1"); 93 94 v1->as_v1()->a = 12; 95 TEST(12 == dynamic_cast<Virt1*>(v1)->a, "Casting Root (Virt1) -> Virt1"); 96 97 d1->as_v1()->test = 12; 98 TEST(12 == d1->as_v2()->test, "Accessing virt2 via vtable method"); 99 TEST(12 == dynamic_cast<Virt2*>(d1)->test, "Casting diamond to virt2"); 100 TEST(12 == dynamic_cast<Diamond*>(d1)->test, "casting diamond to diamond"); 101 102 Diamond2 diamond2; 103 Root *d2 = &diamond2; 104 d2->test = 12; 105 TEST(12 == dynamic_cast<Diamond2*>(d2)->test, "Casting Diamond2 to Diamond2"); 106 TEST(12 == dynamic_cast<Virt2a*>(d2)->test, "Casting Diamond2 to Virt2a"); 107 TEST(&diamond == dynamic_cast<Diamond*>(up), "Downcasting root-pointer to diamond"); 108 TEST(0 == dynamic_cast<Diamond*>(&root), "Downcasting root to diamond"); 109 110 TEST(0 == dynamic_cast<Sub1*>(b2), "Casting Root to Sub1 (0 expected)"); 111} 112 113