OSDN Git Service

Add NIOS2 support. Code from SourceyG++.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.abi / vtable3.h
1 // Copyright (C) 2000 Free Software Foundation, Inc.
2 // Contributed by Nathan Sidwell 4 February 2001 <nathan@codesourcery.com>
3
4 // Check constructor vtables work. This is included from numerous test
5 // files, which set the #defines necessary to specify the hierarchy.
6
7 #include <typeinfo>
8 #include <stdio.h>
9
10 int fail;
11 struct A;
12
13 template <typename BASE, typename DERIVED>
14 int Test (DERIVED *d, int expect)
15 {
16   BASE *b = static_cast <BASE *> (d);
17   void *full_b = dynamic_cast <void *> (b);
18   void *full_d = dynamic_cast <void *> (d);
19   A *ap = static_cast <A *> (b);
20   
21   if (full_b != full_d)
22     {
23       fail++;
24       fprintf (stderr, "base %s and derived %s have different full objects\n",
25               typeid (BASE).name (), typeid (DERIVED).name ());
26       return 1;
27     }
28
29   DERIVED *dynamic_d = dynamic_cast <DERIVED *> (b);
30   
31   if (dynamic_d != d)
32     {
33       fail++;
34       fprintf (stderr, "dynamic_cast from %s to %s failed\n",
35               typeid (BASE).name (), typeid (DERIVED).name ());
36       return 1;
37     }
38
39   b->Baz (static_cast <void *> (ap));
40   
41   int res = b->Foo (static_cast <void *> (d));
42   
43   if (res != expect)
44     {
45       fail++;
46       fprintf (stderr, "%s::Foo returned %d, expected %d\n",
47               typeid (BASE).name (), res, expect);
48       return 1;
49     }
50
51   return 0;
52 }
53
54 template <typename T>
55 int Test (T *self, void *expected, int result)
56 {
57   if (self != expected)
58     {
59       fail++;
60       fprintf (stderr, "%s::Foo wrong this pointer\n", typeid (T).name ());
61     }
62   return result;
63 }
64
65 struct A {
66 #ifndef A_EMPTY
67   int a_m;
68 #endif
69   virtual int Foo (void *p) {return Test (this, p, 1);}
70   virtual int Baz (void *p) {return Test (this, p, 1);}
71   A ();
72   ~A ();
73 };
74
75 struct B1: virtual A {
76 #ifndef B1_EMPTY
77   int b1_m;
78 #endif
79   virtual int Foo (void *p) {return Test (this, p, 2);}
80   B1();
81   ~B1();
82 };
83
84 struct B2: virtual A {
85 #ifndef B2_EMPTY
86   int b2_m;
87 #endif
88   virtual int Foo (void *p) {return Test (this, p, 3);}
89   B2();
90   ~B2();
91 };
92
93 struct Empty {};
94
95 struct C : C_PARENTS {
96 #ifndef C_EMPTY
97   int c_m;
98 #endif
99   virtual int Foo (void *p) {return Test (this, p, 4);}
100   C();
101   ~C();
102 };
103
104 A::A ()
105 {
106   fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);
107   Test <A> (this, 1);
108 }
109 A::~A ()
110 {
111   fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);
112   Test <A> (this, 1);
113 }
114
115 B1::B1()
116 {
117   fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);
118   Test <A> (this, 2);
119   Test <B1> (this, 2);
120 }
121 B1::~B1()
122 {
123   fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);
124   Test <A> (this, 2);
125   Test <B1> (this, 2);
126 }
127 B2::B2()
128 {
129   fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);
130   Test <A> (this, 3);
131   Test <B2> (this, 3);
132 }
133 B2::~B2()
134 {
135   fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);
136   Test <A> (this, 3);
137   Test <B2> (this, 3);
138 }
139 C::C()
140 {
141   fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);
142   Test <A> (this, 4);
143   Test <C> (this, 4);
144 }
145 C::~C()
146 {
147   fprintf (stderr, "%s\n", __PRETTY_FUNCTION__);
148   Test <A> (this, 4);
149   Test <C> (this, 4);
150 }
151
152 struct D : C {};
153 struct D1 : virtual C {};
154 struct D2 : virtual A, virtual C {};
155
156 int main()
157 {
158   {
159     fprintf (stderr, "C\n");
160     C c;
161   }
162   {
163     fprintf (stderr, "D\n");
164     D d;
165   }
166   {
167     fprintf (stderr, "D1\n");
168     D1 d1;
169   }
170   {
171     fprintf (stderr, "D2\n");
172     D2 d2;
173   }
174   if (fail)
175     fprintf (stderr, "There are %d failings\n", fail);
176   else
177     fprintf (stderr, "Passed\n");
178   return fail ? 1 : 0;
179 }