xref: /minix3/external/bsd/llvm/dist/clang/test/Sema/ms_class_layout.cpp (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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