1*67e74705SXin Li // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm-only -fdump-vtable-layouts > %t 2>/dev/null
2*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-1 %s < %t
3*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-2 %s < %t
4*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-3 %s < %t
5*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-4 %s < %t
6*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-5 %s < %t
7*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-6 %s < %t
8*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-7 %s < %t
9*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-8 %s < %t
10*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-9 %s < %t
11*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-10 %s < %t
12*67e74705SXin Li // RUN: FileCheck --check-prefix=CHECK-11 %s < %t
13*67e74705SXin Li
14*67e74705SXin Li /// Examples from the Itanium C++ ABI specification.
15*67e74705SXin Li /// http://www.codesourcery.com/public/cxx-abi/
16*67e74705SXin Li
17*67e74705SXin Li namespace Test1 {
18*67e74705SXin Li
19*67e74705SXin Li // This is from http://www.codesourcery.com/public/cxx-abi/cxx-vtable-ex.html
20*67e74705SXin Li
21*67e74705SXin Li // CHECK-1: Vtable for 'Test1::A' (5 entries).
22*67e74705SXin Li // CHECK-1-NEXT: 0 | offset_to_top (0)
23*67e74705SXin Li // CHECK-1-NEXT: 1 | Test1::A RTTI
24*67e74705SXin Li // CHECK-1-NEXT: -- (Test1::A, 0) vtable address --
25*67e74705SXin Li // CHECK-1-NEXT: 2 | void Test1::A::f()
26*67e74705SXin Li // CHECK-1-NEXT: 3 | void Test1::A::g()
27*67e74705SXin Li // CHECK-1-NEXT: 4 | void Test1::A::h()
28*67e74705SXin Li struct A {
29*67e74705SXin Li virtual void f ();
30*67e74705SXin Li virtual void g ();
31*67e74705SXin Li virtual void h ();
32*67e74705SXin Li int ia;
33*67e74705SXin Li };
f()34*67e74705SXin Li void A::f() {}
35*67e74705SXin Li
36*67e74705SXin Li // CHECK-2: Vtable for 'Test1::B' (13 entries).
37*67e74705SXin Li // CHECK-2-NEXT: 0 | vbase_offset (16)
38*67e74705SXin Li // CHECK-2-NEXT: 1 | offset_to_top (0)
39*67e74705SXin Li // CHECK-2-NEXT: 2 | Test1::B RTTI
40*67e74705SXin Li // CHECK-2-NEXT: -- (Test1::B, 0) vtable address --
41*67e74705SXin Li // CHECK-2-NEXT: 3 | void Test1::B::f()
42*67e74705SXin Li // CHECK-2-NEXT: 4 | void Test1::B::h()
43*67e74705SXin Li // CHECK-2-NEXT: 5 | vcall_offset (-16)
44*67e74705SXin Li // CHECK-2-NEXT: 6 | vcall_offset (0)
45*67e74705SXin Li // CHECK-2-NEXT: 7 | vcall_offset (-16)
46*67e74705SXin Li // CHECK-2-NEXT: 8 | offset_to_top (-16)
47*67e74705SXin Li // CHECK-2-NEXT: 9 | Test1::B RTTI
48*67e74705SXin Li // CHECK-2-NEXT: -- (Test1::A, 16) vtable address --
49*67e74705SXin Li // CHECK-2-NEXT: 10 | void Test1::B::f()
50*67e74705SXin Li // CHECK-2-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
51*67e74705SXin Li // CHECK-2-NEXT: 11 | void Test1::A::g()
52*67e74705SXin Li // CHECK-2-NEXT: 12 | void Test1::B::h()
53*67e74705SXin Li // CHECK-2-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset]
54*67e74705SXin Li struct B: public virtual A {
55*67e74705SXin Li void f ();
56*67e74705SXin Li void h ();
57*67e74705SXin Li int ib;
58*67e74705SXin Li };
f()59*67e74705SXin Li void B::f() {}
60*67e74705SXin Li
61*67e74705SXin Li // CHECK-3: Vtable for 'Test1::C' (13 entries).
62*67e74705SXin Li // CHECK-3-NEXT: 0 | vbase_offset (16)
63*67e74705SXin Li // CHECK-3-NEXT: 1 | offset_to_top (0)
64*67e74705SXin Li // CHECK-3-NEXT: 2 | Test1::C RTTI
65*67e74705SXin Li // CHECK-3-NEXT: -- (Test1::C, 0) vtable address --
66*67e74705SXin Li // CHECK-3-NEXT: 3 | void Test1::C::g()
67*67e74705SXin Li // CHECK-3-NEXT: 4 | void Test1::C::h()
68*67e74705SXin Li // CHECK-3-NEXT: 5 | vcall_offset (-16)
69*67e74705SXin Li // CHECK-3-NEXT: 6 | vcall_offset (-16)
70*67e74705SXin Li // CHECK-3-NEXT: 7 | vcall_offset (0)
71*67e74705SXin Li // CHECK-3-NEXT: 8 | offset_to_top (-16)
72*67e74705SXin Li // CHECK-3-NEXT: 9 | Test1::C RTTI
73*67e74705SXin Li // CHECK-3-NEXT: -- (Test1::A, 16) vtable address --
74*67e74705SXin Li // CHECK-3-NEXT: 10 | void Test1::A::f()
75*67e74705SXin Li // CHECK-3-NEXT: 11 | void Test1::C::g()
76*67e74705SXin Li // CHECK-3-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset]
77*67e74705SXin Li // CHECK-3-NEXT: 12 | void Test1::C::h()
78*67e74705SXin Li // CHECK-3-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset]
79*67e74705SXin Li struct C: public virtual A {
80*67e74705SXin Li void g ();
81*67e74705SXin Li void h ();
82*67e74705SXin Li int ic;
83*67e74705SXin Li };
g()84*67e74705SXin Li void C::g() {}
85*67e74705SXin Li
86*67e74705SXin Li // CHECK-4: Vtable for 'Test1::D' (18 entries).
87*67e74705SXin Li // CHECK-4-NEXT: 0 | vbase_offset (32)
88*67e74705SXin Li // CHECK-4-NEXT: 1 | offset_to_top (0)
89*67e74705SXin Li // CHECK-4-NEXT: 2 | Test1::D RTTI
90*67e74705SXin Li // CHECK-4-NEXT: -- (Test1::B, 0) vtable address --
91*67e74705SXin Li // CHECK-4-NEXT: -- (Test1::D, 0) vtable address --
92*67e74705SXin Li // CHECK-4-NEXT: 3 | void Test1::B::f()
93*67e74705SXin Li // CHECK-4-NEXT: 4 | void Test1::D::h()
94*67e74705SXin Li // CHECK-4-NEXT: 5 | vbase_offset (16)
95*67e74705SXin Li // CHECK-4-NEXT: 6 | offset_to_top (-16)
96*67e74705SXin Li // CHECK-4-NEXT: 7 | Test1::D RTTI
97*67e74705SXin Li // CHECK-4-NEXT: -- (Test1::C, 16) vtable address --
98*67e74705SXin Li // CHECK-4-NEXT: 8 | void Test1::C::g()
99*67e74705SXin Li // CHECK-4-NEXT: 9 | void Test1::D::h()
100*67e74705SXin Li // CHECK-4-NEXT: [this adjustment: -16 non-virtual]
101*67e74705SXin Li // CHECK-4-NEXT: 10 | vcall_offset (-32)
102*67e74705SXin Li // CHECK-4-NEXT: 11 | vcall_offset (-16)
103*67e74705SXin Li // CHECK-4-NEXT: 12 | vcall_offset (-32)
104*67e74705SXin Li // CHECK-4-NEXT: 13 | offset_to_top (-32)
105*67e74705SXin Li // CHECK-4-NEXT: 14 | Test1::D RTTI
106*67e74705SXin Li // CHECK-4-NEXT: -- (Test1::A, 32) vtable address --
107*67e74705SXin Li // CHECK-4-NEXT: 15 | void Test1::B::f()
108*67e74705SXin Li // CHECK-4-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
109*67e74705SXin Li // CHECK-4-NEXT: 16 | void Test1::C::g()
110*67e74705SXin Li // CHECK-4-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset]
111*67e74705SXin Li // CHECK-4-NEXT: 17 | void Test1::D::h()
112*67e74705SXin Li // CHECK-4-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset]
113*67e74705SXin Li struct D: public B, public C {
114*67e74705SXin Li void h ();
115*67e74705SXin Li int id;
116*67e74705SXin Li };
h()117*67e74705SXin Li void D::h() { }
118*67e74705SXin Li
119*67e74705SXin Li struct X {
120*67e74705SXin Li int ix;
121*67e74705SXin Li virtual void x();
122*67e74705SXin Li };
123*67e74705SXin Li
124*67e74705SXin Li // CHECK-5: Vtable for 'Test1::E' (24 entries).
125*67e74705SXin Li // CHECK-5-NEXT: 0 | vbase_offset (56)
126*67e74705SXin Li // CHECK-5-NEXT: 1 | offset_to_top (0)
127*67e74705SXin Li // CHECK-5-NEXT: 2 | Test1::E RTTI
128*67e74705SXin Li // CHECK-5-NEXT: -- (Test1::E, 0) vtable address --
129*67e74705SXin Li // CHECK-5-NEXT: -- (Test1::X, 0) vtable address --
130*67e74705SXin Li // CHECK-5-NEXT: 3 | void Test1::X::x()
131*67e74705SXin Li // CHECK-5-NEXT: 4 | void Test1::E::f()
132*67e74705SXin Li // CHECK-5-NEXT: 5 | void Test1::E::h()
133*67e74705SXin Li // CHECK-5-NEXT: 6 | vbase_offset (40)
134*67e74705SXin Li // CHECK-5-NEXT: 7 | offset_to_top (-16)
135*67e74705SXin Li // CHECK-5-NEXT: 8 | Test1::E RTTI
136*67e74705SXin Li // CHECK-5-NEXT: -- (Test1::B, 16) vtable address --
137*67e74705SXin Li // CHECK-5-NEXT: -- (Test1::D, 16) vtable address --
138*67e74705SXin Li // CHECK-5-NEXT: 9 | void Test1::E::f()
139*67e74705SXin Li // CHECK-5-NEXT: [this adjustment: -16 non-virtual]
140*67e74705SXin Li // CHECK-5-NEXT: 10 | void Test1::E::h()
141*67e74705SXin Li // CHECK-5-NEXT: [this adjustment: -16 non-virtual]
142*67e74705SXin Li // CHECK-5-NEXT: 11 | vbase_offset (24)
143*67e74705SXin Li // CHECK-5-NEXT: 12 | offset_to_top (-32)
144*67e74705SXin Li // CHECK-5-NEXT: 13 | Test1::E RTTI
145*67e74705SXin Li // CHECK-5-NEXT: -- (Test1::C, 32) vtable address --
146*67e74705SXin Li // CHECK-5-NEXT: 14 | void Test1::C::g()
147*67e74705SXin Li // CHECK-5-NEXT: 15 | void Test1::E::h()
148*67e74705SXin Li // CHECK-5-NEXT: [this adjustment: -32 non-virtual]
149*67e74705SXin Li // CHECK-5-NEXT: 16 | vcall_offset (-56)
150*67e74705SXin Li // CHECK-5-NEXT: 17 | vcall_offset (-24)
151*67e74705SXin Li // CHECK-5-NEXT: 18 | vcall_offset (-56)
152*67e74705SXin Li // CHECK-5-NEXT: 19 | offset_to_top (-56)
153*67e74705SXin Li // CHECK-5-NEXT: 20 | Test1::E RTTI
154*67e74705SXin Li // CHECK-5-NEXT: -- (Test1::A, 56) vtable address --
155*67e74705SXin Li // CHECK-5-NEXT: 21 | void Test1::E::f()
156*67e74705SXin Li // CHECK-5-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
157*67e74705SXin Li // CHECK-5-NEXT: 22 | void Test1::C::g()
158*67e74705SXin Li // CHECK-5-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset]
159*67e74705SXin Li // CHECK-5-NEXT: 23 | void Test1::E::h()
160*67e74705SXin Li // CHECK-5-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset]
161*67e74705SXin Li struct E : X, D {
162*67e74705SXin Li int ie;
163*67e74705SXin Li void f();
164*67e74705SXin Li void h ();
165*67e74705SXin Li };
f()166*67e74705SXin Li void E::f() { }
167*67e74705SXin Li
168*67e74705SXin Li }
169*67e74705SXin Li
170*67e74705SXin Li namespace Test2 {
171*67e74705SXin Li
172*67e74705SXin Li // From http://www.codesourcery.com/public/cxx-abi/abi.html#class-types.
173*67e74705SXin Li
174*67e74705SXin Li struct A { virtual void f(); };
175*67e74705SXin Li struct B : virtual public A { int i; };
176*67e74705SXin Li struct C : virtual public A { int j; };
177*67e74705SXin Li
178*67e74705SXin Li // CHECK-6: Vtable for 'Test2::D' (11 entries).
179*67e74705SXin Li // CHECK-6-NEXT: 0 | vbase_offset (0)
180*67e74705SXin Li // CHECK-6-NEXT: 1 | vcall_offset (0)
181*67e74705SXin Li // CHECK-6-NEXT: 2 | offset_to_top (0)
182*67e74705SXin Li // CHECK-6-NEXT: 3 | Test2::D RTTI
183*67e74705SXin Li // CHECK-6-NEXT: -- (Test2::A, 0) vtable address --
184*67e74705SXin Li // CHECK-6-NEXT: -- (Test2::B, 0) vtable address --
185*67e74705SXin Li // CHECK-6-NEXT: -- (Test2::D, 0) vtable address --
186*67e74705SXin Li // CHECK-6-NEXT: 4 | void Test2::A::f()
187*67e74705SXin Li // CHECK-6-NEXT: 5 | void Test2::D::d()
188*67e74705SXin Li // CHECK-6-NEXT: 6 | vbase_offset (-16)
189*67e74705SXin Li // CHECK-6-NEXT: 7 | vcall_offset (-16)
190*67e74705SXin Li // CHECK-6-NEXT: 8 | offset_to_top (-16)
191*67e74705SXin Li // CHECK-6-NEXT: 9 | Test2::D RTTI
192*67e74705SXin Li // CHECK-6-NEXT: -- (Test2::C, 16) vtable address --
193*67e74705SXin Li // CHECK-6-NEXT: 10 | [unused] void Test2::A::f()
194*67e74705SXin Li struct D : public B, public C {
195*67e74705SXin Li virtual void d();
196*67e74705SXin Li };
d()197*67e74705SXin Li void D::d() { }
198*67e74705SXin Li
199*67e74705SXin Li }
200*67e74705SXin Li
201*67e74705SXin Li namespace Test3 {
202*67e74705SXin Li
203*67e74705SXin Li // From http://www.codesourcery.com/public/cxx-abi/abi-examples.html#vtable-ctor
204*67e74705SXin Li
205*67e74705SXin Li struct V1 {
206*67e74705SXin Li int v1;
207*67e74705SXin Li virtual void f();
208*67e74705SXin Li };
209*67e74705SXin Li
210*67e74705SXin Li struct V2 : virtual V1 {
211*67e74705SXin Li int v2;
212*67e74705SXin Li virtual void f();
213*67e74705SXin Li };
214*67e74705SXin Li
215*67e74705SXin Li // CHECK-7: Vtable for 'Test3::C' (14 entries).
216*67e74705SXin Li // CHECK-7-NEXT: 0 | vbase_offset (32)
217*67e74705SXin Li // CHECK-7-NEXT: 1 | vbase_offset (16)
218*67e74705SXin Li // CHECK-7-NEXT: 2 | offset_to_top (0)
219*67e74705SXin Li // CHECK-7-NEXT: 3 | Test3::C RTTI
220*67e74705SXin Li // CHECK-7-NEXT: -- (Test3::C, 0) vtable address --
221*67e74705SXin Li // CHECK-7-NEXT: 4 | void Test3::C::f()
222*67e74705SXin Li // CHECK-7-NEXT: 5 | vcall_offset (-16)
223*67e74705SXin Li // CHECK-7-NEXT: 6 | offset_to_top (-16)
224*67e74705SXin Li // CHECK-7-NEXT: 7 | Test3::C RTTI
225*67e74705SXin Li // CHECK-7-NEXT: -- (Test3::V1, 16) vtable address --
226*67e74705SXin Li // CHECK-7-NEXT: 8 | void Test3::C::f()
227*67e74705SXin Li // CHECK-7-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
228*67e74705SXin Li // CHECK-7-NEXT: 9 | vcall_offset (-32)
229*67e74705SXin Li // CHECK-7-NEXT: 10 | vbase_offset (-16)
230*67e74705SXin Li // CHECK-7-NEXT: 11 | offset_to_top (-32)
231*67e74705SXin Li // CHECK-7-NEXT: 12 | Test3::C RTTI
232*67e74705SXin Li // CHECK-7-NEXT: -- (Test3::V2, 32) vtable address --
233*67e74705SXin Li // CHECK-7-NEXT: 13 | void Test3::C::f()
234*67e74705SXin Li // CHECK-7-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset]
235*67e74705SXin Li
236*67e74705SXin Li // CHECK-8: Construction vtable for ('Test3::V2', 32) in 'Test3::C' (9 entries).
237*67e74705SXin Li // CHECK-8-NEXT: 0 | vcall_offset (0)
238*67e74705SXin Li // CHECK-8-NEXT: 1 | vbase_offset (-16)
239*67e74705SXin Li // CHECK-8-NEXT: 2 | offset_to_top (0)
240*67e74705SXin Li // CHECK-8-NEXT: 3 | Test3::V2 RTTI
241*67e74705SXin Li // CHECK-8-NEXT: -- (Test3::V2, 32) vtable address --
242*67e74705SXin Li // CHECK-8-NEXT: 4 | void Test3::V2::f()
243*67e74705SXin Li // CHECK-8-NEXT: 5 | vcall_offset (16)
244*67e74705SXin Li // CHECK-8-NEXT: 6 | offset_to_top (16)
245*67e74705SXin Li // CHECK-8-NEXT: 7 | Test3::V2 RTTI
246*67e74705SXin Li // CHECK-8-NEXT: -- (Test3::V1, 16) vtable address --
247*67e74705SXin Li // CHECK-8-NEXT: 8 | void Test3::V2::f()
248*67e74705SXin Li // CHECK-8-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
249*67e74705SXin Li struct C : virtual V1, virtual V2 {
250*67e74705SXin Li int c;
251*67e74705SXin Li virtual void f();
252*67e74705SXin Li };
f()253*67e74705SXin Li void C::f() { }
254*67e74705SXin Li
255*67e74705SXin Li struct B {
256*67e74705SXin Li int b;
257*67e74705SXin Li };
258*67e74705SXin Li
259*67e74705SXin Li // CHECK-9: Vtable for 'Test3::D' (15 entries).
260*67e74705SXin Li // CHECK-9-NEXT: 0 | vbase_offset (40)
261*67e74705SXin Li // CHECK-9-NEXT: 1 | vbase_offset (24)
262*67e74705SXin Li // CHECK-9-NEXT: 2 | offset_to_top (0)
263*67e74705SXin Li // CHECK-9-NEXT: 3 | Test3::D RTTI
264*67e74705SXin Li // CHECK-9-NEXT: -- (Test3::C, 0) vtable address --
265*67e74705SXin Li // CHECK-9-NEXT: -- (Test3::D, 0) vtable address --
266*67e74705SXin Li // CHECK-9-NEXT: 4 | void Test3::C::f()
267*67e74705SXin Li // CHECK-9-NEXT: 5 | void Test3::D::g()
268*67e74705SXin Li // CHECK-9-NEXT: 6 | vcall_offset (-24)
269*67e74705SXin Li // CHECK-9-NEXT: 7 | offset_to_top (-24)
270*67e74705SXin Li // CHECK-9-NEXT: 8 | Test3::D RTTI
271*67e74705SXin Li // CHECK-9-NEXT: -- (Test3::V1, 24) vtable address --
272*67e74705SXin Li // CHECK-9-NEXT: 9 | void Test3::C::f()
273*67e74705SXin Li // CHECK-9-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
274*67e74705SXin Li // CHECK-9-NEXT: 10 | vcall_offset (-40)
275*67e74705SXin Li // CHECK-9-NEXT: 11 | vbase_offset (-16)
276*67e74705SXin Li // CHECK-9-NEXT: 12 | offset_to_top (-40)
277*67e74705SXin Li // CHECK-9-NEXT: 13 | Test3::D RTTI
278*67e74705SXin Li // CHECK-9-NEXT: -- (Test3::V2, 40) vtable address --
279*67e74705SXin Li // CHECK-9-NEXT: 14 | void Test3::C::f()
280*67e74705SXin Li // CHECK-9-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset]
281*67e74705SXin Li
282*67e74705SXin Li // CHECK-10: Construction vtable for ('Test3::C', 0) in 'Test3::D' (14 entries).
283*67e74705SXin Li // CHECK-10-NEXT: 0 | vbase_offset (40)
284*67e74705SXin Li // CHECK-10-NEXT: 1 | vbase_offset (24)
285*67e74705SXin Li // CHECK-10-NEXT: 2 | offset_to_top (0)
286*67e74705SXin Li // CHECK-10-NEXT: 3 | Test3::C RTTI
287*67e74705SXin Li // CHECK-10-NEXT: -- (Test3::C, 0) vtable address --
288*67e74705SXin Li // CHECK-10-NEXT: 4 | void Test3::C::f()
289*67e74705SXin Li // CHECK-10-NEXT: 5 | vcall_offset (-24)
290*67e74705SXin Li // CHECK-10-NEXT: 6 | offset_to_top (-24)
291*67e74705SXin Li // CHECK-10-NEXT: 7 | Test3::C RTTI
292*67e74705SXin Li // CHECK-10-NEXT: -- (Test3::V1, 24) vtable address --
293*67e74705SXin Li // CHECK-10-NEXT: 8 | void Test3::C::f()
294*67e74705SXin Li // CHECK-10-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
295*67e74705SXin Li // CHECK-10-NEXT: 9 | vcall_offset (-40)
296*67e74705SXin Li // CHECK-10-NEXT: 10 | vbase_offset (-16)
297*67e74705SXin Li // CHECK-10-NEXT: 11 | offset_to_top (-40)
298*67e74705SXin Li // CHECK-10-NEXT: 12 | Test3::C RTTI
299*67e74705SXin Li // CHECK-10-NEXT: -- (Test3::V2, 40) vtable address --
300*67e74705SXin Li // CHECK-10-NEXT: 13 | void Test3::C::f()
301*67e74705SXin Li // CHECK-10-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset]
302*67e74705SXin Li
303*67e74705SXin Li // CHECK-11: Construction vtable for ('Test3::V2', 40) in 'Test3::D' (9 entries).
304*67e74705SXin Li // CHECK-11-NEXT: 0 | vcall_offset (0)
305*67e74705SXin Li // CHECK-11-NEXT: 1 | vbase_offset (-16)
306*67e74705SXin Li // CHECK-11-NEXT: 2 | offset_to_top (0)
307*67e74705SXin Li // CHECK-11-NEXT: 3 | Test3::V2 RTTI
308*67e74705SXin Li // CHECK-11-NEXT: -- (Test3::V2, 40) vtable address --
309*67e74705SXin Li // CHECK-11-NEXT: 4 | void Test3::V2::f()
310*67e74705SXin Li // CHECK-11-NEXT: 5 | vcall_offset (16)
311*67e74705SXin Li // CHECK-11-NEXT: 6 | offset_to_top (16)
312*67e74705SXin Li // CHECK-11-NEXT: 7 | Test3::V2 RTTI
313*67e74705SXin Li // CHECK-11-NEXT: -- (Test3::V1, 24) vtable address --
314*67e74705SXin Li // CHECK-11-NEXT: 8 | void Test3::V2::f()
315*67e74705SXin Li // CHECK-11-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset]
316*67e74705SXin Li struct D : B, C {
317*67e74705SXin Li int d;
318*67e74705SXin Li virtual void g();
319*67e74705SXin Li };
g()320*67e74705SXin Li void D::g() { }
321*67e74705SXin Li
322*67e74705SXin Li }
323