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