1*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts %s 2>/dev/null \
2f4a2713aSLionel Sambuc // RUN: | FileCheck %s
3f4a2713aSLionel Sambuc
4f4a2713aSLionel Sambuc #pragma pack(push, 8)
5f4a2713aSLionel Sambuc
6f4a2713aSLionel Sambuc class B {
7f4a2713aSLionel Sambuc public:
b()8f4a2713aSLionel Sambuc virtual void b(){}
9f4a2713aSLionel Sambuc int b_field;
10f4a2713aSLionel Sambuc protected:
11f4a2713aSLionel Sambuc private:
12f4a2713aSLionel Sambuc };
13f4a2713aSLionel Sambuc
14f4a2713aSLionel Sambuc class A : public B {
15f4a2713aSLionel Sambuc public:
16f4a2713aSLionel Sambuc int a_field;
a()17f4a2713aSLionel Sambuc virtual void a(){}
18f4a2713aSLionel Sambuc char one;
19f4a2713aSLionel Sambuc protected:
20f4a2713aSLionel Sambuc private:
21f4a2713aSLionel Sambuc };
22f4a2713aSLionel Sambuc
23f4a2713aSLionel Sambuc class D {
24f4a2713aSLionel Sambuc public:
b()25f4a2713aSLionel Sambuc virtual void b(){}
26f4a2713aSLionel Sambuc double a;
27f4a2713aSLionel Sambuc };
28f4a2713aSLionel Sambuc
29f4a2713aSLionel Sambuc class C : public virtual A,
30f4a2713aSLionel Sambuc public D, public B {
31f4a2713aSLionel Sambuc public:
32f4a2713aSLionel Sambuc double c1_field;
33f4a2713aSLionel Sambuc int c2_field;
34f4a2713aSLionel Sambuc double c3_field;
35f4a2713aSLionel Sambuc int c4_field;
foo()36f4a2713aSLionel Sambuc virtual void foo(){}
bar()37f4a2713aSLionel Sambuc virtual void bar(){}
38f4a2713aSLionel Sambuc protected:
39f4a2713aSLionel Sambuc private:
40f4a2713aSLionel Sambuc };
41f4a2713aSLionel Sambuc
42f4a2713aSLionel Sambuc struct BaseStruct
43f4a2713aSLionel Sambuc {
BaseStructBaseStruct44f4a2713aSLionel Sambuc BaseStruct(){}
45f4a2713aSLionel Sambuc double v0;
46f4a2713aSLionel Sambuc float v1;
47f4a2713aSLionel Sambuc C fg;
48f4a2713aSLionel Sambuc };
49f4a2713aSLionel Sambuc
50f4a2713aSLionel Sambuc struct DerivedStruct : public BaseStruct {
51f4a2713aSLionel Sambuc int x;
52f4a2713aSLionel Sambuc };
53f4a2713aSLionel Sambuc
54f4a2713aSLionel Sambuc struct G
55f4a2713aSLionel Sambuc {
56f4a2713aSLionel Sambuc int g_field;
57f4a2713aSLionel Sambuc };
58f4a2713aSLionel Sambuc
59f4a2713aSLionel Sambuc struct H : public G,
60f4a2713aSLionel Sambuc public virtual D
61f4a2713aSLionel Sambuc {
62f4a2713aSLionel Sambuc };
63f4a2713aSLionel Sambuc
64f4a2713aSLionel Sambuc struct I : public virtual D
65f4a2713aSLionel Sambuc {
~II66f4a2713aSLionel Sambuc virtual ~I(){}
67f4a2713aSLionel Sambuc double q;
68f4a2713aSLionel Sambuc };
69f4a2713aSLionel Sambuc
70f4a2713aSLionel Sambuc struct K
71f4a2713aSLionel Sambuc {
72f4a2713aSLionel Sambuc int k;
73f4a2713aSLionel Sambuc };
74f4a2713aSLionel Sambuc
75f4a2713aSLionel Sambuc struct L
76f4a2713aSLionel Sambuc {
77f4a2713aSLionel Sambuc int l;
78f4a2713aSLionel Sambuc };
79f4a2713aSLionel Sambuc
80f4a2713aSLionel Sambuc struct M : public virtual K
81f4a2713aSLionel Sambuc {
82f4a2713aSLionel Sambuc int m;
83f4a2713aSLionel Sambuc };
84f4a2713aSLionel Sambuc
85f4a2713aSLionel Sambuc struct N : public L, public M
86f4a2713aSLionel Sambuc {
fN87f4a2713aSLionel Sambuc virtual void f(){}
88f4a2713aSLionel Sambuc };
89f4a2713aSLionel Sambuc
90f4a2713aSLionel Sambuc struct O : public H, public G {
foO91f4a2713aSLionel Sambuc virtual void fo(){}
92f4a2713aSLionel Sambuc };
93f4a2713aSLionel Sambuc
94f4a2713aSLionel Sambuc struct P : public M, public virtual L {
95f4a2713aSLionel Sambuc int p;
96f4a2713aSLionel Sambuc };
97f4a2713aSLionel Sambuc
98f4a2713aSLionel Sambuc struct R {};
99f4a2713aSLionel Sambuc
100f4a2713aSLionel Sambuc class IA {
101f4a2713aSLionel Sambuc public:
~IA()102f4a2713aSLionel Sambuc virtual ~IA(){}
103f4a2713aSLionel Sambuc virtual void ia() = 0;
104f4a2713aSLionel Sambuc };
105f4a2713aSLionel Sambuc
106f4a2713aSLionel Sambuc class ICh : public virtual IA {
107f4a2713aSLionel Sambuc public:
~ICh()108f4a2713aSLionel Sambuc virtual ~ICh(){}
ia()109f4a2713aSLionel Sambuc virtual void ia(){}
iCh()110f4a2713aSLionel Sambuc virtual void iCh(){}
111f4a2713aSLionel Sambuc };
112f4a2713aSLionel Sambuc
113f4a2713aSLionel Sambuc struct f {
asdf114f4a2713aSLionel Sambuc virtual int asd() {return -90;}
115f4a2713aSLionel Sambuc };
116f4a2713aSLionel Sambuc
117f4a2713aSLionel Sambuc struct s : public virtual f {
~ss118f4a2713aSLionel Sambuc virtual ~s(){}
119f4a2713aSLionel Sambuc int r;
asds120f4a2713aSLionel Sambuc virtual int asd() {return -9;}
121f4a2713aSLionel Sambuc };
122f4a2713aSLionel Sambuc
123f4a2713aSLionel Sambuc struct sd : virtual s, virtual ICh {
~sdsd124f4a2713aSLionel Sambuc virtual ~sd(){}
125f4a2713aSLionel Sambuc int q;
126f4a2713aSLionel Sambuc char y;
asdsd127f4a2713aSLionel Sambuc virtual int asd() {return -1;}
128f4a2713aSLionel Sambuc };
129f4a2713aSLionel Sambuc struct AV {
130f4a2713aSLionel Sambuc virtual void foo();
131f4a2713aSLionel Sambuc };
132f4a2713aSLionel Sambuc struct BV : AV {
133f4a2713aSLionel Sambuc };
134f4a2713aSLionel Sambuc struct CV : virtual BV {
135f4a2713aSLionel Sambuc CV();
136f4a2713aSLionel Sambuc virtual void foo();
137f4a2713aSLionel Sambuc };
138f4a2713aSLionel Sambuc struct DV : BV {
139f4a2713aSLionel Sambuc };
140f4a2713aSLionel Sambuc struct EV : CV, DV {
141f4a2713aSLionel Sambuc };
142f4a2713aSLionel Sambuc #pragma pack(pop)
143f4a2713aSLionel Sambuc
144f4a2713aSLionel Sambuc // This needs only for building layouts.
145f4a2713aSLionel Sambuc // Without this clang doesn`t dump record layouts.
main()146f4a2713aSLionel Sambuc int main() {
147f4a2713aSLionel Sambuc // This avoid "Can't yet mangle constructors!" for MS ABI.
148f4a2713aSLionel Sambuc C* c;
149f4a2713aSLionel Sambuc c->foo();
150f4a2713aSLionel Sambuc DerivedStruct* v;
151f4a2713aSLionel Sambuc H* g;
152f4a2713aSLionel Sambuc BaseStruct* u;
153f4a2713aSLionel Sambuc I* i;
154f4a2713aSLionel Sambuc N* n;
155f4a2713aSLionel Sambuc O* o;
156f4a2713aSLionel Sambuc P* p;
157f4a2713aSLionel Sambuc R* r;
158f4a2713aSLionel Sambuc sd *h;
159f4a2713aSLionel Sambuc EV *j;
160f4a2713aSLionel Sambuc return 0;
161f4a2713aSLionel Sambuc }
162f4a2713aSLionel Sambuc
163f4a2713aSLionel Sambuc // CHECK: 0 | class D
164f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (D vftable pointer)
165f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | double a
166f4a2713aSLionel Sambuc
167f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=16, align=8
168f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=16, nvalign=8
169f4a2713aSLionel Sambuc
170f4a2713aSLionel Sambuc // CHECK: %class.D = type { i32 (...)**, double }
171f4a2713aSLionel Sambuc
172f4a2713aSLionel Sambuc // CHECK: 0 | class B
173f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (B vftable pointer)
174f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | int b_field
175f4a2713aSLionel Sambuc
176f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=8, align=4
177f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=8, nvalign=4
178f4a2713aSLionel Sambuc
179f4a2713aSLionel Sambuc // CHECK: %class.B = type { i32 (...)**, i32 }
180f4a2713aSLionel Sambuc
181f4a2713aSLionel Sambuc // CHECK: 0 | class A
182f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | class B (primary base)
183f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (B vftable pointer)
184f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | int b_field
185f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | int a_field
186f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | char one
187f4a2713aSLionel Sambuc
188f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=16, align=4
189f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=16, nvalign=4
190f4a2713aSLionel Sambuc
191f4a2713aSLionel Sambuc // CHECK: 0 | class C
192f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | class D (primary base)
193f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (D vftable pointer)
194f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | double a
195f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | class B (base)
196f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | (B vftable pointer)
197f4a2713aSLionel Sambuc // CHECK-NEXT: 20 | int b_field
198f4a2713aSLionel Sambuc // CHECK-NEXT: 24 | (C vbtable pointer)
199f4a2713aSLionel Sambuc // CHECK-NEXT: 32 | double c1_field
200f4a2713aSLionel Sambuc // CHECK-NEXT: 40 | int c2_field
201f4a2713aSLionel Sambuc // CHECK-NEXT: 48 | double c3_field
202f4a2713aSLionel Sambuc // CHECK-NEXT: 56 | int c4_field
203f4a2713aSLionel Sambuc // CHECK-NEXT: 64 | class A (virtual base)
204f4a2713aSLionel Sambuc // CHECK-NEXT: 64 | class B (primary base)
205f4a2713aSLionel Sambuc // CHECK-NEXT: 64 | (B vftable pointer)
206f4a2713aSLionel Sambuc // CHECK-NEXT: 68 | int b_field
207f4a2713aSLionel Sambuc // CHECK-NEXT: 72 | int a_field
208f4a2713aSLionel Sambuc // CHECK-NEXT: 76 | char one
209f4a2713aSLionel Sambuc
210f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=80, align=8
211f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=64, nvalign=8
212f4a2713aSLionel Sambuc
213f4a2713aSLionel Sambuc // CHECK: %class.A = type { %class.B, i32, i8 }
214f4a2713aSLionel Sambuc
215f4a2713aSLionel Sambuc // CHECK: %class.C = type { %class.D, %class.B, i32*, double, i32, double, i32, [4 x i8], %class.A }
216f4a2713aSLionel Sambuc // CHECK: %class.C.base = type { %class.D, %class.B, i32*, double, i32, double, i32 }
217f4a2713aSLionel Sambuc
218f4a2713aSLionel Sambuc // CHECK: 0 | struct BaseStruct
219f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | double v0
220f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | float v1
221f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | class C fg
222f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | class D (primary base)
223f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | (D vftable pointer)
224f4a2713aSLionel Sambuc // CHECK-NEXT: 24 | double a
225f4a2713aSLionel Sambuc // CHECK-NEXT: 32 | class B (base)
226f4a2713aSLionel Sambuc // CHECK-NEXT: 32 | (B vftable pointer)
227f4a2713aSLionel Sambuc // CHECK-NEXT: 36 | int b_field
228f4a2713aSLionel Sambuc // CHECK-NEXT: 40 | (C vbtable pointer)
229f4a2713aSLionel Sambuc // CHECK-NEXT: 48 | double c1_field
230f4a2713aSLionel Sambuc // CHECK-NEXT: 56 | int c2_field
231f4a2713aSLionel Sambuc // CHECK-NEXT: 64 | double c3_field
232f4a2713aSLionel Sambuc // CHECK-NEXT: 72 | int c4_field
233f4a2713aSLionel Sambuc // CHECK-NEXT: 80 | class A (virtual base)
234f4a2713aSLionel Sambuc // CHECK-NEXT: 80 | class B (primary base)
235f4a2713aSLionel Sambuc // CHECK-NEXT: 80 | (B vftable pointer)
236f4a2713aSLionel Sambuc // CHECK-NEXT: 84 | int b_field
237f4a2713aSLionel Sambuc // CHECK-NEXT: 88 | int a_field
238f4a2713aSLionel Sambuc // CHECK-NEXT: 92 | char one
239f4a2713aSLionel Sambuc
240f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=80, align=8
241f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=64, nvalign=8
242f4a2713aSLionel Sambuc
243f4a2713aSLionel Sambuc // CHECK: sizeof=96, align=8
244f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=96, nvalign=8
245f4a2713aSLionel Sambuc
246f4a2713aSLionel Sambuc // CHECK: %struct.BaseStruct = type { double, float, %class.C }
247f4a2713aSLionel Sambuc
248f4a2713aSLionel Sambuc // CHECK: 0 | struct DerivedStruct
249f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | struct BaseStruct (base)
250f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | double v0
251f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | float v1
252f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | class C fg
253f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | class D (primary base)
254f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | (D vftable pointer)
255f4a2713aSLionel Sambuc // CHECK-NEXT: 24 | double a
256f4a2713aSLionel Sambuc // CHECK-NEXT: 32 | class B (base)
257f4a2713aSLionel Sambuc // CHECK-NEXT: 32 | (B vftable pointer)
258f4a2713aSLionel Sambuc // CHECK-NEXT: 36 | int b_field
259f4a2713aSLionel Sambuc // CHECK-NEXT: 40 | (C vbtable pointer)
260f4a2713aSLionel Sambuc // CHECK-NEXT: 48 | double c1_field
261f4a2713aSLionel Sambuc // CHECK-NEXT: 56 | int c2_field
262f4a2713aSLionel Sambuc // CHECK-NEXT: 64 | double c3_field
263f4a2713aSLionel Sambuc // CHECK-NEXT: 72 | int c4_field
264f4a2713aSLionel Sambuc // CHECK-NEXT: 80 | class A (virtual base)
265f4a2713aSLionel Sambuc // CHECK-NEXT: 80 | class B (primary base)
266f4a2713aSLionel Sambuc // CHECK-NEXT: 80 | (B vftable pointer)
267f4a2713aSLionel Sambuc // CHECK-NEXT: 84 | int b_field
268f4a2713aSLionel Sambuc // CHECK-NEXT: 88 | int a_field
269f4a2713aSLionel Sambuc // CHECK-NEXT: 92 | char one
270f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=80, align=8
271f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=64, nvalign=8
272f4a2713aSLionel Sambuc
273f4a2713aSLionel Sambuc // CHECK: 96 | int x
274f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=104, align=8
275f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=104, nvalign=8
276f4a2713aSLionel Sambuc
277f4a2713aSLionel Sambuc // CHECK: %struct.DerivedStruct = type { %struct.BaseStruct, i32 }
278f4a2713aSLionel Sambuc
279f4a2713aSLionel Sambuc // CHECK: 0 | struct G
280f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | int g_field
281f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=4, align=4
282f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=4, nvalign=4
283f4a2713aSLionel Sambuc
284f4a2713aSLionel Sambuc // CHECK: 0 | struct H
285f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | struct G (base)
286f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | int g_field
287f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | (H vbtable pointer)
288f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | class D (virtual base)
289f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | (D vftable pointer)
290f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | double a
291f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=24, align=8
292*0a6a1f1dSLionel Sambuc // CHECK-NEXT: nvsize=8, nvalign=8
293f4a2713aSLionel Sambuc
294f4a2713aSLionel Sambuc // CHECK: %struct.H = type { %struct.G, i32*, %class.D }
295f4a2713aSLionel Sambuc
296f4a2713aSLionel Sambuc // CHECK: 0 | struct I
297f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (I vftable pointer)
298f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | (I vbtable pointer)
299f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | double q
300f4a2713aSLionel Sambuc // CHECK-NEXT: 24 | class D (virtual base)
301f4a2713aSLionel Sambuc // CHECK-NEXT: 24 | (D vftable pointer)
302f4a2713aSLionel Sambuc // CHECK-NEXT: 32 | double a
303f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=40, align=8
304f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=24, nvalign=8
305f4a2713aSLionel Sambuc
306f4a2713aSLionel Sambuc // CHECK: %struct.I = type { i32 (...)**, [4 x i8], i32*, double, %class.D }
307f4a2713aSLionel Sambuc // CHECK: %struct.I.base = type { i32 (...)**, [4 x i8], i32*, double }
308f4a2713aSLionel Sambuc
309f4a2713aSLionel Sambuc // CHECK: 0 | struct L
310f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | int l
311f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=4, align=4
312f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=4, nvalign=4
313f4a2713aSLionel Sambuc
314f4a2713aSLionel Sambuc // CHECK: 0 | struct K
315f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | int k
316f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=4, align=4
317f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=4, nvalign=4
318f4a2713aSLionel Sambuc
319f4a2713aSLionel Sambuc // CHECK: 0 | struct M
320f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (M vbtable pointer)
321f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | int m
322f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | struct K (virtual base)
323f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | int k
324f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=12, align=4
325f4a2713aSLionel Sambuc
326f4a2713aSLionel Sambuc //CHECK: %struct.M = type { i32*, i32, %struct.K }
327f4a2713aSLionel Sambuc //CHECK: %struct.M.base = type { i32*, i32 }
328f4a2713aSLionel Sambuc
329f4a2713aSLionel Sambuc // CHECK: 0 | struct N
330f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (N vftable pointer)
331f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | struct L (base)
332f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | int l
333f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | struct M (base)
334f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | (M vbtable pointer)
335f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | int m
336f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | struct K (virtual base)
337f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | int k
338f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=20, align=4
339f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=16, nvalign=4
340f4a2713aSLionel Sambuc
341f4a2713aSLionel Sambuc //CHECK: %struct.N = type { i32 (...)**, %struct.L, %struct.M.base, %struct.K }
342f4a2713aSLionel Sambuc
343f4a2713aSLionel Sambuc // CHECK: 0 | struct O
344f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (O vftable pointer)
345f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | struct H (base)
346f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | struct G (base)
347f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | int g_field
348f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | (H vbtable pointer)
349f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | struct G (base)
350f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | int g_field
351f4a2713aSLionel Sambuc // CHECK-NEXT: 24 | class D (virtual base)
352f4a2713aSLionel Sambuc // CHECK-NEXT: 24 | (D vftable pointer)
353f4a2713aSLionel Sambuc // CHECK-NEXT: 32 | double a
354f4a2713aSLionel Sambuc // CHECK-NEXT: | [sizeof=40, align=8
355f4a2713aSLionel Sambuc // CHECK-NEXT: | nvsize=24, nvalign=8]
356f4a2713aSLionel Sambuc
357*0a6a1f1dSLionel Sambuc // CHECK: struct.O = type { i32 (...)**, [4 x i8], %struct.H.base, %struct.G, %class.D }
358f4a2713aSLionel Sambuc // CHECK: struct.O.base = type { i32 (...)**, [4 x i8], %struct.H.base, %struct.G, [4 x i8] }
359f4a2713aSLionel Sambuc
360f4a2713aSLionel Sambuc
361f4a2713aSLionel Sambuc // CHECK: 0 | struct P
362f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | struct M (base)
363f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (M vbtable pointer)
364f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | int m
365f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | int p
366f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | struct K (virtual base)
367f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | int k
368f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | struct L (virtual base)
369f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | int l
370f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=20, align=4
371f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=12, nvalign=4
372f4a2713aSLionel Sambuc
373f4a2713aSLionel Sambuc //CHECK: %struct.P = type { %struct.M.base, i32, %struct.K, %struct.L }
374f4a2713aSLionel Sambuc
375f4a2713aSLionel Sambuc // CHECK: 0 | struct R (empty)
376f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=1, align=1
377f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=0, nvalign=1
378f4a2713aSLionel Sambuc
379f4a2713aSLionel Sambuc //CHECK: %struct.R = type { i8 }
380f4a2713aSLionel Sambuc
381f4a2713aSLionel Sambuc // CHECK: 0 | struct f
382f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (f vftable pointer)
383f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=4, align=4
384f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=4, nvalign=4
385f4a2713aSLionel Sambuc
386f4a2713aSLionel Sambuc // CHECK: 0 | struct s
387f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (s vftable pointer)
388f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | (s vbtable pointer)
389f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | int r
390f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | (vtordisp for vbase f)
391f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | struct f (virtual base)
392f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | (f vftable pointer)
393f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=20, align=4
394f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=12, nvalign=4
395f4a2713aSLionel Sambuc
396f4a2713aSLionel Sambuc // CHECK: 0 | class IA
397f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (IA vftable pointer)
398f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=4, align=4
399f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=4, nvalign=4
400f4a2713aSLionel Sambuc
401f4a2713aSLionel Sambuc // CHECK: 0 | class ICh
402f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (ICh vftable pointer)
403f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | (ICh vbtable pointer)
404f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | (vtordisp for vbase IA)
405f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | class IA (virtual base)
406f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | (IA vftable pointer)
407f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=16, align=4
408f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=8, nvalign=4
409f4a2713aSLionel Sambuc
410f4a2713aSLionel Sambuc // CHECK: 0 | struct sd
411f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (sd vbtable pointer)
412f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | int q
413f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | char y
414f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | (vtordisp for vbase f)
415f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | struct f (virtual base)
416f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | (f vftable pointer)
417f4a2713aSLionel Sambuc // CHECK-NEXT: 20 | struct s (virtual base)
418f4a2713aSLionel Sambuc // CHECK-NEXT: 20 | (s vftable pointer)
419f4a2713aSLionel Sambuc // CHECK-NEXT: 24 | (s vbtable pointer)
420f4a2713aSLionel Sambuc // CHECK-NEXT: 28 | int r
421f4a2713aSLionel Sambuc // CHECK-NEXT: 32 | (vtordisp for vbase IA)
422f4a2713aSLionel Sambuc // CHECK-NEXT: 36 | class IA (virtual base)
423f4a2713aSLionel Sambuc // CHECK-NEXT: 36 | (IA vftable pointer)
424f4a2713aSLionel Sambuc // CHECK-NEXT: 40 | class ICh (virtual base)
425f4a2713aSLionel Sambuc // CHECK-NEXT: 40 | (ICh vftable pointer)
426f4a2713aSLionel Sambuc // CHECK-NEXT: 44 | (ICh vbtable pointer)
427f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=48, align=4
428f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=12, nvalign=4
429f4a2713aSLionel Sambuc
430f4a2713aSLionel Sambuc // CHECK: %struct.f = type { i32 (...)** }
431*0a6a1f1dSLionel Sambuc // CHECK: %struct.s = type { i32 (...)**, i32*, i32, i32, %struct.f }
432f4a2713aSLionel Sambuc // CHECK: %class.IA = type { i32 (...)** }
433*0a6a1f1dSLionel Sambuc // CHECK: %class.ICh = type { i32 (...)**, i32*, i32, %class.IA }
434*0a6a1f1dSLionel Sambuc // CHECK: %struct.sd = type { i32*, i32, i8, i32, %struct.f, %struct.s.base, i32, %class.IA, %class.ICh.base }
435f4a2713aSLionel Sambuc
436f4a2713aSLionel Sambuc // CHECK: 0 | struct AV
437f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (AV vftable pointer)
438f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=4, align=4
439f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=4, nvalign=4
440f4a2713aSLionel Sambuc
441f4a2713aSLionel Sambuc
442f4a2713aSLionel Sambuc // CHECK: 0 | struct BV
443f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | struct AV (primary base)
444f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (AV vftable pointer)
445f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=4, align=4
446f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=4, nvalign=4
447f4a2713aSLionel Sambuc
448f4a2713aSLionel Sambuc
449f4a2713aSLionel Sambuc // CHECK: 0 | struct CV
450f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (CV vbtable pointer)
451f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | (vtordisp for vbase BV)
452f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | struct BV (virtual base)
453f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | struct AV (primary base)
454f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | (AV vftable pointer)
455f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=12, align=4
456f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=4, nvalign=4
457f4a2713aSLionel Sambuc
458f4a2713aSLionel Sambuc // CHECK: %struct.AV = type { i32 (...)** }
459f4a2713aSLionel Sambuc // CHECK: %struct.BV = type { %struct.AV }
460*0a6a1f1dSLionel Sambuc // CHECK: %struct.CV = type { i32*, i32, %struct.BV }
461f4a2713aSLionel Sambuc // CHECK: %struct.CV.base = type { i32* }
462f4a2713aSLionel Sambuc
463f4a2713aSLionel Sambuc // CHECK: 0 | struct DV
464f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | struct BV (primary base)
465f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | struct AV (primary base)
466f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (AV vftable pointer)
467f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=4, align=4
468f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=4, nvalign=4
469f4a2713aSLionel Sambuc
470f4a2713aSLionel Sambuc // CHECK: %struct.DV = type { %struct.BV }
471f4a2713aSLionel Sambuc
472f4a2713aSLionel Sambuc // CHECK: 0 | struct EV
473f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | struct DV (primary base)
474f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | struct BV (primary base)
475f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | struct AV (primary base)
476f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (AV vftable pointer)
477*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 4 | struct CV (base)
478*0a6a1f1dSLionel Sambuc // CHECK-NEXT: 4 | (CV vbtable pointer)
479f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | (vtordisp for vbase BV)
480f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | struct BV (virtual base)
481f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | struct AV (primary base)
482f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | (AV vftable pointer)
483f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=16, align=4
484f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=8, nvalign=4
485f4a2713aSLionel Sambuc
486*0a6a1f1dSLionel Sambuc // CHECK: %struct.EV = type { %struct.DV, %struct.CV.base, i32, %struct.BV }
487f4a2713aSLionel Sambuc // CHECK: %struct.EV.base = type { %struct.DV, %struct.CV.base }
488f4a2713aSLionel Sambuc
489f4a2713aSLionel Sambuc // Overriding a method means that all the vbases containing that
490f4a2713aSLionel Sambuc // method need a vtordisp. Note: this code will cause an error in cl.exe.
491f4a2713aSLionel Sambuc namespace test1 {
492f4a2713aSLionel Sambuc struct A { virtual void foo(); };
493f4a2713aSLionel Sambuc struct B : A {};
494f4a2713aSLionel Sambuc struct C : virtual A, virtual B { C(); virtual void foo(); };
test()495f4a2713aSLionel Sambuc void test() { C *c; }
496f4a2713aSLionel Sambuc
497f4a2713aSLionel Sambuc // CHECK: 0 | struct test1::C
498f4a2713aSLionel Sambuc // CHECK-NEXT: 0 | (C vbtable pointer)
499f4a2713aSLionel Sambuc // CHECK-NEXT: 4 | (vtordisp for vbase A)
500f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | struct test1::A (virtual base)
501f4a2713aSLionel Sambuc // CHECK-NEXT: 8 | (A vftable pointer)
502f4a2713aSLionel Sambuc // CHECK-NEXT: 12 | (vtordisp for vbase B)
503f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | struct test1::B (virtual base)
504f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | struct test1::A (primary base)
505f4a2713aSLionel Sambuc // CHECK-NEXT: 16 | (A vftable pointer)
506f4a2713aSLionel Sambuc // CHECK-NEXT: sizeof=20, align=4
507f4a2713aSLionel Sambuc // CHECK-NEXT: nvsize=4, nvalign=4
508f4a2713aSLionel Sambuc }
509