xref: /minix3/external/bsd/llvm/dist/clang/test/Layout/ms-x86-empty-virtual-base.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>/dev/null \
2f4a2713aSLionel 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 \
4f4a2713aSLionel Sambuc // RUN:            | FileCheck %s -check-prefix CHECK-X64
5f4a2713aSLionel Sambuc 
6f4a2713aSLionel Sambuc extern "C" int printf(const char *fmt, ...);
7f4a2713aSLionel Sambuc 
B0B08f4a2713aSLionel Sambuc struct __declspec(align(8)) B0 { B0() {printf("B0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
B1B19f4a2713aSLionel Sambuc struct __declspec(align(8)) B1 { B1() {printf("B1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
B2B210f4a2713aSLionel Sambuc struct __declspec(align(8)) B2 { B2() {printf("B2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
B3B311f4a2713aSLionel Sambuc struct __declspec(align(8)) B3 { B3() {printf("B3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
B4B412f4a2713aSLionel Sambuc struct __declspec(align(8)) B4 { B4() {printf("B4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
13f4a2713aSLionel Sambuc 
C0C014f4a2713aSLionel Sambuc struct C0 { int a; C0() : a(0xf00000C0) {printf("C0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
C1C115f4a2713aSLionel Sambuc struct C1 { int a; C1() : a(0xf00000C1) {printf("C1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
C2C216f4a2713aSLionel Sambuc struct C2 { int a; C2() : a(0xf00000C2) {printf("C2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
C3C317f4a2713aSLionel Sambuc struct C3 { int a; C3() : a(0xf00000C3) {printf("C3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
C4C418f4a2713aSLionel Sambuc struct C4 { int a; C4() : a(0xf00000C4) {printf("C4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
19f4a2713aSLionel Sambuc 
fD020f4a2713aSLionel Sambuc struct __declspec(align(16)) D0 { D0() {printf("D0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} virtual void f() {} };
D1D121f4a2713aSLionel Sambuc struct D1 { D1() {printf("D1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
D2D222f4a2713aSLionel Sambuc struct D2 { int a[8]; D2() {printf("D2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
23f4a2713aSLionel Sambuc 
24f4a2713aSLionel Sambuc struct A : virtual B0 {
25f4a2713aSLionel Sambuc 	int a;
AA26f4a2713aSLionel Sambuc 	A() : a(0xf000000A) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
27f4a2713aSLionel Sambuc };
28f4a2713aSLionel Sambuc 
29f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
30*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
31*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct A
32*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (A vbtable pointer)
33*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   int a
34*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
35*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=8, align=8
36*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=8]
37f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
38*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
39*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct A
40*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (A vbtable pointer)
41*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   int a
42*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
43*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=16, align=8
44*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
45f4a2713aSLionel Sambuc 
46f4a2713aSLionel Sambuc struct B : virtual B0 {
47f4a2713aSLionel Sambuc 	B0 b0;
48f4a2713aSLionel Sambuc 	int a;
BB49f4a2713aSLionel Sambuc 	B() : a(0xf000000B) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
50f4a2713aSLionel Sambuc };
51f4a2713aSLionel Sambuc 
52f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
53*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct B
54*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (B vbtable pointer)
55*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct B0 b0 (empty)
56*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |   [sizeof=8, align=8
57*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |    nvsize=0, nvalign=8]
58f4a2713aSLionel Sambuc // CHECK:        16 |   int a
59*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |   struct B0 (virtual base) (empty)
60*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=24, align=8
61*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=24, nvalign=8]
62f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
63*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct B
64*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (B vbtable pointer)
65*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   struct B0 b0 (empty)
66*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |   [sizeof=8, align=8
67*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |    nvsize=0, nvalign=8]
68f4a2713aSLionel Sambuc // CHECK-X64:        16 |   int a
69*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
70*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
71*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
72f4a2713aSLionel Sambuc 
73f4a2713aSLionel Sambuc struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
74f4a2713aSLionel Sambuc 	int a;
CC75f4a2713aSLionel Sambuc 	C() : a(0xf000000C) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
76f4a2713aSLionel Sambuc };
77f4a2713aSLionel Sambuc 
78f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
79*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
80*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
81*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
82*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
83*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct C
84*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (C vbtable pointer)
85*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   int a
86*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
87*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B1 (virtual base) (empty)
88*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |   struct B2 (virtual base) (empty)
89*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   struct B3 (virtual base) (empty)
90*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   40 |   struct B4 (virtual base) (empty)
91*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=40, align=8
92*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=8]
93f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
94*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
95*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
96*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
97*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
98*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct C
99*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (C vbtable pointer)
100*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   int a
101*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
102*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B1 (virtual base) (empty)
103*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct B2 (virtual base) (empty)
104*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |   struct B3 (virtual base) (empty)
105*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   struct B4 (virtual base) (empty)
106*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=48, align=8
107*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
108f4a2713aSLionel Sambuc 
109f4a2713aSLionel Sambuc struct D {
110f4a2713aSLionel Sambuc 	B0 b0;
111f4a2713aSLionel Sambuc 	C0 c0;
112f4a2713aSLionel Sambuc 	C1 c1;
113f4a2713aSLionel Sambuc 	C2 c2;
114f4a2713aSLionel Sambuc 	B1 b1;
115f4a2713aSLionel Sambuc 	int a;
DD116f4a2713aSLionel Sambuc 	D() : a(0xf000000D) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
117f4a2713aSLionel Sambuc };
118f4a2713aSLionel Sambuc 
119f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
120*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
121*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
122*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
123*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct D
124*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B0 b0 (empty)
125f4a2713aSLionel Sambuc // CHECK:         8 |   struct C0 c0
126*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     int a
127f4a2713aSLionel Sambuc // CHECK:        12 |   struct C1 c1
128*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     int a
129f4a2713aSLionel Sambuc // CHECK:        16 |   struct C2 c2
130*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     int a
131f4a2713aSLionel Sambuc // CHECK:        24 |   struct B1 b1 (empty)
132f4a2713aSLionel Sambuc // CHECK:        32 |   int a
133*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=40, align=8
134*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=40, nvalign=8]
135*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
136*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
137*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
138*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
139*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct D
140*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B0 b0 (empty)
141*0a6a1f1dSLionel Sambuc // CHECK-X64:         8 |   struct C0 c0
142*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     int a
143*0a6a1f1dSLionel Sambuc // CHECK-X64:        12 |   struct C1 c1
144*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   12 |     int a
145*0a6a1f1dSLionel Sambuc // CHECK-X64:        16 |   struct C2 c2
146*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
147*0a6a1f1dSLionel Sambuc // CHECK-X64:        24 |   struct B1 b1 (empty)
148*0a6a1f1dSLionel Sambuc // CHECK-X64:        32 |   int a
149*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=40, align=8
150*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=40, nvalign=8]
151f4a2713aSLionel Sambuc 
152f4a2713aSLionel Sambuc struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {
153f4a2713aSLionel Sambuc 	int a;
EE154f4a2713aSLionel Sambuc 	E() : a(0xf000000E) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
155f4a2713aSLionel Sambuc };
156f4a2713aSLionel Sambuc 
157f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
158*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct E
159*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (E vbtable pointer)
160*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   int a
161*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
162*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct C0 (virtual base)
163*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     int a
164*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct C1 (virtual base)
165*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     int a
166*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct C2 (virtual base)
167*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     int a
168*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
169*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=24, align=8
170*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=8]
171f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
172*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct E
173*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (E vbtable pointer)
174*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   int a
175*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
176*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
177*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
178*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |   struct C1 (virtual base)
179*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |     int a
180*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct C2 (virtual base)
181*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     int a
182*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct B1 (virtual base) (empty)
183*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=32, align=8
184*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
185f4a2713aSLionel Sambuc 
186f4a2713aSLionel Sambuc struct F : virtual C0, virtual B0, virtual B1, virtual C1 {
187f4a2713aSLionel Sambuc 	int a;
FF188f4a2713aSLionel Sambuc 	F() : a(0xf000000F) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
189f4a2713aSLionel Sambuc };
190f4a2713aSLionel Sambuc 
191f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
192*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct F
193*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (F vbtable pointer)
194*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   int a
195*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct C0 (virtual base)
196*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     int a
197*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
198*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
199*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |   struct C1 (virtual base)
200*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |     int a
201*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=32, align=8
202*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=8]
203f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
204*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct F
205*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (F vbtable pointer)
206*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   int a
207*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
208*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
209*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
210*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct B1 (virtual base) (empty)
211*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct C1 (virtual base)
212*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     int a
213*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=40, align=8
214*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
215f4a2713aSLionel Sambuc 
216f4a2713aSLionel Sambuc struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {
217f4a2713aSLionel Sambuc 	int a;
GG218f4a2713aSLionel Sambuc 	G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
fG219f4a2713aSLionel Sambuc 	virtual void f() {}
220f4a2713aSLionel Sambuc };
221f4a2713aSLionel Sambuc 
222f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
223*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
224*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct G
225*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct D0 (primary base)
226*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (D0 vftable pointer)
227*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (G vbtable pointer)
228*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |   int a
229*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   struct C0 (virtual base)
230*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     int a
231*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   40 |   struct B0 (virtual base) (empty)
232*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   56 |   struct B1 (virtual base) (empty)
233*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   56 |   struct C1 (virtual base)
234*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   56 |     int a
235*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=64, align=16
236*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=32, nvalign=16]
237f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
238*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
239*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct G
240*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct D0 (primary base)
241*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     (D0 vftable pointer)
242*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (G vbtable pointer)
243*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   int a
244*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct C0 (virtual base)
245*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     int a
246*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |   struct B0 (virtual base) (empty)
247*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   56 |   struct B1 (virtual base) (empty)
248*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   56 |   struct C1 (virtual base)
249*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   56 |     int a
250*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=64, align=16
251*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
252f4a2713aSLionel Sambuc 
253f4a2713aSLionel Sambuc struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {
254f4a2713aSLionel Sambuc 	int a;
HH255f4a2713aSLionel Sambuc 	H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
fH256f4a2713aSLionel Sambuc 	virtual void f() {}
257f4a2713aSLionel Sambuc };
258f4a2713aSLionel Sambuc 
259f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
260*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct H
261*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (H vbtable pointer)
262*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   int a
263*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct C0 (virtual base)
264*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     int a
265*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
266*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
267*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   44 |   (vtordisp for vbase D0)
268*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   struct D0 (virtual base)
269*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     (D0 vftable pointer)
270*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   52 |   struct C1 (virtual base)
271*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   52 |     int a
272*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=64, align=16
273*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=16]
274f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
275*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct H
276*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (H vbtable pointer)
277*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   int a
278*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
279*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
280*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
281*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
282*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   60 |   (vtordisp for vbase D0)
283*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct D0 (virtual base)
284*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     (D0 vftable pointer)
285*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct C1 (virtual base)
286*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |     int a
287*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=80, align=16
288*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
289f4a2713aSLionel Sambuc 
290f4a2713aSLionel Sambuc struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
291f4a2713aSLionel Sambuc 	__declspec(align(32)) int a;
II292f4a2713aSLionel Sambuc 	I() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
293f4a2713aSLionel Sambuc };
294f4a2713aSLionel Sambuc 
295f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
296*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct I
297*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (I vbtable pointer)
298*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
299*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
300*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
301*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
302*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
303*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
304*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=192, align=32
305*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=32]
306f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
307*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct I
308*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (I vbtable pointer)
309*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
310*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
311*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
312*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
313*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
314*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
315*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=192, align=32
316*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
317f4a2713aSLionel Sambuc 
318f4a2713aSLionel Sambuc struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
319f4a2713aSLionel Sambuc 	int a;
JJ320f4a2713aSLionel Sambuc 	J() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
321f4a2713aSLionel Sambuc };
322f4a2713aSLionel Sambuc 
323f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
324*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct J
325*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (J vbtable pointer)
326*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   int a
327*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
328*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
329*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
330*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |   struct B3 (virtual base) (empty)
331*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
332*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=160, align=32
333*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=32]
334f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
335*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct J
336*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (J vbtable pointer)
337*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   int a
338*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
339*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
340*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
341*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |   struct B3 (virtual base) (empty)
342*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
343*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=160, align=32
344*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
345f4a2713aSLionel Sambuc 
346f4a2713aSLionel Sambuc struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {
347f4a2713aSLionel Sambuc 	__declspec(align(32)) int a;
KK348f4a2713aSLionel Sambuc 	K() : a(0xf0000013) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
349f4a2713aSLionel Sambuc };
350f4a2713aSLionel Sambuc 
351f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
352*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
353*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct K
354*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (K vbtable pointer)
355*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
356*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct D1 (virtual base) (empty)
357*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
358*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
359*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
360*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
361*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=192, align=32
362*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=32]
363f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
364*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
365*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct K
366*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (K vbtable pointer)
367*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
368*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct D1 (virtual base) (empty)
369*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
370*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
371*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
372*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
373*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=192, align=32
374*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
375f4a2713aSLionel Sambuc 
376f4a2713aSLionel Sambuc struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
377f4a2713aSLionel Sambuc 	__declspec(align(32)) int a;
LL378f4a2713aSLionel Sambuc 	L() : a(0xf0000014) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
379f4a2713aSLionel Sambuc };
380f4a2713aSLionel Sambuc 
381f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
382*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct L
383*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (L vbtable pointer)
384*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
385*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
386*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   68 |   struct D1 (virtual base) (empty)
387*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
388*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
389*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
390*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=192, align=32
391*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=32]
392f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
393*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct L
394*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (L vbtable pointer)
395*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
396*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
397*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   68 |   struct D1 (virtual base) (empty)
398*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
399*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
400*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
401*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=192, align=32
402*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
403f4a2713aSLionel Sambuc 
404f4a2713aSLionel Sambuc struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
405f4a2713aSLionel Sambuc 	__declspec(align(32)) int a;
MM406f4a2713aSLionel Sambuc 	M() : a(0xf0000015) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
407f4a2713aSLionel Sambuc };
408f4a2713aSLionel Sambuc 
409f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
410*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct M
411*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (M vbtable pointer)
412*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
413*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
414*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
415*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
416*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
417*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
418*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=192, align=32
419*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=32]
420f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
421*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct M
422*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (M vbtable pointer)
423*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
424*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
425*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
426*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
427*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
428*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
429*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=192, align=32
430*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
431f4a2713aSLionel Sambuc 
432f4a2713aSLionel Sambuc struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
433f4a2713aSLionel Sambuc 	__declspec(align(32)) int a;
NN434f4a2713aSLionel Sambuc 	N() : a(0xf0000016) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
435f4a2713aSLionel Sambuc };
436f4a2713aSLionel Sambuc 
437f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
438*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct N
439*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (N vbtable pointer)
440*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
441*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct C0 (virtual base)
442*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     int a
443*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
444*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
445*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  136 |   struct B2 (virtual base) (empty)
446*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  168 |   struct B3 (virtual base) (empty)
447*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  200 |   struct B4 (virtual base) (empty)
448*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=224, align=32
449*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=32]
450f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
451*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct N
452*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (N vbtable pointer)
453*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
454*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
455*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
456*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
457*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
458*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  136 |   struct B2 (virtual base) (empty)
459*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  168 |   struct B3 (virtual base) (empty)
460*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  200 |   struct B4 (virtual base) (empty)
461*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=224, align=32
462*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
463f4a2713aSLionel Sambuc 
464f4a2713aSLionel Sambuc struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
465f4a2713aSLionel Sambuc 	__declspec(align(32)) int a;
OO466f4a2713aSLionel Sambuc 	O() : a(0xf0000017) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
467f4a2713aSLionel Sambuc };
468f4a2713aSLionel Sambuc 
469f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
470*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct O
471*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (O vbtable pointer)
472*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
473*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct C0 (virtual base)
474*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     int a
475*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
476*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
477*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  132 |   struct D1 (virtual base) (empty)
478*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  168 |   struct B3 (virtual base) (empty)
479*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  200 |   struct B4 (virtual base) (empty)
480*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=224, align=32
481*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=32]
482f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
483*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct O
484*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (O vbtable pointer)
485*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
486*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
487*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
488*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
489*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
490*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  132 |   struct D1 (virtual base) (empty)
491*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  168 |   struct B3 (virtual base) (empty)
492*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  200 |   struct B4 (virtual base) (empty)
493*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=224, align=32
494*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
495f4a2713aSLionel Sambuc 
496f4a2713aSLionel Sambuc struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 {
497f4a2713aSLionel Sambuc 	__declspec(align(32)) int a;
PP498f4a2713aSLionel Sambuc 	P() : a(0xf0000018) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
499f4a2713aSLionel Sambuc };
500f4a2713aSLionel Sambuc 
501f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
502*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct P
503*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (P vbtable pointer)
504*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
505*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
506*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct C0 (virtual base)
507*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     int a
508*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   68 |   struct D1 (virtual base) (empty)
509*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
510*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
511*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
512*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=192, align=32
513*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=32]
514f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
515*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct P
516*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (P vbtable pointer)
517*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
518*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
519*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
520*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
521*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   68 |   struct D1 (virtual base) (empty)
522*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
523*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
524*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
525*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=192, align=32
526*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
527f4a2713aSLionel Sambuc 
528f4a2713aSLionel Sambuc struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 {
529f4a2713aSLionel Sambuc 	__declspec(align(32)) int a;
QQ530f4a2713aSLionel Sambuc 	Q() : a(0xf0000019) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
531f4a2713aSLionel Sambuc };
532f4a2713aSLionel Sambuc 
533f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
534*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct Q
535*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (Q vbtable pointer)
536*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
537*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
538*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct C0 (virtual base)
539*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     int a
540*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
541*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
542*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
543*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
544*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=192, align=32
545*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=32]
546f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
547*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct Q
548*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (Q vbtable pointer)
549*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
550*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
551*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
552*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
553*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
554*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
555*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
556*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
557*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=192, align=32
558*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
559f4a2713aSLionel Sambuc 
560f4a2713aSLionel Sambuc struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 {
561f4a2713aSLionel Sambuc 	__declspec(align(32)) int a;
RR562f4a2713aSLionel Sambuc 	R() : a(0xf0000020) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
563f4a2713aSLionel Sambuc };
564f4a2713aSLionel Sambuc 
565f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
566*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct R
567*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (R vbtable pointer)
568*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
569*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
570*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
571*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
572*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |   struct C0 (virtual base)
573*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |     int a
574*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  112 |   struct B3 (virtual base) (empty)
575*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
576*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=160, align=32
577*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=32]
578f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
579*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct R
580*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (R vbtable pointer)
581*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
582*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
583*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
584*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
585*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |   struct C0 (virtual base)
586*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |     int a
587*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  112 |   struct B3 (virtual base) (empty)
588*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
589*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=160, align=32
590*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
591f4a2713aSLionel Sambuc 
592f4a2713aSLionel Sambuc struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 {
593f4a2713aSLionel Sambuc 	__declspec(align(32)) int a;
SS594f4a2713aSLionel Sambuc 	S() : a(0xf0000021) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
595f4a2713aSLionel Sambuc };
596f4a2713aSLionel Sambuc 
597f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
598*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct S
599*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (S vbtable pointer)
600*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
601*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
602*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
603*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |   struct C0 (virtual base)
604*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   72 |     int a
605*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |   struct B2 (virtual base) (empty)
606*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |   struct B3 (virtual base) (empty)
607*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
608*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=160, align=32
609*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=32]
610f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
611*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct S
612*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (S vbtable pointer)
613*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
614*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
615*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
616*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |   struct C0 (virtual base)
617*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   72 |     int a
618*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |   struct B2 (virtual base) (empty)
619*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |   struct B3 (virtual base) (empty)
620*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
621*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=160, align=32
622*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
623f4a2713aSLionel Sambuc 
624f4a2713aSLionel Sambuc struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 {
625f4a2713aSLionel Sambuc 	__declspec(align(16)) int a;
TT626f4a2713aSLionel Sambuc 	T() : a(0xf0000022) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
627f4a2713aSLionel Sambuc };
628f4a2713aSLionel Sambuc 
629f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
630*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
631*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct T
632*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (T vbtable pointer)
633*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   int a
634*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   struct B0 (virtual base) (empty)
635*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
636*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   40 |   struct C0 (virtual base)
637*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   40 |     int a
638*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   44 |   struct D2 (virtual base)
639*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   44 |     int [8] a
640*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |   struct B2 (virtual base) (empty)
641*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   88 |   struct B3 (virtual base) (empty)
642*0a6a1f1dSLionel Sambuc // CHECK-NEXT:  104 |   struct B4 (virtual base) (empty)
643*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=112, align=16
644*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=32, nvalign=16]
645f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
646*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
647*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct T
648*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (T vbtable pointer)
649*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   int a
650*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct B0 (virtual base) (empty)
651*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
652*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |   struct C0 (virtual base)
653*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |     int a
654*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   44 |   struct D2 (virtual base)
655*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   44 |     int [8] a
656*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |   struct B2 (virtual base) (empty)
657*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   88 |   struct B3 (virtual base) (empty)
658*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  104 |   struct B4 (virtual base) (empty)
659*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=112, align=16
660*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
661f4a2713aSLionel Sambuc 
662f4a2713aSLionel Sambuc struct __declspec(align(32)) U : virtual B0, virtual B1 {
663f4a2713aSLionel Sambuc 	int a;
UU664f4a2713aSLionel Sambuc 	U() : a(0xf0000023) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
665f4a2713aSLionel Sambuc };
666f4a2713aSLionel Sambuc 
667f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
668*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct U
669*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (U vbtable pointer)
670*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   int a
671*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
672*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
673*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=64, align=32
674*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=32]
675f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
676*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct U
677*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (U vbtable pointer)
678*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   int a
679*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
680*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
681*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=64, align=32
682*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
683f4a2713aSLionel Sambuc 
684f4a2713aSLionel Sambuc struct __declspec(align(32)) V : virtual D1 {
685f4a2713aSLionel Sambuc 	int a;
VV686f4a2713aSLionel Sambuc 	V() : a(0xf0000024) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
687f4a2713aSLionel Sambuc };
688f4a2713aSLionel Sambuc 
689f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
690*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct V
691*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (V vbtable pointer)
692*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   int a
693*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct D1 (virtual base) (empty)
694*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=32, align=32
695*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=32]
696f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
697*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct V
698*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (V vbtable pointer)
699*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   int a
700*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct D1 (virtual base) (empty)
701*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=32, align=32
702*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
703*0a6a1f1dSLionel Sambuc 
704*0a6a1f1dSLionel Sambuc struct T0 {};
705*0a6a1f1dSLionel Sambuc struct T1 : T0 { char a; };
706*0a6a1f1dSLionel Sambuc struct T3 : virtual T1, virtual T0 { long long a; };
707*0a6a1f1dSLionel Sambuc 
708*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
709*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
710*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
711*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct T3
712*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (T3 vbtable pointer)
713*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   long long a
714*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct T1 (virtual base)
715*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     struct T0 (base) (empty)
716*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     char a
717*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |   struct T0 (virtual base) (empty)
718*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=24, align=8
719*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=8]
720*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
721*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
722*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
723*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct T3
724*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (T3 vbtable pointer)
725*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   long long a
726*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct T1 (virtual base)
727*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     struct T0 (base) (empty)
728*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     char a
729*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct T0 (virtual base) (empty)
730*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
731*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
732*0a6a1f1dSLionel Sambuc 
733*0a6a1f1dSLionel Sambuc struct Q0A {};
734*0a6a1f1dSLionel Sambuc struct Q0B { char Q0BField; };
735*0a6a1f1dSLionel Sambuc struct Q0C : virtual Q0A, virtual Q0B { char Q0CField; };
736*0a6a1f1dSLionel Sambuc struct Q0D : Q0C, Q0A {};
737*0a6a1f1dSLionel Sambuc 
738*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
739*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
740*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
741*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
742*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct Q0D
743*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct Q0C (base)
744*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (Q0C vbtable pointer)
745*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     char Q0CField
746*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct Q0A (base) (empty)
747*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct Q0A (virtual base) (empty)
748*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct Q0B (virtual base)
749*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     char Q0BField
750*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=9, align=4
751*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=4]
752*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
753*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
754*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
755*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
756*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct Q0D
757*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct Q0C (base)
758*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     (Q0C vbtable pointer)
759*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     char Q0CField
760*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct Q0A (base) (empty)
761*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct Q0A (virtual base) (empty)
762*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct Q0B (virtual base)
763*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     char Q0BField
764*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
765*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
766f4a2713aSLionel Sambuc 
767f4a2713aSLionel Sambuc int a[
768f4a2713aSLionel Sambuc sizeof(A)+
769f4a2713aSLionel Sambuc sizeof(B)+
770f4a2713aSLionel Sambuc sizeof(C)+
771f4a2713aSLionel Sambuc sizeof(D)+
772f4a2713aSLionel Sambuc sizeof(E)+
773f4a2713aSLionel Sambuc sizeof(F)+
774f4a2713aSLionel Sambuc sizeof(G)+
775f4a2713aSLionel Sambuc sizeof(H)+
776f4a2713aSLionel Sambuc sizeof(I)+
777f4a2713aSLionel Sambuc sizeof(J)+
778f4a2713aSLionel Sambuc sizeof(K)+
779f4a2713aSLionel Sambuc sizeof(L)+
780f4a2713aSLionel Sambuc sizeof(M)+
781f4a2713aSLionel Sambuc sizeof(N)+
782f4a2713aSLionel Sambuc sizeof(O)+
783f4a2713aSLionel Sambuc sizeof(P)+
784f4a2713aSLionel Sambuc sizeof(Q)+
785f4a2713aSLionel Sambuc sizeof(R)+
786f4a2713aSLionel Sambuc sizeof(S)+
787f4a2713aSLionel Sambuc sizeof(T)+
788f4a2713aSLionel Sambuc sizeof(U)+
789*0a6a1f1dSLionel Sambuc sizeof(V)+
790*0a6a1f1dSLionel Sambuc sizeof(T3)+
791*0a6a1f1dSLionel Sambuc sizeof(Q0D)];
792