blob: cec7a5cf71bdb021af23f9b0a80cc5e58cca1d67 [file] [log] [blame]
Anders Carlsson664b7d02010-02-18 17:07:24 +00001// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm-only -fdump-vtable-layouts 2>&1 | FileCheck %s
Anders Carlssonec27c492010-02-27 18:09:05 +00002// XFAIL: *
Anders Carlsson664b7d02010-02-18 17:07:24 +00003
4/// Examples from the Itanium C++ ABI specification.
5/// http://www.codesourcery.com/public/cxx-abi/
6
7namespace Test1 {
8
9// This is from http://www.codesourcery.com/public/cxx-abi/cxx-vtable-ex.html
10
11// CHECK: Vtable for 'Test1::A' (5 entries).
12// CHECK-NEXT: 0 | offset_to_top (0)
13// CHECK-NEXT: 1 | Test1::A RTTI
14// CHECK-NEXT: -- (Test1::A, 0) vtable address --
15// CHECK-NEXT: 2 | void Test1::A::f()
16// CHECK-NEXT: 3 | void Test1::A::g()
17// CHECK-NEXT: 4 | void Test1::A::h()
18struct A {
19 virtual void f ();
20 virtual void g ();
21 virtual void h ();
22 int ia;
23};
24void A::f() {}
Anders Carlsson8847d9e2010-02-18 17:26:40 +000025
26// CHECK: Vtable for 'Test1::B' (13 entries).
27// CHECK-NEXT: 0 | vbase_offset (16)
28// CHECK-NEXT: 1 | offset_to_top (0)
29// CHECK-NEXT: 2 | Test1::B RTTI
30// CHECK-NEXT: -- (Test1::B, 0) vtable address --
31// CHECK-NEXT: 3 | void Test1::B::f()
32// CHECK-NEXT: 4 | void Test1::B::h()
33// CHECK-NEXT: 5 | vcall_offset (-16)
34// CHECK-NEXT: 6 | vcall_offset (0)
35// CHECK-NEXT: 7 | vcall_offset (-16)
36// CHECK-NEXT: 8 | offset_to_top (-16)
37// CHECK-NEXT: 9 | Test1::B RTTI
38// CHECK-NEXT: -- (Test1::A, 16) vtable address --
39// CHECK-NEXT: 10 | void Test1::B::f()
40// CHECK-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
41// CHECK-NEXT: 11 | void Test1::A::g()
42// CHECK-NEXT: 12 | void Test1::B::h()
43// CHECK-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset]
44struct B: public virtual A {
45 void f ();
46 void h ();
47 int ib;
48};
49void B::f() {}
Anders Carlssonaa7444c2010-02-18 17:28:16 +000050
51// CHECK: Vtable for 'Test1::C' (13 entries).
52// CHECK-NEXT: 0 | vbase_offset (16)
53// CHECK-NEXT: 1 | offset_to_top (0)
54// CHECK-NEXT: 2 | Test1::C RTTI
55// CHECK-NEXT: -- (Test1::C, 0) vtable address --
56// CHECK-NEXT: 3 | void Test1::C::g()
57// CHECK-NEXT: 4 | void Test1::C::h()
58// CHECK-NEXT: 5 | vcall_offset (-16)
59// CHECK-NEXT: 6 | vcall_offset (-16)
60// CHECK-NEXT: 7 | vcall_offset (0)
61// CHECK-NEXT: 8 | offset_to_top (-16)
62// CHECK-NEXT: 9 | Test1::C RTTI
63// CHECK-NEXT: -- (Test1::A, 16) vtable address --
64// CHECK-NEXT: 10 | void Test1::A::f()
65// CHECK-NEXT: 11 | void Test1::C::g()
66// CHECK-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset]
67// CHECK-NEXT: 12 | void Test1::C::h()
68// CHECK-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset]
69struct C: public virtual A {
70 void g ();
71 void h ();
72 int ic;
73};
74void C::g() {}
Anders Carlssone5faca72010-02-18 17:32:33 +000075
76// CHECK: Vtable for 'Test1::D' (18 entries).
77// CHECK-NEXT: 0 | vbase_offset (32)
78// CHECK-NEXT: 1 | offset_to_top (0)
79// CHECK-NEXT: 2 | Test1::D RTTI
80// CHECK-NEXT: -- (Test1::B, 0) vtable address --
81// CHECK-NEXT: -- (Test1::D, 0) vtable address --
82// CHECK-NEXT: 3 | void Test1::B::f()
83// CHECK-NEXT: 4 | void Test1::D::h()
84// CHECK-NEXT: 5 | vbase_offset (16)
85// CHECK-NEXT: 6 | offset_to_top (-16)
86// CHECK-NEXT: 7 | Test1::D RTTI
87// CHECK-NEXT: -- (Test1::C, 16) vtable address --
88// CHECK-NEXT: 8 | void Test1::C::g()
89// CHECK-NEXT: 9 | void Test1::D::h()
90// CHECK-NEXT: [this adjustment: -16 non-virtual]
91// CHECK-NEXT: 10 | vcall_offset (-32)
92// CHECK-NEXT: 11 | vcall_offset (-16)
93// CHECK-NEXT: 12 | vcall_offset (-32)
94// CHECK-NEXT: 13 | offset_to_top (-32)
95// CHECK-NEXT: 14 | Test1::D RTTI
96// CHECK-NEXT: -- (Test1::A, 32) vtable address --
97// CHECK-NEXT: 15 | void Test1::B::f()
98// CHECK-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
99// CHECK-NEXT: 16 | void Test1::C::g()
100// CHECK-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset]
101// CHECK-NEXT: 17 | void Test1::D::h()
102// CHECK-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset]
103struct D: public B, public C {
104 void h ();
105 int id;
106};
107void D::h() { }
108
Anders Carlsson82109502010-02-19 05:59:40 +0000109struct X {
110 int ix;
111 virtual void x();
112};
113
114// CHECK: Vtable for 'Test1::E' (24 entries).
115// CHECK-NEXT: 0 | vbase_offset (56)
116// CHECK-NEXT: 1 | offset_to_top (0)
117// CHECK-NEXT: 2 | Test1::E RTTI
118// CHECK-NEXT: -- (Test1::E, 0) vtable address --
119// CHECK-NEXT: -- (Test1::X, 0) vtable address --
120// CHECK-NEXT: 3 | void Test1::X::x()
121// CHECK-NEXT: 4 | void Test1::E::f()
122// CHECK-NEXT: 5 | void Test1::E::h()
123// CHECK-NEXT: 6 | vbase_offset (40)
124// CHECK-NEXT: 7 | offset_to_top (-16)
125// CHECK-NEXT: 8 | Test1::E RTTI
126// CHECK-NEXT: -- (Test1::B, 16) vtable address --
127// CHECK-NEXT: -- (Test1::D, 16) vtable address --
128// CHECK-NEXT: 9 | void Test1::E::f()
129// CHECK-NEXT: [this adjustment: -16 non-virtual]
130// CHECK-NEXT: 10 | void Test1::E::h()
131// CHECK-NEXT: [this adjustment: -16 non-virtual]
132// CHECK-NEXT: 11 | vbase_offset (24)
133// CHECK-NEXT: 12 | offset_to_top (-32)
134// CHECK-NEXT: 13 | Test1::E RTTI
135// CHECK-NEXT: -- (Test1::C, 32) vtable address --
136// CHECK-NEXT: 14 | void Test1::C::g()
137// CHECK-NEXT: 15 | void Test1::E::h()
138// CHECK-NEXT: [this adjustment: -32 non-virtual]
139// CHECK-NEXT: 16 | vcall_offset (-56)
140// CHECK-NEXT: 17 | vcall_offset (-24)
141// CHECK-NEXT: 18 | vcall_offset (-56)
142// CHECK-NEXT: 19 | offset_to_top (-56)
143// CHECK-NEXT: 20 | Test1::E RTTI
144// CHECK-NEXT: -- (Test1::A, 56) vtable address --
145// CHECK-NEXT: 21 | void Test1::E::f()
146// CHECK-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
147// CHECK-NEXT: 22 | void Test1::C::g()
148// CHECK-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset]
149// CHECK-NEXT: 23 | void Test1::E::h()
150// CHECK-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset]
151struct E : X, D {
152 int ie;
153 void f();
154 void h ();
155};
156void E::f() { }
157
Anders Carlsson664b7d02010-02-18 17:07:24 +0000158}
Anders Carlssona9f633b2010-02-24 16:43:12 +0000159
160namespace Test2 {
161
162// From http://www.codesourcery.com/public/cxx-abi/abi.html#class-types.
163
164struct A { virtual void f(); };
165struct B : virtual public A { int i; };
166struct C : virtual public A { int j; };
167
168// CHECK: Vtable for 'Test2::D' (11 entries).
169// CHECK-NEXT: 0 | vbase_offset (0)
170// CHECK-NEXT: 1 | vcall_offset (0)
171// CHECK-NEXT: 2 | offset_to_top (0)
172// CHECK-NEXT: 3 | Test2::D RTTI
173// CHECK-NEXT: -- (Test2::A, 0) vtable address --
174// CHECK-NEXT: -- (Test2::B, 0) vtable address --
175// CHECK-NEXT: -- (Test2::D, 0) vtable address --
176// CHECK-NEXT: 4 | void Test2::A::f()
177// CHECK-NEXT: 5 | void Test2::D::d()
178// CHECK-NEXT: 6 | vbase_offset (-16)
179// CHECK-NEXT: 7 | vcall_offset (-16)
180// CHECK-NEXT: 8 | offset_to_top (-16)
181// CHECK-NEXT: 9 | Test2::D RTTI
182// CHECK-NEXT: -- (Test2::A, 16) vtable address --
183// CHECK-NEXT: -- (Test2::C, 16) vtable address --
184// CHECK-NEXT: 10 | [unused] void Test2::A::f()
185struct D : public B, public C {
186 virtual void d();
187};
188void D::d() { }
189
190}