annotate clang/test/Sema/ms_class_layout.cpp @ 169:1f21f60db75c

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