blob: e58ca3f024d180dcdb8e94c194119daf48c8107b [file] [log] [blame]
Eli Friedman84d2d3a2011-09-27 19:12:27 +00001// RUN: %clang_cc1 -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -cxx-abi microsoft %s 2>&1 \
2// RUN: | FileCheck %s
3
4#pragma pack(push, 8)
5
6class B {
7public:
8 virtual void b(){}
9 int b_field;
10protected:
11private:
12};
13
14class A : public B {
15public:
16 int a_field;
17 virtual void a(){}
18 char one;
19protected:
20private:
21};
22
23class D {
24public:
25 virtual void b(){}
26 double a;
27};
28
29class C : public virtual A,
30 public D, public B {
31public:
32 double c1_field;
33 int c2_field;
34 double c3_field;
35 int c4_field;
36 virtual void foo(){}
37 virtual void bar(){}
38protected:
39private:
40};
41
42struct BaseStruct
43{
44 BaseStruct(){}
45 double v0;
46 float v1;
47 C fg;
48};
49
50struct DerivedStruct : public BaseStruct {
51 int x;
52};
53
54struct G
55{
Eli Friedman5e9534b2011-10-18 00:55:28 +000056 int g_field;
57};
58
59struct H : public G,
60 public virtual D
61{
Eli Friedman84d2d3a2011-09-27 19:12:27 +000062};
63
Eli Friedman43114f92011-10-21 22:49:56 +000064struct I : public virtual D
65{
66 virtual ~I(){}
67 double q;
68};
69
John McCall0153cd32011-11-08 04:01:03 +000070struct K
71{
72 int k;
73};
74
75struct L
76{
77 int l;
78};
79
80struct M : public virtual K
81{
82 int m;
83};
84
85struct N : public L, public M
86{
87 virtual void f(){}
88};
89
90struct O : public H, public G {
91 virtual void fo(){}
92};
93
94struct P : public M, public virtual L {
95 int p;
96};
97
Eli Friedman83a12582011-12-01 00:37:01 +000098struct R {};
John McCall0153cd32011-11-08 04:01:03 +000099
John McCalle42a3362012-05-01 08:55:32 +0000100class IA {
101public:
102 virtual ~IA(){}
103 virtual void ia() = 0;
104};
105
106class ICh : public virtual IA {
107public:
108 virtual ~ICh(){}
109 virtual void ia(){}
110 virtual void iCh(){}
111};
112
113struct f {
114 virtual int asd() {return -90;}
115};
116
117struct s : public virtual f {
118 virtual ~s(){}
119 int r;
120 virtual int asd() {return -9;}
121};
122
123struct sd : virtual s, virtual ICh {
124 virtual ~sd(){}
125 int q;
126 char y;
127 virtual int asd() {return -1;}
128};
129struct AV {
130 virtual void foo();
131};
132struct BV : AV {
133};
134struct CV : virtual BV {
135 CV();
136 virtual void foo();
137};
138struct DV : BV {
139};
140struct EV : CV, DV {
141};
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000142#pragma pack(pop)
143
144// This needs only for building layouts.
145// Without this clang doesn`t dump record layouts.
146int main() {
147 // This avoid "Can't yet mangle constructors!" for MS ABI.
148 C* c;
149 c->foo();
150 DerivedStruct* v;
Eli Friedman5e9534b2011-10-18 00:55:28 +0000151 H* g;
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000152 BaseStruct* u;
Eli Friedman43114f92011-10-21 22:49:56 +0000153 I* i;
John McCall0153cd32011-11-08 04:01:03 +0000154 N* n;
155 O* o;
156 P* p;
Eli Friedman83a12582011-12-01 00:37:01 +0000157 R* r;
John McCalle42a3362012-05-01 08:55:32 +0000158 sd *h;
159 EV *j;
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000160 return 0;
161}
162
163// CHECK: 0 | class D
Eli Friedman43114f92011-10-21 22:49:56 +0000164// CHECK-NEXT: 0 | (D vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000165// CHECK-NEXT: 8 | double a
166
Warren Hunt8f8bad72013-10-11 20:19:00 +0000167// CHECK-NEXT: sizeof=16, align=8
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000168// CHECK-NEXT: nvsize=16, nvalign=8
169
John McCall0153cd32011-11-08 04:01:03 +0000170// CHECK: %class.D = type { i32 (...)**, double }
Eli Friedmanfaaf2732011-10-21 23:03:08 +0000171
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000172// CHECK: 0 | class B
Eli Friedman43114f92011-10-21 22:49:56 +0000173// CHECK-NEXT: 0 | (B vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000174// CHECK-NEXT: 4 | int b_field
175
Warren Hunt8f8bad72013-10-11 20:19:00 +0000176// CHECK-NEXT: sizeof=8, align=4
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000177// CHECK-NEXT: nvsize=8, nvalign=4
178
John McCall0153cd32011-11-08 04:01:03 +0000179// CHECK: %class.B = type { i32 (...)**, i32 }
Eli Friedmanfaaf2732011-10-21 23:03:08 +0000180
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000181// CHECK: 0 | class A
182// CHECK-NEXT: 0 | class B (primary base)
Eli Friedman43114f92011-10-21 22:49:56 +0000183// CHECK-NEXT: 0 | (B vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000184// CHECK-NEXT: 4 | int b_field
185// CHECK-NEXT: 8 | int a_field
186// CHECK-NEXT: 12 | char one
187
Warren Hunt8f8bad72013-10-11 20:19:00 +0000188// CHECK-NEXT: sizeof=16, align=4
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000189// CHECK-NEXT: nvsize=16, nvalign=4
190
191// CHECK: 0 | class C
192// CHECK-NEXT: 0 | class D (primary base)
Eli Friedman43114f92011-10-21 22:49:56 +0000193// CHECK-NEXT: 0 | (D vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000194// CHECK-NEXT: 8 | double a
195// CHECK-NEXT: 16 | class B (base)
Eli Friedman43114f92011-10-21 22:49:56 +0000196// CHECK-NEXT: 16 | (B vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000197// CHECK-NEXT: 20 | int b_field
198// CHECK-NEXT: 24 | (C vbtable pointer)
199// CHECK-NEXT: 32 | double c1_field
200// CHECK-NEXT: 40 | int c2_field
201// CHECK-NEXT: 48 | double c3_field
202// CHECK-NEXT: 56 | int c4_field
203// CHECK-NEXT: 64 | class A (virtual base)
204// CHECK-NEXT: 64 | class B (primary base)
Eli Friedman43114f92011-10-21 22:49:56 +0000205// CHECK-NEXT: 64 | (B vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000206// CHECK-NEXT: 68 | int b_field
207// CHECK-NEXT: 72 | int a_field
208// CHECK-NEXT: 76 | char one
209
Warren Hunt8f8bad72013-10-11 20:19:00 +0000210// CHECK-NEXT: sizeof=80, align=8
Eli Friedman43114f92011-10-21 22:49:56 +0000211// CHECK-NEXT: nvsize=64, nvalign=8
Eli Friedmanfaaf2732011-10-21 23:03:08 +0000212
213// CHECK: %class.A = type { %class.B, i32, i8 }
214
John McCall0153cd32011-11-08 04:01:03 +0000215// CHECK: %class.C = type { %class.D, %class.B, i32*, double, i32, double, i32, [4 x i8], %class.A }
216// CHECK: %class.C.base = type { %class.D, %class.B, i32*, double, i32, double, i32 }
Eli Friedmanfaaf2732011-10-21 23:03:08 +0000217
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000218// CHECK: 0 | struct BaseStruct
219// CHECK-NEXT: 0 | double v0
220// CHECK-NEXT: 8 | float v1
221// CHECK-NEXT: 16 | class C fg
222// CHECK-NEXT: 16 | class D (primary base)
Eli Friedman43114f92011-10-21 22:49:56 +0000223// CHECK-NEXT: 16 | (D vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000224// CHECK-NEXT: 24 | double a
225// CHECK-NEXT: 32 | class B (base)
Eli Friedman43114f92011-10-21 22:49:56 +0000226// CHECK-NEXT: 32 | (B vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000227// CHECK-NEXT: 36 | int b_field
228// CHECK-NEXT: 40 | (C vbtable pointer)
229// CHECK-NEXT: 48 | double c1_field
230// CHECK-NEXT: 56 | int c2_field
231// CHECK-NEXT: 64 | double c3_field
232// CHECK-NEXT: 72 | int c4_field
233// CHECK-NEXT: 80 | class A (virtual base)
234// CHECK-NEXT: 80 | class B (primary base)
Eli Friedman43114f92011-10-21 22:49:56 +0000235// CHECK-NEXT: 80 | (B vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000236// CHECK-NEXT: 84 | int b_field
237// CHECK-NEXT: 88 | int a_field
238// CHECK-NEXT: 92 | char one
239
Warren Hunt8f8bad72013-10-11 20:19:00 +0000240// CHECK-NEXT: sizeof=80, align=8
Eli Friedman43114f92011-10-21 22:49:56 +0000241// CHECK-NEXT: nvsize=64, nvalign=8
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000242
Warren Hunt8f8bad72013-10-11 20:19:00 +0000243// CHECK: sizeof=96, align=8
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000244// CHECK-NEXT: nvsize=96, nvalign=8
245
Eli Friedmanfaaf2732011-10-21 23:03:08 +0000246// CHECK: %struct.BaseStruct = type { double, float, %class.C }
247
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000248// CHECK: 0 | struct DerivedStruct
249// CHECK-NEXT: 0 | struct BaseStruct (base)
250// CHECK-NEXT: 0 | double v0
251// CHECK-NEXT: 8 | float v1
252// CHECK-NEXT: 16 | class C fg
253// CHECK-NEXT: 16 | class D (primary base)
Eli Friedman43114f92011-10-21 22:49:56 +0000254// CHECK-NEXT: 16 | (D vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000255// CHECK-NEXT: 24 | double a
256// CHECK-NEXT: 32 | class B (base)
Eli Friedman43114f92011-10-21 22:49:56 +0000257// CHECK-NEXT: 32 | (B vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000258// CHECK-NEXT: 36 | int b_field
259// CHECK-NEXT: 40 | (C vbtable pointer)
260// CHECK-NEXT: 48 | double c1_field
261// CHECK-NEXT: 56 | int c2_field
262// CHECK-NEXT: 64 | double c3_field
263// CHECK-NEXT: 72 | int c4_field
264// CHECK-NEXT: 80 | class A (virtual base)
265// CHECK-NEXT: 80 | class B (primary base)
Eli Friedman43114f92011-10-21 22:49:56 +0000266// CHECK-NEXT: 80 | (B vftable pointer)
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000267// CHECK-NEXT: 84 | int b_field
268// CHECK-NEXT: 88 | int a_field
269// CHECK-NEXT: 92 | char one
Warren Hunt8f8bad72013-10-11 20:19:00 +0000270// CHECK-NEXT: sizeof=80, align=8
Eli Friedman43114f92011-10-21 22:49:56 +0000271// CHECK-NEXT: nvsize=64, nvalign=8
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000272
273// CHECK: 96 | int x
Warren Hunt8f8bad72013-10-11 20:19:00 +0000274// CHECK-NEXT: sizeof=104, align=8
Eli Friedman84d2d3a2011-09-27 19:12:27 +0000275// CHECK-NEXT: nvsize=104, nvalign=8
Eli Friedman5e9534b2011-10-18 00:55:28 +0000276
Eli Friedmanfaaf2732011-10-21 23:03:08 +0000277// CHECK: %struct.DerivedStruct = type { %struct.BaseStruct, i32 }
278
Eli Friedman5e9534b2011-10-18 00:55:28 +0000279// CHECK: 0 | struct G
280// CHECK-NEXT: 0 | int g_field
Warren Hunt8f8bad72013-10-11 20:19:00 +0000281// CHECK-NEXT: sizeof=4, align=4
Eli Friedman5e9534b2011-10-18 00:55:28 +0000282// CHECK-NEXT: nvsize=4, nvalign=4
283
Eli Friedman5e9534b2011-10-18 00:55:28 +0000284// CHECK: 0 | struct H
Eli Friedman5e9534b2011-10-18 00:55:28 +0000285// CHECK-NEXT: 0 | struct G (base)
286// CHECK-NEXT: 0 | int g_field
Eli Friedman43114f92011-10-21 22:49:56 +0000287// CHECK-NEXT: 4 | (H vbtable pointer)
Eli Friedman5e9534b2011-10-18 00:55:28 +0000288// CHECK-NEXT: 8 | class D (virtual base)
Eli Friedman43114f92011-10-21 22:49:56 +0000289// CHECK-NEXT: 8 | (D vftable pointer)
Eli Friedman5e9534b2011-10-18 00:55:28 +0000290// CHECK-NEXT: 16 | double a
Warren Hunt8f8bad72013-10-11 20:19:00 +0000291// CHECK-NEXT: sizeof=24, align=8
Warren Huntb7005662014-01-09 00:48:32 +0000292// CHECK-NEXT: nvsize=8, nvalign=8
Eli Friedman43114f92011-10-21 22:49:56 +0000293
John McCall0153cd32011-11-08 04:01:03 +0000294// CHECK: %struct.H = type { %struct.G, i32*, %class.D }
Eli Friedmanfaaf2732011-10-21 23:03:08 +0000295
Eli Friedman43114f92011-10-21 22:49:56 +0000296// CHECK: 0 | struct I
297// CHECK-NEXT: 0 | (I vftable pointer)
298// CHECK-NEXT: 8 | (I vbtable pointer)
299// CHECK-NEXT: 16 | double q
300// CHECK-NEXT: 24 | class D (virtual base)
301// CHECK-NEXT: 24 | (D vftable pointer)
302// CHECK-NEXT: 32 | double a
Warren Hunt8f8bad72013-10-11 20:19:00 +0000303// CHECK-NEXT: sizeof=40, align=8
Eli Friedman5e9534b2011-10-18 00:55:28 +0000304// CHECK-NEXT: nvsize=24, nvalign=8
Eli Friedmanfaaf2732011-10-21 23:03:08 +0000305
John McCall0153cd32011-11-08 04:01:03 +0000306// CHECK: %struct.I = type { i32 (...)**, [4 x i8], i32*, double, %class.D }
307// CHECK: %struct.I.base = type { i32 (...)**, [4 x i8], i32*, double }
308
309// CHECK: 0 | struct L
310// CHECK-NEXT: 0 | int l
Warren Hunt8f8bad72013-10-11 20:19:00 +0000311// CHECK-NEXT: sizeof=4, align=4
John McCall0153cd32011-11-08 04:01:03 +0000312// CHECK-NEXT: nvsize=4, nvalign=4
313
314// CHECK: 0 | struct K
315// CHECK-NEXT: 0 | int k
Warren Hunt8f8bad72013-10-11 20:19:00 +0000316// CHECK-NEXT: sizeof=4, align=4
John McCall0153cd32011-11-08 04:01:03 +0000317// CHECK-NEXT: nvsize=4, nvalign=4
318
319// CHECK: 0 | struct M
320// CHECK-NEXT: 0 | (M vbtable pointer)
321// CHECK-NEXT: 4 | int m
322// CHECK-NEXT: 8 | struct K (virtual base)
323// CHECK-NEXT: 8 | int k
Warren Hunt8f8bad72013-10-11 20:19:00 +0000324// CHECK-NEXT: sizeof=12, align=4
John McCall0153cd32011-11-08 04:01:03 +0000325
326//CHECK: %struct.M = type { i32*, i32, %struct.K }
327//CHECK: %struct.M.base = type { i32*, i32 }
328
329// CHECK: 0 | struct N
Warren Hunt8f8bad72013-10-11 20:19:00 +0000330// CHECK-NEXT: 0 | (N vftable pointer)
John McCall0153cd32011-11-08 04:01:03 +0000331// CHECK-NEXT: 4 | struct L (base)
332// CHECK-NEXT: 4 | int l
333// CHECK-NEXT: 8 | struct M (base)
334// CHECK-NEXT: 8 | (M vbtable pointer)
335// CHECK-NEXT: 12 | int m
John McCall0153cd32011-11-08 04:01:03 +0000336// CHECK-NEXT: 16 | struct K (virtual base)
337// CHECK-NEXT: 16 | int k
Warren Hunt8f8bad72013-10-11 20:19:00 +0000338// CHECK-NEXT: sizeof=20, align=4
John McCall0153cd32011-11-08 04:01:03 +0000339// CHECK-NEXT: nvsize=16, nvalign=4
340
341//CHECK: %struct.N = type { i32 (...)**, %struct.L, %struct.M.base, %struct.K }
342
John McCall0153cd32011-11-08 04:01:03 +0000343// CHECK: 0 | struct O
John McCall0153cd32011-11-08 04:01:03 +0000344// CHECK-NEXT: 0 | (O vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000345// CHECK-NEXT: 8 | struct H (base)
346// CHECK-NEXT: 8 | struct G (base)
347// CHECK-NEXT: 8 | int g_field
348// CHECK-NEXT: 12 | (H vbtable pointer)
349// CHECK-NEXT: 16 | struct G (base)
350// CHECK-NEXT: 16 | int g_field
351// CHECK-NEXT: 24 | class D (virtual base)
352// CHECK-NEXT: 24 | (D vftable pointer)
353// CHECK-NEXT: 32 | double a
354// CHECK-NEXT: | [sizeof=40, align=8
355// CHECK-NEXT: | nvsize=24, nvalign=8]
John McCall0153cd32011-11-08 04:01:03 +0000356
Warren Hunt8f8bad72013-10-11 20:19:00 +0000357// CHECK: struct.O = type { i32 (...)**, [4 x i8], %struct.H.base, %struct.G, [4 x i8], %class.D }
358// CHECK: struct.O.base = type { i32 (...)**, [4 x i8], %struct.H.base, %struct.G, [4 x i8] }
359
John McCall0153cd32011-11-08 04:01:03 +0000360
361// CHECK: 0 | struct P
362// CHECK-NEXT: 0 | struct M (base)
363// CHECK-NEXT: 0 | (M vbtable pointer)
364// CHECK-NEXT: 4 | int m
365// CHECK-NEXT: 8 | int p
366// CHECK-NEXT: 12 | struct K (virtual base)
367// CHECK-NEXT: 12 | int k
368// CHECK-NEXT: 16 | struct L (virtual base)
369// CHECK-NEXT: 16 | int l
Warren Hunt8f8bad72013-10-11 20:19:00 +0000370// CHECK-NEXT: sizeof=20, align=4
John McCall0153cd32011-11-08 04:01:03 +0000371// CHECK-NEXT: nvsize=12, nvalign=4
372
373//CHECK: %struct.P = type { %struct.M.base, i32, %struct.K, %struct.L }
Eli Friedman83a12582011-12-01 00:37:01 +0000374
375// CHECK: 0 | struct R (empty)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000376// CHECK-NEXT: sizeof=1, align=1
Eli Friedman83a12582011-12-01 00:37:01 +0000377// CHECK-NEXT: nvsize=0, nvalign=1
378
379//CHECK: %struct.R = type { i8 }
John McCalle42a3362012-05-01 08:55:32 +0000380
381// CHECK: 0 | struct f
382// CHECK-NEXT: 0 | (f vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000383// CHECK-NEXT: sizeof=4, align=4
John McCalle42a3362012-05-01 08:55:32 +0000384// CHECK-NEXT: nvsize=4, nvalign=4
385
386// CHECK: 0 | struct s
387// CHECK-NEXT: 0 | (s vftable pointer)
388// CHECK-NEXT: 4 | (s vbtable pointer)
389// CHECK-NEXT: 8 | int r
390// CHECK-NEXT: 12 | (vtordisp for vbase f)
391// CHECK-NEXT: 16 | struct f (virtual base)
392// CHECK-NEXT: 16 | (f vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000393// CHECK-NEXT: sizeof=20, align=4
John McCalle42a3362012-05-01 08:55:32 +0000394// CHECK-NEXT: nvsize=12, nvalign=4
395
396// CHECK: 0 | class IA
397// CHECK-NEXT: 0 | (IA vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000398// CHECK-NEXT: sizeof=4, align=4
John McCalle42a3362012-05-01 08:55:32 +0000399// CHECK-NEXT: nvsize=4, nvalign=4
400
401// CHECK: 0 | class ICh
402// CHECK-NEXT: 0 | (ICh vftable pointer)
403// CHECK-NEXT: 4 | (ICh vbtable pointer)
404// CHECK-NEXT: 8 | (vtordisp for vbase IA)
405// CHECK-NEXT: 12 | class IA (virtual base)
406// CHECK-NEXT: 12 | (IA vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000407// CHECK-NEXT: sizeof=16, align=4
John McCalle42a3362012-05-01 08:55:32 +0000408// CHECK-NEXT: nvsize=8, nvalign=4
409
410// CHECK: 0 | struct sd
411// CHECK-NEXT: 0 | (sd vbtable pointer)
412// CHECK-NEXT: 4 | int q
413// CHECK-NEXT: 8 | char y
414// CHECK-NEXT: 12 | (vtordisp for vbase f)
415// CHECK-NEXT: 16 | struct f (virtual base)
416// CHECK-NEXT: 16 | (f vftable pointer)
417// CHECK-NEXT: 20 | struct s (virtual base)
418// CHECK-NEXT: 20 | (s vftable pointer)
419// CHECK-NEXT: 24 | (s vbtable pointer)
420// CHECK-NEXT: 28 | int r
421// CHECK-NEXT: 32 | (vtordisp for vbase IA)
422// CHECK-NEXT: 36 | class IA (virtual base)
423// CHECK-NEXT: 36 | (IA vftable pointer)
424// CHECK-NEXT: 40 | class ICh (virtual base)
425// CHECK-NEXT: 40 | (ICh vftable pointer)
426// CHECK-NEXT: 44 | (ICh vbtable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000427// CHECK-NEXT: sizeof=48, align=4
John McCalle42a3362012-05-01 08:55:32 +0000428// CHECK-NEXT: nvsize=12, nvalign=4
429
430// CHECK: %struct.f = type { i32 (...)** }
431// CHECK: %struct.s = type { i32 (...)**, i32*, i32, [4 x i8], %struct.f }
432// CHECK: %class.IA = type { i32 (...)** }
433// CHECK: %class.ICh = type { i32 (...)**, i32*, [4 x i8], %class.IA }
434// CHECK: %struct.sd = type { i32*, i32, i8, [7 x i8], %struct.f, %struct.s.base, [4 x i8], %class.IA, %class.ICh.base }
435
436// CHECK: 0 | struct AV
437// CHECK-NEXT: 0 | (AV vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000438// CHECK-NEXT: sizeof=4, align=4
John McCalle42a3362012-05-01 08:55:32 +0000439// CHECK-NEXT: nvsize=4, nvalign=4
440
441
442// CHECK: 0 | struct BV
443// CHECK-NEXT: 0 | struct AV (primary base)
444// CHECK-NEXT: 0 | (AV vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000445// CHECK-NEXT: sizeof=4, align=4
John McCalle42a3362012-05-01 08:55:32 +0000446// CHECK-NEXT: nvsize=4, nvalign=4
447
448
449// CHECK: 0 | struct CV
450// CHECK-NEXT: 0 | (CV vbtable pointer)
451// CHECK-NEXT: 4 | (vtordisp for vbase BV)
452// CHECK-NEXT: 8 | struct BV (virtual base)
453// CHECK-NEXT: 8 | struct AV (primary base)
454// CHECK-NEXT: 8 | (AV vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000455// CHECK-NEXT: sizeof=12, align=4
John McCalle42a3362012-05-01 08:55:32 +0000456// CHECK-NEXT: nvsize=4, nvalign=4
457
458// CHECK: %struct.AV = type { i32 (...)** }
459// CHECK: %struct.BV = type { %struct.AV }
460// CHECK: %struct.CV = type { i32*, [4 x i8], %struct.BV }
461// CHECK: %struct.CV.base = type { i32* }
462
463// CHECK: 0 | struct DV
464// CHECK-NEXT: 0 | struct BV (primary base)
465// CHECK-NEXT: 0 | struct AV (primary base)
466// CHECK-NEXT: 0 | (AV vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000467// CHECK-NEXT: sizeof=4, align=4
John McCalle42a3362012-05-01 08:55:32 +0000468// CHECK-NEXT: nvsize=4, nvalign=4
469
470// CHECK: %struct.DV = type { %struct.BV }
471
472// CHECK: 0 | struct EV
473// CHECK-NEXT: 4 | struct CV (base)
474// CHECK-NEXT: 4 | (CV vbtable pointer)
475// CHECK-NEXT: 0 | struct DV (primary base)
476// CHECK-NEXT: 0 | struct BV (primary base)
477// CHECK-NEXT: 0 | struct AV (primary base)
478// CHECK-NEXT: 0 | (AV vftable pointer)
479// CHECK-NEXT: 8 | (vtordisp for vbase BV)
480// CHECK-NEXT: 12 | struct BV (virtual base)
481// CHECK-NEXT: 12 | struct AV (primary base)
482// CHECK-NEXT: 12 | (AV vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000483// CHECK-NEXT: sizeof=16, align=4
John McCalle42a3362012-05-01 08:55:32 +0000484// CHECK-NEXT: nvsize=8, nvalign=4
485
486// CHECK: %struct.EV = type { %struct.DV, %struct.CV.base, [4 x i8], %struct.BV }
487// CHECK: %struct.EV.base = type { %struct.DV, %struct.CV.base }
488
489// Overriding a method means that all the vbases containing that
Warren Hunt8f8bad72013-10-11 20:19:00 +0000490// method need a vtordisp. Note: this code will cause an error in cl.exe.
John McCalle42a3362012-05-01 08:55:32 +0000491namespace test1 {
492 struct A { virtual void foo(); };
493 struct B : A {};
John McCallaeb11a82012-05-01 08:59:06 +0000494 struct C : virtual A, virtual B { C(); virtual void foo(); };
John McCalle42a3362012-05-01 08:55:32 +0000495 void test() { C *c; }
496
497// CHECK: 0 | struct test1::C
498// CHECK-NEXT: 0 | (C vbtable pointer)
499// CHECK-NEXT: 4 | (vtordisp for vbase A)
500// CHECK-NEXT: 8 | struct test1::A (virtual base)
501// CHECK-NEXT: 8 | (A vftable pointer)
502// CHECK-NEXT: 12 | (vtordisp for vbase B)
503// CHECK-NEXT: 16 | struct test1::B (virtual base)
504// CHECK-NEXT: 16 | struct test1::A (primary base)
505// CHECK-NEXT: 16 | (A vftable pointer)
Warren Hunt8f8bad72013-10-11 20:19:00 +0000506// CHECK-NEXT: sizeof=20, align=4
John McCalle42a3362012-05-01 08:55:32 +0000507// CHECK-NEXT: nvsize=4, nvalign=4
508}