xref: /aosp_15_r20/external/clang/test/Layout/ms-x86-pack-and-align.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only -Wno-inaccessible-base %s 2>&1 \
2*67e74705SXin Li // RUN:            | FileCheck %s
3*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only -Wno-inaccessible-base %s 2>/dev/null \
4*67e74705SXin Li // RUN:            | FileCheck %s -check-prefix CHECK-X64
5*67e74705SXin Li 
6*67e74705SXin Li extern "C" int printf(const char *fmt, ...);
7*67e74705SXin Li char buffer[419430400];
8*67e74705SXin Li 
9*67e74705SXin Li struct A {
10*67e74705SXin Li 	char a;
AA11*67e74705SXin Li 	A() {
12*67e74705SXin Li 		printf("A   = %d\n", (int)((char*)this - buffer));
13*67e74705SXin Li 		printf("A.a = %d\n", (int)((char*)&a - buffer));
14*67e74705SXin Li 	}
15*67e74705SXin Li };
16*67e74705SXin Li 
17*67e74705SXin Li struct B {
18*67e74705SXin Li 	__declspec(align(4)) long long a;
BB19*67e74705SXin Li 	B() {
20*67e74705SXin Li 		printf("B   = %d\n", (int)((char*)this - buffer));
21*67e74705SXin Li 		printf("B.a = %d\n", (int)((char*)&a - buffer));
22*67e74705SXin Li 	}
23*67e74705SXin Li };
24*67e74705SXin Li 
25*67e74705SXin Li #pragma pack(push, 2)
26*67e74705SXin Li struct X {
27*67e74705SXin Li 	B a;
28*67e74705SXin Li 	char b;
29*67e74705SXin Li 	int c;
XX30*67e74705SXin Li 	X() {
31*67e74705SXin Li 		printf("X   = %d\n", (int)((char*)this - buffer));
32*67e74705SXin Li 		printf("X.a = %d\n", (int)((char*)&a - buffer));
33*67e74705SXin Li 		printf("X.b = %d\n", (int)((char*)&b - buffer));
34*67e74705SXin Li 		printf("X.c = %d\n", (int)((char*)&c - buffer));
35*67e74705SXin Li 	}
36*67e74705SXin Li };
37*67e74705SXin Li 
38*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
39*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
40*67e74705SXin Li // CHECK-NEXT:    0 | struct X
41*67e74705SXin Li // CHECK-NEXT:    0 |   struct B a
42*67e74705SXin Li // CHECK-NEXT:    0 |     long long a
43*67e74705SXin Li // CHECK-NEXT:    8 |   char b
44*67e74705SXin Li // CHECK-NEXT:   10 |   int c
45*67e74705SXin Li // CHECK-NEXT:      | [sizeof=16, align=4
46*67e74705SXin Li // CHECK-NEXT:      |  nvsize=14, nvalign=4]
47*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
48*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
49*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct X
50*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct B a
51*67e74705SXin Li // CHECK-X64-NEXT:    0 |     long long a
52*67e74705SXin Li // CHECK-X64-NEXT:    8 |   char b
53*67e74705SXin Li // CHECK-X64-NEXT:   10 |   int c
54*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=16, align=4
55*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=14, nvalign=4]
56*67e74705SXin Li 
57*67e74705SXin Li struct Y : A, B {
58*67e74705SXin Li 	char a;
59*67e74705SXin Li 	int b;
YY60*67e74705SXin Li 	Y() {
61*67e74705SXin Li 		printf("Y   = %d\n", (int)((char*)this - buffer));
62*67e74705SXin Li 		printf("Y.a = %d\n", (int)((char*)&a - buffer));
63*67e74705SXin Li 		printf("Y.b = %d\n", (int)((char*)&b - buffer));
64*67e74705SXin Li 	}
65*67e74705SXin Li };
66*67e74705SXin Li 
67*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
68*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
69*67e74705SXin Li // CHECK-NEXT:    0 | struct Y
70*67e74705SXin Li // CHECK-NEXT:    0 |   struct A (base)
71*67e74705SXin Li // CHECK-NEXT:    0 |     char a
72*67e74705SXin Li // CHECK-NEXT:    4 |   struct B (base)
73*67e74705SXin Li // CHECK-NEXT:    4 |     long long a
74*67e74705SXin Li // CHECK-NEXT:   12 |   char a
75*67e74705SXin Li // CHECK-NEXT:   14 |   int b
76*67e74705SXin Li // CHECK-NEXT:      | [sizeof=20, align=4
77*67e74705SXin Li // CHECK-NEXT:      |  nvsize=18, nvalign=4]
78*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
79*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
80*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct Y
81*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct A (base)
82*67e74705SXin Li // CHECK-X64-NEXT:    0 |     char a
83*67e74705SXin Li // CHECK-X64-NEXT:    4 |   struct B (base)
84*67e74705SXin Li // CHECK-X64-NEXT:    4 |     long long a
85*67e74705SXin Li // CHECK-X64-NEXT:   12 |   char a
86*67e74705SXin Li // CHECK-X64-NEXT:   14 |   int b
87*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=20, align=4
88*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=18, nvalign=4]
89*67e74705SXin Li 
90*67e74705SXin Li struct Z : virtual B {
91*67e74705SXin Li 	char a;
92*67e74705SXin Li 	int b;
ZZ93*67e74705SXin Li 	Z() {
94*67e74705SXin Li 		printf("Z   = %d\n", (int)((char*)this - buffer));
95*67e74705SXin Li 		printf("Z.a = %d\n", (int)((char*)&a - buffer));
96*67e74705SXin Li 		printf("Z.b = %d\n", (int)((char*)&b - buffer));
97*67e74705SXin Li 	}
98*67e74705SXin Li };
99*67e74705SXin Li 
100*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
101*67e74705SXin Li // CHECK-NEXT:    0 | struct Z
102*67e74705SXin Li // CHECK-NEXT:    0 |   (Z vbtable pointer)
103*67e74705SXin Li // CHECK-NEXT:    4 |   char a
104*67e74705SXin Li // CHECK-NEXT:    6 |   int b
105*67e74705SXin Li // CHECK-NEXT:   12 |   struct B (virtual base)
106*67e74705SXin Li // CHECK-NEXT:   12 |     long long a
107*67e74705SXin Li // CHECK-NEXT:      | [sizeof=20, align=4
108*67e74705SXin Li // CHECK-NEXT:      |  nvsize=10, nvalign=4]
109*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
110*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct Z
111*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (Z vbtable pointer)
112*67e74705SXin Li // CHECK-X64-NEXT:    8 |   char a
113*67e74705SXin Li // CHECK-X64-NEXT:   10 |   int b
114*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct B (virtual base)
115*67e74705SXin Li // CHECK-X64-NEXT:   16 |     long long a
116*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=24, align=4
117*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=14, nvalign=4]
118*67e74705SXin Li 
119*67e74705SXin Li #pragma pack(pop)
120*67e74705SXin Li 
121*67e74705SXin Li struct A1 { long long a; };
122*67e74705SXin Li #pragma pack(push, 1)
123*67e74705SXin Li struct B1 : virtual A1 { char a; };
124*67e74705SXin Li #pragma pack(pop)
125*67e74705SXin Li struct C1 : B1 {};
126*67e74705SXin Li 
127*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
128*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
129*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
130*67e74705SXin Li // CHECK-NEXT:    0 | struct C1
131*67e74705SXin Li // CHECK-NEXT:    0 |   struct B1 (base)
132*67e74705SXin Li // CHECK-NEXT:    0 |     (B1 vbtable pointer)
133*67e74705SXin Li // CHECK-NEXT:    4 |     char a
134*67e74705SXin Li // CHECK-NEXT:    8 |   struct A1 (virtual base)
135*67e74705SXin Li // CHECK-NEXT:    8 |     long long a
136*67e74705SXin Li // CHECK-NEXT:      | [sizeof=16, align=8
137*67e74705SXin Li // CHECK-NEXT:      |  nvsize=5, nvalign=8]
138*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
139*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
140*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
141*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct C1
142*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct B1 (base)
143*67e74705SXin Li // CHECK-X64-NEXT:    0 |     (B1 vbtable pointer)
144*67e74705SXin Li // CHECK-X64-NEXT:    8 |     char a
145*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct A1 (virtual base)
146*67e74705SXin Li // CHECK-X64-NEXT:   16 |     long long a
147*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=24, align=8
148*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=9, nvalign=8]
149*67e74705SXin Li 
150*67e74705SXin Li struct CA0 {
CA0CA0151*67e74705SXin Li 	CA0() {}
152*67e74705SXin Li };
153*67e74705SXin Li struct CA1 : virtual CA0 {
CA1CA1154*67e74705SXin Li 	CA1() {}
155*67e74705SXin Li };
156*67e74705SXin Li #pragma pack(push, 1)
157*67e74705SXin Li struct CA2 : public CA1, public CA0 {
CA2MethodCA2158*67e74705SXin Li 	virtual void CA2Method() {}
CA2CA2159*67e74705SXin Li 	CA2() {}
160*67e74705SXin Li };
161*67e74705SXin Li #pragma pack(pop)
162*67e74705SXin Li 
163*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
164*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
165*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
166*67e74705SXin Li // CHECK-NEXT:    0 | struct CA2
167*67e74705SXin Li // CHECK-NEXT:    0 |   (CA2 vftable pointer)
168*67e74705SXin Li // CHECK-NEXT:    4 |   struct CA1 (base)
169*67e74705SXin Li // CHECK-NEXT:    4 |     (CA1 vbtable pointer)
170*67e74705SXin Li // CHECK-NEXT:    9 |   struct CA0 (base) (empty)
171*67e74705SXin Li // CHECK-NEXT:    9 |   struct CA0 (virtual base) (empty)
172*67e74705SXin Li // CHECK-NEXT:      | [sizeof=9, align=1
173*67e74705SXin Li // CHECK-NEXT:      |  nvsize=9, nvalign=1]
174*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
175*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
176*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
177*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct CA2
178*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (CA2 vftable pointer)
179*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct CA1 (base)
180*67e74705SXin Li // CHECK-X64-NEXT:    8 |     (CA1 vbtable pointer)
181*67e74705SXin Li // CHECK-X64-NEXT:   17 |   struct CA0 (base) (empty)
182*67e74705SXin Li // CHECK-X64-NEXT:   17 |   struct CA0 (virtual base) (empty)
183*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=17, align=1
184*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=17, nvalign=1]
185*67e74705SXin Li 
186*67e74705SXin Li #pragma pack(16)
187*67e74705SXin Li struct YA {
188*67e74705SXin Li 	__declspec(align(32)) char : 1;
189*67e74705SXin Li };
190*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
191*67e74705SXin Li // CHECK-NEXT:    0 | struct YA (empty)
192*67e74705SXin Li // CHECK-NEXT:0:0-0 |   char
193*67e74705SXin Li // CHECK-NEXT:      | [sizeof=32, align=32
194*67e74705SXin Li // CHECK-NEXT:      |  nvsize=32, nvalign=32]
195*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
196*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct YA (empty)
197*67e74705SXin Li // CHECK-X64-NEXT:0:0-0 |   char
198*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=32, align=32
199*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=32, nvalign=32]
200*67e74705SXin Li 
201*67e74705SXin Li #pragma pack(1)
202*67e74705SXin Li struct YB {
203*67e74705SXin Li 	char a;
204*67e74705SXin Li 	YA b;
205*67e74705SXin Li };
206*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
207*67e74705SXin Li // CHECK-NEXT:    0 | struct YB
208*67e74705SXin Li // CHECK-NEXT:    0 |   char a
209*67e74705SXin Li // CHECK-NEXT:    1 |   struct YA b (empty)
210*67e74705SXin Li // CHECK-NEXT:1:0-0 |     char
211*67e74705SXin Li // CHECK-NEXT:      | [sizeof=33, align=1
212*67e74705SXin Li // CHECK-NEXT:      |  nvsize=33, nvalign=1]
213*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
214*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct YB
215*67e74705SXin Li // CHECK-X64-NEXT:    0 |   char a
216*67e74705SXin Li // CHECK-X64-NEXT:    1 |   struct YA b (empty)
217*67e74705SXin Li // CHECK-X64-NEXT:1:0-0 |     char
218*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=33, align=1
219*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=33, nvalign=1]
220*67e74705SXin Li 
221*67e74705SXin Li #pragma pack(8)
222*67e74705SXin Li struct YC {
223*67e74705SXin Li 	__declspec(align(32)) char : 1;
224*67e74705SXin Li };
225*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
226*67e74705SXin Li // CHECK-NEXT:    0 | struct YC (empty)
227*67e74705SXin Li // CHECK-NEXT:0:0-0 |   char
228*67e74705SXin Li // CHECK-NEXT:      | [sizeof=32, align=32
229*67e74705SXin Li // CHECK-NEXT:      |  nvsize=32, nvalign=32]
230*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
231*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct YC (empty)
232*67e74705SXin Li // CHECK-X64-NEXT:    0:0-0 |   char
233*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=8, align=32
234*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=8, nvalign=32]
235*67e74705SXin Li 
236*67e74705SXin Li #pragma pack(1)
237*67e74705SXin Li struct YD {
238*67e74705SXin Li 	char a;
239*67e74705SXin Li 	YC b;
240*67e74705SXin Li };
241*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
242*67e74705SXin Li // CHECK-NEXT:    0 | struct YD
243*67e74705SXin Li // CHECK-NEXT:    0 |   char a
244*67e74705SXin Li // CHECK-NEXT:    1 |   struct YC b (empty)
245*67e74705SXin Li // CHECK-NEXT:1:0-0 |     char
246*67e74705SXin Li // CHECK-NEXT:      | [sizeof=33, align=1
247*67e74705SXin Li // CHECK-NEXT:      |  nvsize=33, nvalign=1]
248*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
249*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct YD
250*67e74705SXin Li // CHECK-X64-NEXT:    0 |   char a
251*67e74705SXin Li // CHECK-X64-NEXT:    1 |   struct YC b (empty)
252*67e74705SXin Li // CHECK-X64-NEXT:1:0-0 |     char
253*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=9, align=1
254*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=9, nvalign=1]
255*67e74705SXin Li 
256*67e74705SXin Li #pragma pack(4)
257*67e74705SXin Li struct YE {
258*67e74705SXin Li 	__declspec(align(32)) char : 1;
259*67e74705SXin Li };
260*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
261*67e74705SXin Li // CHECK-NEXT:    0 | struct YE (empty)
262*67e74705SXin Li // CHECK-NEXT:    0:0-0 |   char
263*67e74705SXin Li // CHECK-NEXT:      | [sizeof=4, align=32
264*67e74705SXin Li // CHECK-NEXT:      |  nvsize=4, nvalign=32]
265*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
266*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct YE (empty)
267*67e74705SXin Li // CHECK-X64-NEXT:    0:0-0 |   char
268*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=4, align=32
269*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=4, nvalign=32]
270*67e74705SXin Li 
271*67e74705SXin Li #pragma pack(1)
272*67e74705SXin Li struct YF {
273*67e74705SXin Li 	char a;
274*67e74705SXin Li 	YE b;
275*67e74705SXin Li };
276*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
277*67e74705SXin Li // CHECK-NEXT:    0 | struct YF
278*67e74705SXin Li // CHECK-NEXT:    0 |   char a
279*67e74705SXin Li // CHECK-NEXT:    1 |   struct YE b (empty)
280*67e74705SXin Li // CHECK-NEXT:1:0-0 |     char
281*67e74705SXin Li // CHECK-NEXT:      | [sizeof=5, align=1
282*67e74705SXin Li // CHECK-NEXT:      |  nvsize=5, nvalign=1]
283*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
284*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct YF
285*67e74705SXin Li // CHECK-X64-NEXT:    0 |   char a
286*67e74705SXin Li // CHECK-X64-NEXT:    1 |   struct YE b (empty)
287*67e74705SXin Li // CHECK-X64-NEXT:1:0-0 |     char
288*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=5, align=1
289*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=5, nvalign=1]
290*67e74705SXin Li 
291*67e74705SXin Li #pragma pack(16)
292*67e74705SXin Li struct __declspec(align(16)) D0 { char a; };
293*67e74705SXin Li #pragma pack(1)
294*67e74705SXin Li struct D1 : public D0 { char a; };
295*67e74705SXin Li #pragma pack(16)
296*67e74705SXin Li struct D2 : D1 { char a; };
297*67e74705SXin Li 
298*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
299*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
300*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
301*67e74705SXin Li // CHECK-NEXT:    0 | struct D2
302*67e74705SXin Li // CHECK-NEXT:    0 |   struct D1 (base)
303*67e74705SXin Li // CHECK-NEXT:    0 |     struct D0 (base)
304*67e74705SXin Li // CHECK-NEXT:    0 |       char a
305*67e74705SXin Li // CHECK-NEXT:    1 |     char a
306*67e74705SXin Li // CHECK-NEXT:    2 |   char a
307*67e74705SXin Li // CHECK-NEXT:      | [sizeof=16, align=16
308*67e74705SXin Li // CHECK-NEXT:      |  nvsize=16, nvalign=16]
309*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
310*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
311*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
312*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct D2
313*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct D1 (base)
314*67e74705SXin Li // CHECK-X64-NEXT:    0 |     struct D0 (base)
315*67e74705SXin Li // CHECK-X64-NEXT:    0 |       char a
316*67e74705SXin Li // CHECK-X64-NEXT:    1 |     char a
317*67e74705SXin Li // CHECK-X64-NEXT:    2 |   char a
318*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=16, align=16
319*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
320*67e74705SXin Li 
321*67e74705SXin Li #pragma pack()
322*67e74705SXin Li struct JA { char a; };
323*67e74705SXin Li #pragma pack(1)
324*67e74705SXin Li struct JB { __declspec(align(4)) char a; };
325*67e74705SXin Li #pragma pack()
326*67e74705SXin Li struct JC : JB, JA { };
327*67e74705SXin Li 
328*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
329*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
330*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
331*67e74705SXin Li // CHECK-NEXT:    0 | struct JC
332*67e74705SXin Li // CHECK-NEXT:    0 |   struct JB (base)
333*67e74705SXin Li // CHECK-NEXT:    0 |     char a
334*67e74705SXin Li // CHECK-NEXT:    1 |   struct JA (base)
335*67e74705SXin Li // CHECK-NEXT:    1 |     char a
336*67e74705SXin Li // CHECK-NEXT:      | [sizeof=4, align=4
337*67e74705SXin Li // CHECK-NEXT:      |  nvsize=4, nvalign=4]
338*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
339*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
340*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
341*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct JC
342*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct JB (base)
343*67e74705SXin Li // CHECK-X64-NEXT:    0 |     char a
344*67e74705SXin Li // CHECK-X64-NEXT:    1 |   struct JA (base)
345*67e74705SXin Li // CHECK-X64-NEXT:    1 |     char a
346*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=4, align=4
347*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=4, nvalign=4]
348*67e74705SXin Li 
349*67e74705SXin Li #pragma pack()
350*67e74705SXin Li struct KA { char a; };
351*67e74705SXin Li #pragma pack(1)
352*67e74705SXin Li struct KB : KA { __declspec(align(2)) char a; };
353*67e74705SXin Li 
354*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
355*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
356*67e74705SXin Li // CHECK-NEXT:    0 | struct KB
357*67e74705SXin Li // CHECK-NEXT:    0 |   struct KA (base)
358*67e74705SXin Li // CHECK-NEXT:    0 |     char a
359*67e74705SXin Li // CHECK-NEXT:    2 |   char a
360*67e74705SXin Li // CHECK-NEXT:      | [sizeof=4, align=2
361*67e74705SXin Li // CHECK-NEXT:      |  nvsize=3, nvalign=2]
362*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
363*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
364*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct KB
365*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct KA (base)
366*67e74705SXin Li // CHECK-X64-NEXT:    0 |     char a
367*67e74705SXin Li // CHECK-X64-NEXT:    2 |   char a
368*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=4, align=2
369*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=3, nvalign=2]
370*67e74705SXin Li 
371*67e74705SXin Li #pragma pack(1)
372*67e74705SXin Li struct L {
funL373*67e74705SXin Li   virtual void fun() {}
374*67e74705SXin Li   __declspec(align(256)) int Field;
375*67e74705SXin Li };
376*67e74705SXin Li 
377*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
378*67e74705SXin Li // CHECK-NEXT:    0 | struct L
379*67e74705SXin Li // CHECK-NEXT:    0 |   (L vftable pointer)
380*67e74705SXin Li // CHECK-NEXT:  256 |   int Field
381*67e74705SXin Li // CHECK-NEXT:      | [sizeof=512, align=256
382*67e74705SXin Li // CHECK-NEXT:      |  nvsize=260, nvalign=256]
383*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
384*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct L
385*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (L vftable pointer)
386*67e74705SXin Li // CHECK-X64-NEXT:  256 |   int Field
387*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=512, align=256
388*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=260, nvalign=256]
389*67e74705SXin Li 
390*67e74705SXin Li #pragma pack()
391*67e74705SXin Li struct MA {};
392*67e74705SXin Li #pragma pack(1)
393*67e74705SXin Li struct MB : virtual MA {
394*67e74705SXin Li   __declspec(align(256)) int Field;
395*67e74705SXin Li };
396*67e74705SXin Li 
397*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
398*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
399*67e74705SXin Li // CHECK-NEXT:    0 | struct MB
400*67e74705SXin Li // CHECK-NEXT:    0 |   (MB vbtable pointer)
401*67e74705SXin Li // CHECK-NEXT:  256 |   int Field
402*67e74705SXin Li // CHECK-NEXT:  260 |   struct MA (virtual base) (empty)
403*67e74705SXin Li // CHECK-NEXT:      | [sizeof=512, align=256
404*67e74705SXin Li // CHECK-NEXT:      |  nvsize=260, nvalign=256]
405*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
406*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
407*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct MB
408*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (MB vbtable pointer)
409*67e74705SXin Li // CHECK-X64-NEXT:  256 |   int Field
410*67e74705SXin Li // CHECK-X64-NEXT:  260 |   struct MA (virtual base) (empty)
411*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=512, align=256
412*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=260, nvalign=256]
413*67e74705SXin Li 
414*67e74705SXin Li struct RA {};
415*67e74705SXin Li #pragma pack(1)
416*67e74705SXin Li struct __declspec(align(8)) RB0 {
417*67e74705SXin Li 	__declspec(align(1024)) int b : 3;
418*67e74705SXin Li };
419*67e74705SXin Li 
420*67e74705SXin Li struct __declspec(align(8)) RB1 {
421*67e74705SXin Li 	__declspec(align(1024)) int b : 3;
fRB1422*67e74705SXin Li 	virtual void f() {}
423*67e74705SXin Li };
424*67e74705SXin Li 
425*67e74705SXin Li struct __declspec(align(8)) RB2 : virtual RA {
426*67e74705SXin Li 	__declspec(align(1024)) int b : 3;
427*67e74705SXin Li };
428*67e74705SXin Li 
429*67e74705SXin Li struct __declspec(align(8)) RB3 : virtual RA {
430*67e74705SXin Li 	__declspec(align(1024)) int b : 3;
fRB3431*67e74705SXin Li 	virtual void f() {}
432*67e74705SXin Li };
433*67e74705SXin Li 
434*67e74705SXin Li struct RC {
435*67e74705SXin Li 	char _;
436*67e74705SXin Li 	__declspec(align(1024)) int c : 3;
437*67e74705SXin Li };
438*67e74705SXin Li struct RE {
439*67e74705SXin Li 	char _;
440*67e74705SXin Li 	RC c;
441*67e74705SXin Li };
442*67e74705SXin Li #pragma pack()
443*67e74705SXin Li 
444*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
445*67e74705SXin Li // CHECK-NEXT:    0 | struct RB0
446*67e74705SXin Li // CHECK-NEXT:0:0-2 |   int b
447*67e74705SXin Li // CHECK-NEXT:      | [sizeof=8, align=1024
448*67e74705SXin Li // CHECK-NEXT:      |  nvsize=4, nvalign=1024]
449*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
450*67e74705SXin Li // CHECK-NEXT:    0 | struct RB1
451*67e74705SXin Li // CHECK-NEXT:    0 |   (RB1 vftable pointer)
452*67e74705SXin Li // CHECK-NEXT: 1024:0-2 |   int b
453*67e74705SXin Li // CHECK-NEXT:      | [sizeof=1032, align=1024
454*67e74705SXin Li // CHECK-NEXT:      |  nvsize=1028, nvalign=1024]
455*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
456*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
457*67e74705SXin Li // CHECK-NEXT:    0 | struct RB2
458*67e74705SXin Li // CHECK-NEXT:    0 |   (RB2 vbtable pointer)
459*67e74705SXin Li // CHECK-NEXT: 1024:0-2 |   int b
460*67e74705SXin Li // CHECK-NEXT: 1028 |   struct RA (virtual base) (empty)
461*67e74705SXin Li // CHECK-NEXT:      | [sizeof=1032, align=1024
462*67e74705SXin Li // CHECK-NEXT:      |  nvsize=1028, nvalign=1024]
463*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
464*67e74705SXin Li // CHECK-NEXT:    0 | struct RB3
465*67e74705SXin Li // CHECK-NEXT:    0 |   (RB3 vftable pointer)
466*67e74705SXin Li // CHECK-NEXT: 1024 |   (RB3 vbtable pointer)
467*67e74705SXin Li // CHECK-NEXT: 2048:0-2 |   int b
468*67e74705SXin Li // CHECK-NEXT: 2052 |   struct RA (virtual base) (empty)
469*67e74705SXin Li // CHECK-NEXT:      | [sizeof=2056, align=1024
470*67e74705SXin Li // CHECK-NEXT:      |  nvsize=2052, nvalign=1024]
471*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
472*67e74705SXin Li // CHECK-NEXT:    0 | struct RC
473*67e74705SXin Li // CHECK-NEXT:    0 |   char _
474*67e74705SXin Li // CHECK-NEXT: 1024:0-2 |   int c
475*67e74705SXin Li // CHECK-NEXT:      | [sizeof=1028, align=1024
476*67e74705SXin Li // CHECK-NEXT:      |  nvsize=1028, nvalign=1024]
477*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
478*67e74705SXin Li // CHECK-NEXT:    0 | struct RE
479*67e74705SXin Li // CHECK-NEXT:    0 |   char _
480*67e74705SXin Li // CHECK-NEXT:    1 |   struct RC c
481*67e74705SXin Li // CHECK-NEXT:    1 |     char _
482*67e74705SXin Li // CHECK-NEXT: 1025:0-2 |     int c
483*67e74705SXin Li // CHECK-NEXT:      | [sizeof=1029, align=1
484*67e74705SXin Li // CHECK-NEXT:      |  nvsize=1029, nvalign=1]
485*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
486*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct RB0
487*67e74705SXin Li // CHECK-X64-NEXT:    0:0-2 |   int b
488*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=8, align=1024
489*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=4, nvalign=1024]
490*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
491*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct RB1
492*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (RB1 vftable pointer)
493*67e74705SXin Li // CHECK-X64-NEXT: 1024:0-2 |   int b
494*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=1032, align=1024
495*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=1028, nvalign=1024]
496*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
497*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
498*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct RB2
499*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (RB2 vbtable pointer)
500*67e74705SXin Li // CHECK-X64-NEXT: 1024:0-2 |   int b
501*67e74705SXin Li // CHECK-X64-NEXT: 1028 |   struct RA (virtual base) (empty)
502*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=1032, align=1024
503*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=1028, nvalign=1024]
504*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
505*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct RB3
506*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (RB3 vftable pointer)
507*67e74705SXin Li // CHECK-X64-NEXT: 1024 |   (RB3 vbtable pointer)
508*67e74705SXin Li // CHECK-X64-NEXT: 2048:0-2 |   int b
509*67e74705SXin Li // CHECK-X64-NEXT: 2052 |   struct RA (virtual base) (empty)
510*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=2056, align=1024
511*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=2052, nvalign=1024]
512*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
513*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct RC
514*67e74705SXin Li // CHECK-X64-NEXT:    0 |   char _
515*67e74705SXin Li // CHECK-X64-NEXT: 1024:0-2 |   int c
516*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=1028, align=1024
517*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=1028, nvalign=1024]
518*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
519*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct RE
520*67e74705SXin Li // CHECK-X64-NEXT:    0 |   char _
521*67e74705SXin Li // CHECK-X64-NEXT:    1 |   struct RC c
522*67e74705SXin Li // CHECK-X64-NEXT:    1 |     char _
523*67e74705SXin Li // CHECK-X64-NEXT: 1025:0-2 |     int c
524*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=1029, align=1
525*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=1029, nvalign=1]
526*67e74705SXin Li 
527*67e74705SXin Li struct NA {};
528*67e74705SXin Li struct NB {};
529*67e74705SXin Li #pragma pack(push, 1)
530*67e74705SXin Li struct NC : virtual NA, virtual NB {};
531*67e74705SXin Li #pragma pack(pop)
532*67e74705SXin Li struct ND : NC {};
533*67e74705SXin Li 
534*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
535*67e74705SXin Li // CHECK-NEXT:    0 | struct NA (empty)
536*67e74705SXin Li // CHECK-NEXT:      | [sizeof=1, align=1
537*67e74705SXin Li // CHECK-NEXT:      |  nvsize=0, nvalign=1]
538*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
539*67e74705SXin Li // CHECK-NEXT:    0 | struct NB (empty)
540*67e74705SXin Li // CHECK-NEXT:      | [sizeof=1, align=1
541*67e74705SXin Li // CHECK-NEXT:      |  nvsize=0, nvalign=1]
542*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
543*67e74705SXin Li // CHECK-NEXT:    0 | struct NC
544*67e74705SXin Li // CHECK-NEXT:    0 |   (NC vbtable pointer)
545*67e74705SXin Li // CHECK-NEXT:    4 |   struct NA (virtual base) (empty)
546*67e74705SXin Li // CHECK-NEXT:    8 |   struct NB (virtual base) (empty)
547*67e74705SXin Li // CHECK-NEXT:      | [sizeof=8, align=1
548*67e74705SXin Li // CHECK-NEXT:      |  nvsize=4, nvalign=1]
549*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
550*67e74705SXin Li // CHECK-NEXT:    0 | struct ND
551*67e74705SXin Li // CHECK-NEXT:    0 |   struct NC (base)
552*67e74705SXin Li // CHECK-NEXT:    0 |     (NC vbtable pointer)
553*67e74705SXin Li // CHECK-NEXT:    4 |   struct NA (virtual base) (empty)
554*67e74705SXin Li // CHECK-NEXT:    8 |   struct NB (virtual base) (empty)
555*67e74705SXin Li // CHECK-NEXT:      | [sizeof=8, align=4
556*67e74705SXin Li // CHECK-NEXT:      |  nvsize=4, nvalign=4]
557*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
558*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct NA (empty)
559*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=1, align=1
560*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=0, nvalign=1]
561*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
562*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct NB (empty)
563*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=1, align=1
564*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=0, nvalign=1]
565*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
566*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct NC
567*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (NC vbtable pointer)
568*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct NA (virtual base) (empty)
569*67e74705SXin Li // CHECK-X64-NEXT:   12 |   struct NB (virtual base) (empty)
570*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=12, align=1
571*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=8, nvalign=1]
572*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
573*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct ND
574*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct NC (base)
575*67e74705SXin Li // CHECK-X64-NEXT:    0 |     (NC vbtable pointer)
576*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct NA (virtual base) (empty)
577*67e74705SXin Li // CHECK-X64-NEXT:   12 |   struct NB (virtual base) (empty)
578*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=12, align=4
579*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
580*67e74705SXin Li 
581*67e74705SXin Li struct OA {};
582*67e74705SXin Li struct OB {};
583*67e74705SXin Li struct OC : virtual OA, virtual OB {};
584*67e74705SXin Li #pragma pack(push, 1)
585*67e74705SXin Li struct OD : OC {};
586*67e74705SXin Li #pragma pack(pop)
587*67e74705SXin Li 
588*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
589*67e74705SXin Li // CHECK-NEXT:    0 | struct OA (empty)
590*67e74705SXin Li // CHECK-NEXT:      | [sizeof=1, align=1
591*67e74705SXin Li // CHECK-NEXT:      |  nvsize=0, nvalign=1]
592*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
593*67e74705SXin Li // CHECK-NEXT:    0 | struct OB (empty)
594*67e74705SXin Li // CHECK-NEXT:      | [sizeof=1, align=1
595*67e74705SXin Li // CHECK-NEXT:      |  nvsize=0, nvalign=1]
596*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
597*67e74705SXin Li // CHECK-NEXT:    0 | struct OC
598*67e74705SXin Li // CHECK-NEXT:    0 |   (OC vbtable pointer)
599*67e74705SXin Li // CHECK-NEXT:    4 |   struct OA (virtual base) (empty)
600*67e74705SXin Li // CHECK-NEXT:    8 |   struct OB (virtual base) (empty)
601*67e74705SXin Li // CHECK-NEXT:      | [sizeof=8, align=4
602*67e74705SXin Li // CHECK-NEXT:      |  nvsize=4, nvalign=4]
603*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
604*67e74705SXin Li // CHECK-NEXT:    0 | struct OD
605*67e74705SXin Li // CHECK-NEXT:    0 |   struct OC (base)
606*67e74705SXin Li // CHECK-NEXT:    0 |     (OC vbtable pointer)
607*67e74705SXin Li // CHECK-NEXT:    4 |   struct OA (virtual base) (empty)
608*67e74705SXin Li // CHECK-NEXT:    8 |   struct OB (virtual base) (empty)
609*67e74705SXin Li // CHECK-NEXT:      | [sizeof=8, align=1
610*67e74705SXin Li // CHECK-NEXT:      |  nvsize=4, nvalign=1]
611*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
612*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct OA (empty)
613*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=1, align=1
614*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=0, nvalign=1]
615*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
616*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct OB (empty)
617*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=1, align=1
618*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=0, nvalign=1]
619*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
620*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct OC
621*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (OC vbtable pointer)
622*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct OA (virtual base) (empty)
623*67e74705SXin Li // CHECK-X64-NEXT:   12 |   struct OB (virtual base) (empty)
624*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=16, align=8
625*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
626*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
627*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct OD
628*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct OC (base)
629*67e74705SXin Li // CHECK-X64-NEXT:    0 |     (OC vbtable pointer)
630*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct OA (virtual base) (empty)
631*67e74705SXin Li // CHECK-X64-NEXT:   12 |   struct OB (virtual base) (empty)
632*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=12, align=1
633*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=8, nvalign=1]
634*67e74705SXin Li 
635*67e74705SXin Li struct __declspec(align(4)) PA {
636*67e74705SXin Li   int c;
637*67e74705SXin Li };
638*67e74705SXin Li 
639*67e74705SXin Li typedef __declspec(align(8)) PA PB;
640*67e74705SXin Li 
641*67e74705SXin Li #pragma pack(push, 1)
642*67e74705SXin Li struct PC {
643*67e74705SXin Li   char a;
644*67e74705SXin Li   PB x;
645*67e74705SXin Li };
646*67e74705SXin Li #pragma pack(pop)
647*67e74705SXin Li 
648*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
649*67e74705SXin Li // CHECK:         0 | struct PC
650*67e74705SXin Li // CHECK-NEXT:    0 |   char a
651*67e74705SXin Li // CHECK-NEXT:    8 |   struct PA x
652*67e74705SXin Li // CHECK-NEXT:    8 |     int c
653*67e74705SXin Li // CHECK-NEXT:      | [sizeof=16, align=8
654*67e74705SXin Li // CHECK-NEXT:      |  nvsize=12, nvalign=8]
655*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
656*67e74705SXin Li // CHECK-X64:         0 | struct PC
657*67e74705SXin Li // CHECK-X64-NEXT:    0 |   char a
658*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct PA x
659*67e74705SXin Li // CHECK-X64-NEXT:    8 |     int c
660*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=16, align=8
661*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=12, nvalign=8]
662*67e74705SXin Li 
663*67e74705SXin Li typedef PB PD;
664*67e74705SXin Li 
665*67e74705SXin Li #pragma pack(push, 1)
666*67e74705SXin Li struct PE {
667*67e74705SXin Li   char a;
668*67e74705SXin Li   PD x;
669*67e74705SXin Li };
670*67e74705SXin Li #pragma pack(pop)
671*67e74705SXin Li 
672*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
673*67e74705SXin Li // CHECK:         0 | struct PE
674*67e74705SXin Li // CHECK-NEXT:    0 |   char a
675*67e74705SXin Li // CHECK-NEXT:    8 |   struct PA x
676*67e74705SXin Li // CHECK-NEXT:    8 |     int c
677*67e74705SXin Li // CHECK-NEXT:      | [sizeof=16, align=8
678*67e74705SXin Li // CHECK-NEXT:      |  nvsize=12, nvalign=8]
679*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
680*67e74705SXin Li // CHECK-X64:         0 | struct PE
681*67e74705SXin Li // CHECK-X64-NEXT:    0 |   char a
682*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct PA x
683*67e74705SXin Li // CHECK-X64-NEXT:    8 |     int c
684*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=16, align=8
685*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=12, nvalign=8]
686*67e74705SXin Li 
687*67e74705SXin Li typedef int __declspec(align(2)) QA;
688*67e74705SXin Li #pragma pack(push, 1)
689*67e74705SXin Li struct QB {
690*67e74705SXin Li   char a;
691*67e74705SXin Li   QA b;
692*67e74705SXin Li };
693*67e74705SXin Li #pragma pack(pop)
694*67e74705SXin Li 
695*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
696*67e74705SXin Li // CHECK-NEXT:    0 | struct QB
697*67e74705SXin Li // CHECK-NEXT:    0 |   char a
698*67e74705SXin Li // CHECK-NEXT:    2 |   QA b
699*67e74705SXin Li // CHECK-NEXT:      | [sizeof=6, align=2
700*67e74705SXin Li // CHECK-NEXT:      |  nvsize=6, nvalign=2]
701*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
702*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct QB
703*67e74705SXin Li // CHECK-X64-NEXT:    0 |   char a
704*67e74705SXin Li // CHECK-X64-NEXT:    2 |   QA b
705*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=6, align=2
706*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=6, nvalign=2]
707*67e74705SXin Li 
708*67e74705SXin Li struct QC {
709*67e74705SXin Li   char a;
710*67e74705SXin Li   QA b;
711*67e74705SXin Li };
712*67e74705SXin Li 
713*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
714*67e74705SXin Li // CHECK-NEXT:    0 | struct QC
715*67e74705SXin Li // CHECK-NEXT:    0 |   char a
716*67e74705SXin Li // CHECK-NEXT:    4 |   QA b
717*67e74705SXin Li // CHECK-NEXT:      | [sizeof=8, align=4
718*67e74705SXin Li // CHECK-NEXT:      |  nvsize=8, nvalign=4]
719*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
720*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct QC
721*67e74705SXin Li // CHECK-X64-NEXT:    0 |   char a
722*67e74705SXin Li // CHECK-X64-NEXT:    4 |   QA b
723*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=8, align=4
724*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
725*67e74705SXin Li 
726*67e74705SXin Li struct QD {
727*67e74705SXin Li   char a;
728*67e74705SXin Li   QA b : 3;
729*67e74705SXin Li };
730*67e74705SXin Li 
731*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
732*67e74705SXin Li // CHECK-NEXT:    0 | struct QD
733*67e74705SXin Li // CHECK-NEXT:    0 |   char a
734*67e74705SXin Li // CHECK-NEXT:4:0-2 |   QA b
735*67e74705SXin Li // CHECK-NEXT:      | [sizeof=8, align=4
736*67e74705SXin Li // CHECK-NEXT:      |  nvsize=8, nvalign=4]
737*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
738*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct QD
739*67e74705SXin Li // CHECK-X64-NEXT:    0 |   char a
740*67e74705SXin Li // CHECK-X64-NEXT:4:0-2 |   QA b
741*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=8, align=4
742*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
743*67e74705SXin Li 
744*67e74705SXin Li struct __declspec(align(4)) EmptyAlignedLongLongMemb {
745*67e74705SXin Li   long long FlexArrayMemb[0];
746*67e74705SXin Li };
747*67e74705SXin Li 
748*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
749*67e74705SXin Li // CHECK-NEXT:    0 | struct EmptyAlignedLongLongMemb
750*67e74705SXin Li // CHECK-NEXT:    0 |   long long [0] FlexArrayMemb
751*67e74705SXin Li // CHECK-NEXT:      | [sizeof=8, align=8
752*67e74705SXin Li // CHECK-NEXT:      |  nvsize=0, nvalign=8]
753*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
754*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct EmptyAlignedLongLongMemb
755*67e74705SXin Li // CHECK-X64-NEXT:    0 |   long long [0] FlexArrayMemb
756*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=8, align=8
757*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=0, nvalign=8]
758*67e74705SXin Li 
759*67e74705SXin Li #pragma pack(1)
760*67e74705SXin Li struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb {
761*67e74705SXin Li   long long FlexArrayMemb[0];
762*67e74705SXin Li };
763*67e74705SXin Li #pragma pack()
764*67e74705SXin Li 
765*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
766*67e74705SXin Li // CHECK-NEXT:    0 | struct EmptyPackedAlignedLongLongMemb
767*67e74705SXin Li // CHECK-NEXT:    0 |   long long [0] FlexArrayMemb
768*67e74705SXin Li // CHECK-NEXT:      | [sizeof=4, align=4
769*67e74705SXin Li // CHECK-NEXT:      |  nvsize=0, nvalign=4]
770*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
771*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct EmptyPackedAlignedLongLongMemb
772*67e74705SXin Li // CHECK-X64-NEXT:    0 |   long long [0] FlexArrayMemb
773*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=4, align=4
774*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=0, nvalign=4]
775*67e74705SXin Li 
776*67e74705SXin Li int a[
777*67e74705SXin Li sizeof(X)+
778*67e74705SXin Li sizeof(Y)+
779*67e74705SXin Li sizeof(Z)+
780*67e74705SXin Li sizeof(C1)+
781*67e74705SXin Li sizeof(CA2)+
782*67e74705SXin Li sizeof(YA)+
783*67e74705SXin Li sizeof(YB)+
784*67e74705SXin Li sizeof(YC)+
785*67e74705SXin Li sizeof(YD)+
786*67e74705SXin Li sizeof(YE)+
787*67e74705SXin Li sizeof(YF)+
788*67e74705SXin Li sizeof(YF)+
789*67e74705SXin Li sizeof(D2)+
790*67e74705SXin Li sizeof(JC)+
791*67e74705SXin Li sizeof(KB)+
792*67e74705SXin Li sizeof(L)+
793*67e74705SXin Li sizeof(MB)+
794*67e74705SXin Li sizeof(RB0)+
795*67e74705SXin Li sizeof(RB1)+
796*67e74705SXin Li sizeof(RB2)+
797*67e74705SXin Li sizeof(RB3)+
798*67e74705SXin Li sizeof(RC)+
799*67e74705SXin Li sizeof(RE)+
800*67e74705SXin Li sizeof(ND)+
801*67e74705SXin Li sizeof(OD)+
802*67e74705SXin Li sizeof(PC)+
803*67e74705SXin Li sizeof(PE)+
804*67e74705SXin Li sizeof(QB)+
805*67e74705SXin Li sizeof(QC)+
806*67e74705SXin Li sizeof(QD)+
807*67e74705SXin Li sizeof(EmptyAlignedLongLongMemb)+
808*67e74705SXin Li sizeof(EmptyPackedAlignedLongLongMemb)+
809*67e74705SXin Li 0];
810