1*bc91b44aSAnders Carlsson // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm-only -fdump-vtable-layouts 2>&1 | FileCheck %s
2*bc91b44aSAnders Carlsson
3*bc91b44aSAnders Carlsson // A collection of big class hierarchies and their vtables.
4*bc91b44aSAnders Carlsson
5*bc91b44aSAnders Carlsson namespace Test1 {
6*bc91b44aSAnders Carlsson
7*bc91b44aSAnders Carlsson class C0
8*bc91b44aSAnders Carlsson {
9*bc91b44aSAnders Carlsson };
10*bc91b44aSAnders Carlsson class C1
11*bc91b44aSAnders Carlsson : virtual public C0
12*bc91b44aSAnders Carlsson {
13*bc91b44aSAnders Carlsson int k0;
14*bc91b44aSAnders Carlsson };
15*bc91b44aSAnders Carlsson class C2
16*bc91b44aSAnders Carlsson : public C0
17*bc91b44aSAnders Carlsson , virtual public C1
18*bc91b44aSAnders Carlsson {
19*bc91b44aSAnders Carlsson int k0;
20*bc91b44aSAnders Carlsson };
21*bc91b44aSAnders Carlsson class C3
22*bc91b44aSAnders Carlsson : virtual public C0
23*bc91b44aSAnders Carlsson , virtual public C1
24*bc91b44aSAnders Carlsson , public C2
25*bc91b44aSAnders Carlsson {
26*bc91b44aSAnders Carlsson int k0;
27*bc91b44aSAnders Carlsson int k1;
28*bc91b44aSAnders Carlsson int k2;
29*bc91b44aSAnders Carlsson int k3;
30*bc91b44aSAnders Carlsson };
31*bc91b44aSAnders Carlsson class C4
32*bc91b44aSAnders Carlsson : public C2
33*bc91b44aSAnders Carlsson , virtual public C3
34*bc91b44aSAnders Carlsson , public C0
35*bc91b44aSAnders Carlsson {
36*bc91b44aSAnders Carlsson int k0;
37*bc91b44aSAnders Carlsson };
38*bc91b44aSAnders Carlsson class C5
39*bc91b44aSAnders Carlsson : public C0
40*bc91b44aSAnders Carlsson , virtual public C4
41*bc91b44aSAnders Carlsson , public C2
42*bc91b44aSAnders Carlsson , public C1
43*bc91b44aSAnders Carlsson , virtual public C3
44*bc91b44aSAnders Carlsson {
45*bc91b44aSAnders Carlsson int k0;
46*bc91b44aSAnders Carlsson };
47*bc91b44aSAnders Carlsson class C6
48*bc91b44aSAnders Carlsson : virtual public C3
49*bc91b44aSAnders Carlsson , public C0
50*bc91b44aSAnders Carlsson , public C5
51*bc91b44aSAnders Carlsson , public C4
52*bc91b44aSAnders Carlsson , public C1
53*bc91b44aSAnders Carlsson {
54*bc91b44aSAnders Carlsson int k0;
55*bc91b44aSAnders Carlsson };
56*bc91b44aSAnders Carlsson class C7
57*bc91b44aSAnders Carlsson : virtual public C5
58*bc91b44aSAnders Carlsson , virtual public C6
59*bc91b44aSAnders Carlsson , virtual public C3
60*bc91b44aSAnders Carlsson , public C4
61*bc91b44aSAnders Carlsson , virtual public C2
62*bc91b44aSAnders Carlsson {
63*bc91b44aSAnders Carlsson int k0;
64*bc91b44aSAnders Carlsson int k1;
65*bc91b44aSAnders Carlsson };
66*bc91b44aSAnders Carlsson class C8
67*bc91b44aSAnders Carlsson : public C7
68*bc91b44aSAnders Carlsson , public C5
69*bc91b44aSAnders Carlsson , public C3
70*bc91b44aSAnders Carlsson , virtual public C4
71*bc91b44aSAnders Carlsson , public C1
72*bc91b44aSAnders Carlsson , public C2
73*bc91b44aSAnders Carlsson {
74*bc91b44aSAnders Carlsson int k0;
75*bc91b44aSAnders Carlsson int k1;
76*bc91b44aSAnders Carlsson };
77*bc91b44aSAnders Carlsson
78*bc91b44aSAnders Carlsson // CHECK: Vtable for 'Test1::C9' (87 entries).
79*bc91b44aSAnders Carlsson // CHECK-NEXT: 0 | vbase_offset (344)
80*bc91b44aSAnders Carlsson // CHECK-NEXT: 1 | vbase_offset (312)
81*bc91b44aSAnders Carlsson // CHECK-NEXT: 2 | vbase_offset (184)
82*bc91b44aSAnders Carlsson // CHECK-NEXT: 3 | vbase_offset (168)
83*bc91b44aSAnders Carlsson // CHECK-NEXT: 4 | vbase_offset (120)
84*bc91b44aSAnders Carlsson // CHECK-NEXT: 5 | vbase_offset (48)
85*bc91b44aSAnders Carlsson // CHECK-NEXT: 6 | vbase_offset (148)
86*bc91b44aSAnders Carlsson // CHECK-NEXT: 7 | vbase_offset (152)
87*bc91b44aSAnders Carlsson // CHECK-NEXT: 8 | offset_to_top (0)
88*bc91b44aSAnders Carlsson // CHECK-NEXT: 9 | Test1::C9 RTTI
89*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 0) vtable address --
90*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C9, 0) vtable address --
91*bc91b44aSAnders Carlsson // CHECK-NEXT: 10 | void Test1::C9::f()
92*bc91b44aSAnders Carlsson // CHECK-NEXT: 11 | vbase_offset (104)
93*bc91b44aSAnders Carlsson // CHECK-NEXT: 12 | vbase_offset (132)
94*bc91b44aSAnders Carlsson // CHECK-NEXT: 13 | vbase_offset (136)
95*bc91b44aSAnders Carlsson // CHECK-NEXT: 14 | offset_to_top (-16)
96*bc91b44aSAnders Carlsson // CHECK-NEXT: 15 | Test1::C9 RTTI
97*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 16) vtable address --
98*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C4, 16) vtable address --
99*bc91b44aSAnders Carlsson // CHECK-NEXT: 16 | vbase_offset (72)
100*bc91b44aSAnders Carlsson // CHECK-NEXT: 17 | vbase_offset (120)
101*bc91b44aSAnders Carlsson // CHECK-NEXT: 18 | vbase_offset (100)
102*bc91b44aSAnders Carlsson // CHECK-NEXT: 19 | vbase_offset (104)
103*bc91b44aSAnders Carlsson // CHECK-NEXT: 20 | offset_to_top (-48)
104*bc91b44aSAnders Carlsson // CHECK-NEXT: 21 | Test1::C9 RTTI
105*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 48) vtable address --
106*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C5, 48) vtable address --
107*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C6, 48) vtable address --
108*bc91b44aSAnders Carlsson // CHECK-NEXT: 22 | vbase_offset (84)
109*bc91b44aSAnders Carlsson // CHECK-NEXT: 23 | offset_to_top (-64)
110*bc91b44aSAnders Carlsson // CHECK-NEXT: 24 | Test1::C9 RTTI
111*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C1, 64) vtable address --
112*bc91b44aSAnders Carlsson // CHECK-NEXT: 25 | vbase_offset (32)
113*bc91b44aSAnders Carlsson // CHECK-NEXT: 26 | vbase_offset (60)
114*bc91b44aSAnders Carlsson // CHECK-NEXT: 27 | vbase_offset (64)
115*bc91b44aSAnders Carlsson // CHECK-NEXT: 28 | offset_to_top (-88)
116*bc91b44aSAnders Carlsson // CHECK-NEXT: 29 | Test1::C9 RTTI
117*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 88) vtable address --
118*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C4, 88) vtable address --
119*bc91b44aSAnders Carlsson // CHECK-NEXT: 30 | vbase_offset (44)
120*bc91b44aSAnders Carlsson // CHECK-NEXT: 31 | offset_to_top (-104)
121*bc91b44aSAnders Carlsson // CHECK-NEXT: 32 | Test1::C9 RTTI
122*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C1, 104) vtable address --
123*bc91b44aSAnders Carlsson // CHECK-NEXT: 33 | vbase_offset (28)
124*bc91b44aSAnders Carlsson // CHECK-NEXT: 34 | vbase_offset (32)
125*bc91b44aSAnders Carlsson // CHECK-NEXT: 35 | offset_to_top (-120)
126*bc91b44aSAnders Carlsson // CHECK-NEXT: 36 | Test1::C9 RTTI
127*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 120) vtable address --
128*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C3, 120) vtable address --
129*bc91b44aSAnders Carlsson // CHECK-NEXT: 37 | vbase_offset (-4)
130*bc91b44aSAnders Carlsson // CHECK-NEXT: 38 | offset_to_top (-152)
131*bc91b44aSAnders Carlsson // CHECK-NEXT: 39 | Test1::C9 RTTI
132*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C1, 152) vtable address --
133*bc91b44aSAnders Carlsson // CHECK-NEXT: 40 | vbase_offset (-48)
134*bc91b44aSAnders Carlsson // CHECK-NEXT: 41 | vbase_offset (-20)
135*bc91b44aSAnders Carlsson // CHECK-NEXT: 42 | vbase_offset (-16)
136*bc91b44aSAnders Carlsson // CHECK-NEXT: 43 | offset_to_top (-168)
137*bc91b44aSAnders Carlsson // CHECK-NEXT: 44 | Test1::C9 RTTI
138*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 168) vtable address --
139*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C4, 168) vtable address --
140*bc91b44aSAnders Carlsson // CHECK-NEXT: 45 | vbase_offset (160)
141*bc91b44aSAnders Carlsson // CHECK-NEXT: 46 | vbase_offset (-136)
142*bc91b44aSAnders Carlsson // CHECK-NEXT: 47 | vbase_offset (-16)
143*bc91b44aSAnders Carlsson // CHECK-NEXT: 48 | vbase_offset (128)
144*bc91b44aSAnders Carlsson // CHECK-NEXT: 49 | vbase_offset (-64)
145*bc91b44aSAnders Carlsson // CHECK-NEXT: 50 | vbase_offset (-36)
146*bc91b44aSAnders Carlsson // CHECK-NEXT: 51 | vbase_offset (-32)
147*bc91b44aSAnders Carlsson // CHECK-NEXT: 52 | offset_to_top (-184)
148*bc91b44aSAnders Carlsson // CHECK-NEXT: 53 | Test1::C9 RTTI
149*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 184) vtable address --
150*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C4, 184) vtable address --
151*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C7, 184) vtable address --
152*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C8, 184) vtable address --
153*bc91b44aSAnders Carlsson // CHECK-NEXT: 54 | vbase_offset (-88)
154*bc91b44aSAnders Carlsson // CHECK-NEXT: 55 | vbase_offset (-40)
155*bc91b44aSAnders Carlsson // CHECK-NEXT: 56 | vbase_offset (-60)
156*bc91b44aSAnders Carlsson // CHECK-NEXT: 57 | vbase_offset (-56)
157*bc91b44aSAnders Carlsson // CHECK-NEXT: 58 | offset_to_top (-208)
158*bc91b44aSAnders Carlsson // CHECK-NEXT: 59 | Test1::C9 RTTI
159*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 208) vtable address --
160*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C5, 208) vtable address --
161*bc91b44aSAnders Carlsson // CHECK-NEXT: 60 | vbase_offset (-76)
162*bc91b44aSAnders Carlsson // CHECK-NEXT: 61 | offset_to_top (-224)
163*bc91b44aSAnders Carlsson // CHECK-NEXT: 62 | Test1::C9 RTTI
164*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C1, 224) vtable address --
165*bc91b44aSAnders Carlsson // CHECK-NEXT: 63 | vbase_offset (-92)
166*bc91b44aSAnders Carlsson // CHECK-NEXT: 64 | vbase_offset (-88)
167*bc91b44aSAnders Carlsson // CHECK-NEXT: 65 | offset_to_top (-240)
168*bc91b44aSAnders Carlsson // CHECK-NEXT: 66 | Test1::C9 RTTI
169*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 240) vtable address --
170*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C3, 240) vtable address --
171*bc91b44aSAnders Carlsson // CHECK-NEXT: 67 | vbase_offset (-124)
172*bc91b44aSAnders Carlsson // CHECK-NEXT: 68 | offset_to_top (-272)
173*bc91b44aSAnders Carlsson // CHECK-NEXT: 69 | Test1::C9 RTTI
174*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C1, 272) vtable address --
175*bc91b44aSAnders Carlsson // CHECK-NEXT: 70 | vbase_offset (-140)
176*bc91b44aSAnders Carlsson // CHECK-NEXT: 71 | vbase_offset (-136)
177*bc91b44aSAnders Carlsson // CHECK-NEXT: 72 | offset_to_top (-288)
178*bc91b44aSAnders Carlsson // CHECK-NEXT: 73 | Test1::C9 RTTI
179*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 288) vtable address --
180*bc91b44aSAnders Carlsson // CHECK-NEXT: 74 | vbase_offset (-192)
181*bc91b44aSAnders Carlsson // CHECK-NEXT: 75 | vbase_offset (-144)
182*bc91b44aSAnders Carlsson // CHECK-NEXT: 76 | vbase_offset (-164)
183*bc91b44aSAnders Carlsson // CHECK-NEXT: 77 | vbase_offset (-160)
184*bc91b44aSAnders Carlsson // CHECK-NEXT: 78 | offset_to_top (-312)
185*bc91b44aSAnders Carlsson // CHECK-NEXT: 79 | Test1::C9 RTTI
186*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C2, 312) vtable address --
187*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C5, 312) vtable address --
188*bc91b44aSAnders Carlsson // CHECK-NEXT: 80 | vbase_offset (-180)
189*bc91b44aSAnders Carlsson // CHECK-NEXT: 81 | offset_to_top (-328)
190*bc91b44aSAnders Carlsson // CHECK-NEXT: 82 | Test1::C9 RTTI
191*bc91b44aSAnders Carlsson // CHECK-NEXT: -- (Test1::C1, 328) vtable address --
192*bc91b44aSAnders Carlsson // CHECK-NEXT: 83 | vbase_offset (-196)
193*bc91b44aSAnders Carlsson // CHECK-NEXT: 84 | vbase_offset (-192)
194*bc91b44aSAnders Carlsson // CHECK-NEXT: 85 | offset_to_top (-344)
195*bc91b44aSAnders Carlsson // CHECK-NEXT: 86 | Test1::C9 RTTI
196*bc91b44aSAnders Carlsson class C9
197*bc91b44aSAnders Carlsson : virtual public C6
198*bc91b44aSAnders Carlsson , public C2
199*bc91b44aSAnders Carlsson , public C4
200*bc91b44aSAnders Carlsson , virtual public C8
201*bc91b44aSAnders Carlsson {
202*bc91b44aSAnders Carlsson int k0;
203*bc91b44aSAnders Carlsson int k1;
204*bc91b44aSAnders Carlsson int k2;
205*bc91b44aSAnders Carlsson int k3;
206*bc91b44aSAnders Carlsson virtual void f();
207*bc91b44aSAnders Carlsson };
f()208*bc91b44aSAnders Carlsson void C9::f() { }
209*bc91b44aSAnders Carlsson
210*bc91b44aSAnders Carlsson }
211