OSDN Git Service

G++ no longer defines builtins that do not begin with __builtin.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.abi / vtable2.C
1 // Origin: Mark Mitchell <mark@codesourcery.com>
2 // Special g++ Options: -fno-strict-aliasing
3
4 #if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100
5
6 #include <stddef.h>
7
8 struct S0
9 {
10   virtual void s0 ();
11 };
12
13 struct S1 : virtual public S0
14 {
15   virtual void s1 ();
16 };
17
18 struct S2 : virtual public S1
19 {
20   virtual void s1 ();
21   virtual void s0 ();
22 };
23
24 struct S3
25 {
26   virtual void s3 ();
27 };
28
29 struct S4 : public S3, virtual public S2
30 {
31   virtual void s1 ();
32 };
33
34 void S0::s0 ()
35 {
36 }
37
38 void S1::s1 ()
39 {
40 }
41
42 void S2::s1 ()
43 {
44 }
45
46 void S2::s0 ()
47 {
48 }
49
50 void S3::s3 ()
51 {
52 }
53
54 void S4::s1 ()
55 {
56 }
57
58 /* The vtables should look like:
59
60    S0 primary vtable
61    
62      S0 offset to top
63      S0 RTTI
64      S0::s0
65
66    =================
67
68    S1 primary vtable
69
70      S0::s0 vcall offset
71      S0 vbase offset
72      S1 offset to top
73      S1 RTTI
74      S0::s0
75      S1::s1
76
77    =================
78
79    S2 primary vtable
80    
81      S2::s1 vcall offset
82      S1 vbase offset
83      S2::s0 vcall offset
84      S0 vbase offset
85      S2 offset to top
86      S2 RTTI
87      S2::s0
88      S2::s1
89
90    =================
91
92    S3 primary vtable
93
94      S3 offset to top
95      S3 RTTI
96      S3::s3
97
98    =================
99
100    S4 primary vtable
101
102      vbase offset for S0
103      vbase offset for S1
104      vbase offset for S2
105      S4 offset to top
106      S4 RTTI
107      S3::s3
108      S4::s1
109
110    S2-in-S4 secondary vtable
111
112      S1 vbase offset
113      S4::s1 vcall offset
114      S0 vbase offset
115      S2:s0 vcall offset
116      S2 offset to top
117      S4 RTTI
118      S2::s0
119      S4::s1
120
121 */
122
123 // These are tricks to allow us to get raw function pointers for
124 // member functions.
125 extern "C" {
126 void _ZN2S32s3Ev ();
127 void _ZN2S42s1Ev ();
128 }
129
130 int main ()
131 {
132   S4 s4;
133   ptrdiff_t **vptr;
134   ptrdiff_t *vtbl;
135
136   // Set vtbl to point at the beginning of S4's primary vtable.
137   vptr = (ptrdiff_t **) &s4;
138   vtbl = *vptr;
139   vtbl -= 5;
140
141   if (*vtbl++ != ((char*) (S0*) &s4) - (char*) &s4)
142     return 1;
143   if (*vtbl++ != ((char*) (S1*) &s4) - (char*) &s4)
144     return 2;
145   if (*vtbl++ != ((char*) (S2*) &s4) - (char*) &s4)
146     return 3;
147   if (*vtbl++ != 0)
148     return 4;
149   // Skip the RTTI entry.
150   vtbl++;
151   if (*vtbl++ != (ptrdiff_t) &_ZN2S32s3Ev)
152     return 5;
153   if (*vtbl++ != (ptrdiff_t) &_ZN2S42s1Ev)
154     return 6;
155   // The S1 vbase offset.
156   if (*vtbl++ != 0)
157     return 7;
158   // The S4::s1 vcall offset is negative; once you convert to S2, you
159   // have to convert to S4 to find the final overrider.
160   if (*vtbl++ != ((char*) &s4 - (char*) (S2*) &s4))
161     return 8;
162   if (*vtbl++ != 0)
163     return 9;
164   if (*vtbl++ != 0)
165     return 10;
166   // Now we're at the S2 offset to top entry.
167   if (*vtbl++ != ((char*) &s4 - (char*) (S2*) &s4))
168     return 11;
169   // Skip the RTTI entry.
170   vtbl++;
171   // Skip the remaining virtual functions -- they are thunks.
172   vtbl++;
173   vtbl++;
174 }
175
176 #else /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */
177
178 int main ()
179 {
180 }
181
182 #endif /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */