OSDN Git Service

* cp-tree.h (BINFO_FOR_VBASE): Adjust documentation.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.abi / vtable.C
1 // Test various aspects of vtable layout.
2 // Special g++ Options: -fno-strict-aliasing
3 // Origin: Mark Mitchell <mark@codesourcery.com>
4
5 #if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100
6
7 struct S0
8 {
9   virtual void h ()
10   {
11   }
12
13   int k;
14 };
15
16
17 struct S1 
18 {
19   virtual void f () 
20   {
21   }
22
23   int i;
24 };
25
26 struct S2 : virtual public S0
27 {
28   virtual void g ()
29   {
30   }
31
32   int j;
33 };
34
35 struct S3 
36 {
37   virtual void k () 
38   {
39   }
40
41   int l;
42 };
43
44 struct S4 : public virtual S1, public S2, public S3
45 {
46 };
47
48 inline void* vtable (void *object)
49 {
50   // The vptr is always the first part of the object.
51   return * (void **) object;
52 }
53
54 int main ()
55 {
56   // The vtable layout order for S4 should consist of S4's primary
57   // vtable (shared with S2), followed by the vtable for S3 (because
58   // it is a non-virtual base).  Then, these should be followed by the
59   // the vtables for S1 and S0, which are virtual.
60   S4 s4;
61   S0 *s0 = &s4;
62   S1 *s1 = &s4;
63   S2 *s2 = &s4;
64   S3 *s3 = &s4;
65   
66   if (vtable (&s4) != vtable (s2))
67     return 1;
68     if (vtable (s2) >= vtable (s3))
69     return 2;
70   if (vtable (s3) >= vtable (s1))
71     return 3;
72   if (vtable (s1) >= vtable (s0))
73     return 4;
74 }
75
76 #else /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */
77
78 int main () 
79 {
80 }
81
82 #endif /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */