blob: 6a37eb1d1fce3dacb6d37b2bd3addd9c15f46460 [file] [log] [blame]
Warren Huntbd1b0c62013-10-14 19:08:58 +00001// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>&1 \
2// RUN: | FileCheck %s
Warren Hunt55d8e822013-10-23 23:53:07 +00003// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
4// RUN: | FileCheck %s -check-prefix CHECK-X64
Warren Huntbd1b0c62013-10-14 19:08:58 +00005
6extern "C" int printf(const char *fmt, ...);
7
8struct B0 {
9 int a;
10 B0() : a(0xf00000B0) {}
11 virtual void f() { printf("B0"); }
12};
13
14struct __declspec(align(16)) B1 {
15 int a;
16 B1() : a(0xf00000B1) {}
17 virtual void f() { printf("B1"); }
18};
19
20struct __declspec(align(16)) Align16 {};
21struct __declspec(align(32)) Align32 {};
22struct VAlign16 : virtual Align16 {};
23struct VAlign32 : virtual Align32 {};
24
25struct A : virtual B0, virtual B1 {
26 int a;
27 A() : a(0xf000000A) {}
28 virtual void f() { printf("A"); }
29 virtual void g() { printf("A"); }
30};
31
32// CHECK: *** Dumping AST Record Layout
33// CHECK: 0 | struct A
34// CHECK: 0 | (A vftable pointer)
35// CHECK: 4 | (A vbtable pointer)
36// CHECK: 8 | int a
37// CHECK: 16 | (vtordisp for vbase B0)
38// CHECK: 20 | struct B0 (virtual base)
39// CHECK: 20 | (B0 vftable pointer)
40// CHECK: 24 | int a
41// CHECK: 44 | (vtordisp for vbase B1)
42// CHECK: 48 | struct B1 (virtual base)
43// CHECK: 48 | (B1 vftable pointer)
44// CHECK: 52 | int a
45// CHECK: | [sizeof=64, align=16
46// CHECK: | nvsize=12, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000047// CHECK-X64: *** Dumping AST Record Layout
48// CHECK-X64: 0 | struct A
49// CHECK-X64: 0 | (A vftable pointer)
50// CHECK-X64: 8 | (A vbtable pointer)
51// CHECK-X64: 16 | int a
52// CHECK-X64: 36 | (vtordisp for vbase B0)
53// CHECK-X64: 40 | struct B0 (virtual base)
54// CHECK-X64: 40 | (B0 vftable pointer)
55// CHECK-X64: 48 | int a
56// CHECK-X64: 76 | (vtordisp for vbase B1)
57// CHECK-X64: 80 | struct B1 (virtual base)
58// CHECK-X64: 80 | (B1 vftable pointer)
59// CHECK-X64: 88 | int a
60// CHECK-X64: | [sizeof=96, align=16
61// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000062
63struct C : virtual B0, virtual B1, VAlign32 {
64 int a;
65 C() : a(0xf000000C) {}
66 virtual void f() { printf("C"); }
67 virtual void g() { printf("C"); }
68};
69
70// CHECK: *** Dumping AST Record Layout
71// CHECK: 0 | struct C
72// CHECK: 0 | (C vftable pointer)
73// CHECK: 32 | struct VAlign32 (base)
74// CHECK: 32 | (VAlign32 vbtable pointer)
75// CHECK: 36 | int a
76// CHECK: 64 | (vtordisp for vbase B0)
77// CHECK: 68 | struct B0 (virtual base)
78// CHECK: 68 | (B0 vftable pointer)
79// CHECK: 72 | int a
80// CHECK: 108 | (vtordisp for vbase B1)
81// CHECK: 112 | struct B1 (virtual base)
82// CHECK: 112 | (B1 vftable pointer)
83// CHECK: 116 | int a
84// CHECK: 128 | struct Align32 (virtual base) (empty)
85// CHECK: | [sizeof=128, align=32
86// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +000087// CHECK-X64: *** Dumping AST Record Layout
88// CHECK-X64: 0 | struct C
89// CHECK-X64: 0 | (C vftable pointer)
90// CHECK-X64: 32 | struct VAlign32 (base)
91// CHECK-X64: 32 | (VAlign32 vbtable pointer)
92// CHECK-X64: 40 | int a
93// CHECK-X64: 68 | (vtordisp for vbase B0)
94// CHECK-X64: 72 | struct B0 (virtual base)
95// CHECK-X64: 72 | (B0 vftable pointer)
96// CHECK-X64: 80 | int a
97// CHECK-X64: 108 | (vtordisp for vbase B1)
98// CHECK-X64: 112 | struct B1 (virtual base)
99// CHECK-X64: 112 | (B1 vftable pointer)
100// CHECK-X64: 120 | int a
101// CHECK-X64: 128 | struct Align32 (virtual base) (empty)
102// CHECK-X64: | [sizeof=128, align=32
103// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000104
105struct __declspec(align(32)) D : virtual B0, virtual B1 {
106 int a;
107 D() : a(0xf000000D) {}
108 virtual void f() { printf("D"); }
109 virtual void g() { printf("D"); }
110};
111
112// CHECK: *** Dumping AST Record Layout
113// CHECK: 0 | struct D
114// CHECK: 0 | (D vftable pointer)
115// CHECK: 4 | (D vbtable pointer)
116// CHECK: 8 | int a
117// CHECK: 32 | (vtordisp for vbase B0)
118// CHECK: 36 | struct B0 (virtual base)
119// CHECK: 36 | (B0 vftable pointer)
120// CHECK: 40 | int a
121// CHECK: 76 | (vtordisp for vbase B1)
122// CHECK: 80 | struct B1 (virtual base)
123// CHECK: 80 | (B1 vftable pointer)
124// CHECK: 84 | int a
125// CHECK: | [sizeof=96, align=32
126// CHECK: | nvsize=12, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000127// CHECK-X64: *** Dumping AST Record Layout
128// CHECK-X64: 0 | struct D
129// CHECK-X64: 0 | (D vftable pointer)
130// CHECK-X64: 8 | (D vbtable pointer)
131// CHECK-X64: 16 | int a
132// CHECK-X64: 36 | (vtordisp for vbase B0)
133// CHECK-X64: 40 | struct B0 (virtual base)
134// CHECK-X64: 40 | (B0 vftable pointer)
135// CHECK-X64: 48 | int a
136// CHECK-X64: 76 | (vtordisp for vbase B1)
137// CHECK-X64: 80 | struct B1 (virtual base)
138// CHECK-X64: 80 | (B1 vftable pointer)
139// CHECK-X64: 88 | int a
140// CHECK-X64: | [sizeof=96, align=32
141// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000142
Warren Hunt55d8e822013-10-23 23:53:07 +0000143struct AT {
144 virtual ~AT(){}
145};
146struct CT : virtual AT {
147 virtual ~CT();
148};
Warren Hunt42be7762013-10-14 20:14:09 +0000149CT::~CT(){}
150
Warren Hunt55d8e822013-10-23 23:53:07 +0000151// CHECK: *** Dumping AST Record Layout
152// CHECK: 0 | struct CT
153// CHECK: 0 | (CT vbtable pointer)
154// CHECK: 4 | struct AT (virtual base)
155// CHECK: 4 | (AT vftable pointer)
156// CHECK: | [sizeof=8, align=4
157// CHECK: | nvsize=4, nvalign=4]
158// CHECK-X64: *** Dumping AST Record Layout
159// CHECK-X64: 0 | struct CT
160// CHECK-X64: 0 | (CT vbtable pointer)
161// CHECK-X64: 8 | struct AT (virtual base)
162// CHECK-X64: 8 | (AT vftable pointer)
163// CHECK-X64: | [sizeof=16, align=8
164// CHECK-X64: | nvsize=8, nvalign=8]
Warren Hunt42be7762013-10-14 20:14:09 +0000165
Warren Huntf037bd12013-12-19 00:43:59 +0000166struct XA {
167 XA() { printf("XA"); }
168 long long ll;
169};
170struct XB : XA {
171 XB() { printf("XB"); }
172 virtual void foo() {}
173 int b;
174};
175struct XC : virtual XB {
176 XC() { printf("XC"); }
177 virtual void foo() {}
178};
179
180// CHECK: *** Dumping AST Record Layout
181// CHECK: 0 | struct XC
182// CHECK: 0 | (XC vbtable pointer)
183// CHECK: 4 | (vtordisp for vbase XB)
184// CHECK: 8 | struct XB (virtual base)
185// CHECK: 8 | (XB vftable pointer)
186// CHECK: 16 | struct XA (base)
187// CHECK: 16 | long long ll
188// CHECK: 24 | int b
189// CHECK: | [sizeof=32, align=8
190// CHECK: | nvsize=4, nvalign=4]
191// CHECK-X64: *** Dumping AST Record Layout
192// CHECK-X64: 0 | struct XC
193// CHECK-X64: 0 | (XC vbtable pointer)
194// CHECK-X64: 12 | (vtordisp for vbase XB)
195// CHECK-X64: 16 | struct XB (virtual base)
196// CHECK-X64: 16 | (XB vftable pointer)
197// CHECK-X64: 24 | struct XA (base)
198// CHECK-X64: 24 | long long ll
199// CHECK-X64: 32 | int b
200// CHECK-X64: | [sizeof=40, align=8
201// CHECK-X64: | nvsize=8, nvalign=8]
202
Warren Huntbd1b0c62013-10-14 19:08:58 +0000203int a[
204sizeof(A)+
205sizeof(C)+
Warren Hunt42be7762013-10-14 20:14:09 +0000206sizeof(D)+
Warren Huntf037bd12013-12-19 00:43:59 +0000207sizeof(CT)+
208sizeof(XC)];