xref: /aosp_15_r20/external/clang/test/Layout/ms-x86-declspec-empty_bases.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
2*67e74705SXin Li // RUN:            | FileCheck %s
3*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
4*67e74705SXin Li // RUN:            | FileCheck %s
5*67e74705SXin Li 
6*67e74705SXin Li namespace test1 {
7*67e74705SXin Li 
8*67e74705SXin Li struct A {
9*67e74705SXin Li   int a;
10*67e74705SXin Li };
11*67e74705SXin Li struct B {
12*67e74705SXin Li   int b;
13*67e74705SXin Li };
14*67e74705SXin Li struct C {};
15*67e74705SXin Li struct __declspec(align(16)) D {};
16*67e74705SXin Li struct __declspec(empty_bases) X : A, D, B, C {
17*67e74705SXin Li };
18*67e74705SXin Li 
19*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
20*67e74705SXin Li // CHECK-NEXT:          0 | struct test1::A
21*67e74705SXin Li // CHECK-NEXT:          0 |   int a
22*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
23*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
24*67e74705SXin Li 
25*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
26*67e74705SXin Li // CHECK-NEXT:          0 | struct test1::D (empty)
27*67e74705SXin Li // CHECK-NEXT:            | [sizeof=16, align=16,
28*67e74705SXin Li // CHECK-NEXT:            |  nvsize=0, nvalign=16]
29*67e74705SXin Li 
30*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
31*67e74705SXin Li // CHECK-NEXT:          0 | struct test1::B
32*67e74705SXin Li // CHECK-NEXT:          0 |   int b
33*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
34*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
35*67e74705SXin Li 
36*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
37*67e74705SXin Li // CHECK-NEXT:          0 | struct test1::C (empty)
38*67e74705SXin Li // CHECK-NEXT:            | [sizeof=1, align=1,
39*67e74705SXin Li // CHECK-NEXT:            |  nvsize=0, nvalign=1]
40*67e74705SXin Li 
41*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
42*67e74705SXin Li // CHECK-NEXT:          0 | struct test1::X
43*67e74705SXin Li // CHECK-NEXT:          0 |   struct test1::A (base)
44*67e74705SXin Li // CHECK-NEXT:          0 |     int a
45*67e74705SXin Li // CHECK-NEXT:          0 |   struct test1::D (base) (empty)
46*67e74705SXin Li // CHECK-NEXT:          0 |   struct test1::C (base) (empty)
47*67e74705SXin Li // CHECK-NEXT:          4 |   struct test1::B (base)
48*67e74705SXin Li // CHECK-NEXT:          4 |     int b
49*67e74705SXin Li // CHECK-NEXT:            | [sizeof=16, align=16,
50*67e74705SXin Li // CHECK-NEXT:            |  nvsize=16, nvalign=16]
51*67e74705SXin Li 
52*67e74705SXin Li int _ = sizeof(X);
53*67e74705SXin Li }
54*67e74705SXin Li 
55*67e74705SXin Li namespace test2 {
56*67e74705SXin Li struct A {
57*67e74705SXin Li   int a;
58*67e74705SXin Li };
59*67e74705SXin Li struct __declspec(empty_bases) B {};
60*67e74705SXin Li struct C : A {
61*67e74705SXin Li   B b;
62*67e74705SXin Li };
63*67e74705SXin Li 
64*67e74705SXin Li struct D {};
65*67e74705SXin Li struct E {
66*67e74705SXin Li   int e;
67*67e74705SXin Li };
68*67e74705SXin Li struct F : D, E {};
69*67e74705SXin Li 
70*67e74705SXin Li struct G : C, F {};
71*67e74705SXin Li 
72*67e74705SXin Li int _ = sizeof(G);
73*67e74705SXin Li 
74*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
75*67e74705SXin Li // CHECK-NEXT:          0 | struct test2::A
76*67e74705SXin Li // CHECK-NEXT:          0 |   int a
77*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
78*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
79*67e74705SXin Li 
80*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
81*67e74705SXin Li // CHECK-NEXT:          0 | struct test2::B (empty)
82*67e74705SXin Li // CHECK-NEXT:            | [sizeof=1, align=1,
83*67e74705SXin Li // CHECK-NEXT:            |  nvsize=0, nvalign=1]
84*67e74705SXin Li 
85*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
86*67e74705SXin Li // CHECK-NEXT:          0 | struct test2::C
87*67e74705SXin Li // CHECK-NEXT:          0 |   struct test2::A (base)
88*67e74705SXin Li // CHECK-NEXT:          0 |     int a
89*67e74705SXin Li // CHECK-NEXT:          4 |   struct test2::B b (empty)
90*67e74705SXin Li // CHECK-NEXT:            | [sizeof=8, align=4,
91*67e74705SXin Li // CHECK-NEXT:            |  nvsize=8, nvalign=4]
92*67e74705SXin Li 
93*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
94*67e74705SXin Li // CHECK-NEXT:          0 | struct test2::D (empty)
95*67e74705SXin Li // CHECK-NEXT:            | [sizeof=1, align=1,
96*67e74705SXin Li // CHECK-NEXT:            |  nvsize=0, nvalign=1]
97*67e74705SXin Li 
98*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
99*67e74705SXin Li // CHECK-NEXT:          0 | struct test2::E
100*67e74705SXin Li // CHECK-NEXT:          0 |   int e
101*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
102*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
103*67e74705SXin Li 
104*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
105*67e74705SXin Li // CHECK-NEXT:          0 | struct test2::F
106*67e74705SXin Li // CHECK-NEXT:          0 |   struct test2::D (base) (empty)
107*67e74705SXin Li // CHECK-NEXT:          0 |   struct test2::E (base)
108*67e74705SXin Li // CHECK-NEXT:          0 |     int e
109*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
110*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
111*67e74705SXin Li 
112*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
113*67e74705SXin Li // CHECK-NEXT:          0 | struct test2::G
114*67e74705SXin Li // CHECK-NEXT:          0 |   struct test2::C (base)
115*67e74705SXin Li // CHECK-NEXT:          0 |     struct test2::A (base)
116*67e74705SXin Li // CHECK-NEXT:          0 |       int a
117*67e74705SXin Li // CHECK-NEXT:          4 |     struct test2::B b (empty)
118*67e74705SXin Li // CHECK-NEXT:          8 |   struct test2::F (base)
119*67e74705SXin Li // CHECK-NEXT:          8 |     struct test2::D (base) (empty)
120*67e74705SXin Li // CHECK-NEXT:          8 |     struct test2::E (base)
121*67e74705SXin Li // CHECK-NEXT:          8 |       int e
122*67e74705SXin Li // CHECK-NEXT:            | [sizeof=12, align=4,
123*67e74705SXin Li // CHECK-NEXT:            |  nvsize=12, nvalign=4]
124*67e74705SXin Li }
125*67e74705SXin Li 
126*67e74705SXin Li namespace test3 {
127*67e74705SXin Li struct A {
128*67e74705SXin Li   int a;
129*67e74705SXin Li };
130*67e74705SXin Li struct B {};
131*67e74705SXin Li struct C : A {
132*67e74705SXin Li   B b;
133*67e74705SXin Li };
134*67e74705SXin Li 
135*67e74705SXin Li struct D {};
136*67e74705SXin Li struct E {
137*67e74705SXin Li   int e;
138*67e74705SXin Li };
139*67e74705SXin Li struct F : D, E {};
140*67e74705SXin Li 
141*67e74705SXin Li struct __declspec(empty_bases) G : C, F {};
142*67e74705SXin Li 
143*67e74705SXin Li int _ = sizeof(G);
144*67e74705SXin Li 
145*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
146*67e74705SXin Li // CHECK-NEXT:          0 | struct test3::A
147*67e74705SXin Li // CHECK-NEXT:          0 |   int a
148*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
149*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
150*67e74705SXin Li 
151*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
152*67e74705SXin Li // CHECK-NEXT:          0 | struct test3::B (empty)
153*67e74705SXin Li // CHECK-NEXT:            | [sizeof=1, align=1,
154*67e74705SXin Li // CHECK-NEXT:            |  nvsize=0, nvalign=1]
155*67e74705SXin Li 
156*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
157*67e74705SXin Li // CHECK-NEXT:          0 | struct test3::C
158*67e74705SXin Li // CHECK-NEXT:          0 |   struct test3::A (base)
159*67e74705SXin Li // CHECK-NEXT:          0 |     int a
160*67e74705SXin Li // CHECK-NEXT:          4 |   struct test3::B b (empty)
161*67e74705SXin Li // CHECK-NEXT:            | [sizeof=8, align=4,
162*67e74705SXin Li // CHECK-NEXT:            |  nvsize=8, nvalign=4]
163*67e74705SXin Li 
164*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
165*67e74705SXin Li // CHECK-NEXT:          0 | struct test3::D (empty)
166*67e74705SXin Li // CHECK-NEXT:            | [sizeof=1, align=1,
167*67e74705SXin Li // CHECK-NEXT:            |  nvsize=0, nvalign=1]
168*67e74705SXin Li 
169*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
170*67e74705SXin Li // CHECK-NEXT:          0 | struct test3::E
171*67e74705SXin Li // CHECK-NEXT:          0 |   int e
172*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
173*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
174*67e74705SXin Li 
175*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
176*67e74705SXin Li // CHECK-NEXT:          0 | struct test3::F
177*67e74705SXin Li // CHECK-NEXT:          0 |   struct test3::D (base) (empty)
178*67e74705SXin Li // CHECK-NEXT:          0 |   struct test3::E (base)
179*67e74705SXin Li // CHECK-NEXT:          0 |     int e
180*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
181*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
182*67e74705SXin Li 
183*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
184*67e74705SXin Li // CHECK-NEXT:          0 | struct test3::G
185*67e74705SXin Li // CHECK-NEXT:          0 |   struct test3::C (base)
186*67e74705SXin Li // CHECK-NEXT:          0 |     struct test3::A (base)
187*67e74705SXin Li // CHECK-NEXT:          0 |       int a
188*67e74705SXin Li // CHECK-NEXT:          4 |     struct test3::B b (empty)
189*67e74705SXin Li // CHECK-NEXT:          8 |   struct test3::F (base)
190*67e74705SXin Li // CHECK-NEXT:          8 |     struct test3::D (base) (empty)
191*67e74705SXin Li // CHECK-NEXT:          8 |     struct test3::E (base)
192*67e74705SXin Li // CHECK-NEXT:          8 |       int e
193*67e74705SXin Li // CHECK-NEXT:            | [sizeof=12, align=4,
194*67e74705SXin Li // CHECK-NEXT:            |  nvsize=12, nvalign=4]
195*67e74705SXin Li }
196*67e74705SXin Li 
197*67e74705SXin Li namespace test4 {
198*67e74705SXin Li struct A {
199*67e74705SXin Li   int a;
200*67e74705SXin Li };
201*67e74705SXin Li struct B {};
202*67e74705SXin Li struct C : A {
203*67e74705SXin Li   B b;
204*67e74705SXin Li };
205*67e74705SXin Li 
206*67e74705SXin Li struct __declspec(empty_bases) D {};
207*67e74705SXin Li struct E {
208*67e74705SXin Li   int e;
209*67e74705SXin Li };
210*67e74705SXin Li struct F : D, E {};
211*67e74705SXin Li 
212*67e74705SXin Li struct G : C, F {};
213*67e74705SXin Li 
214*67e74705SXin Li int _ = sizeof(G);
215*67e74705SXin Li 
216*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
217*67e74705SXin Li // CHECK-NEXT:          0 | struct test4::A
218*67e74705SXin Li // CHECK-NEXT:          0 |   int a
219*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
220*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
221*67e74705SXin Li 
222*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
223*67e74705SXin Li // CHECK-NEXT:          0 | struct test4::B (empty)
224*67e74705SXin Li // CHECK-NEXT:            | [sizeof=1, align=1,
225*67e74705SXin Li // CHECK-NEXT:            |  nvsize=0, nvalign=1]
226*67e74705SXin Li 
227*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
228*67e74705SXin Li // CHECK-NEXT:          0 | struct test4::C
229*67e74705SXin Li // CHECK-NEXT:          0 |   struct test4::A (base)
230*67e74705SXin Li // CHECK-NEXT:          0 |     int a
231*67e74705SXin Li // CHECK-NEXT:          4 |   struct test4::B b (empty)
232*67e74705SXin Li // CHECK-NEXT:            | [sizeof=8, align=4,
233*67e74705SXin Li // CHECK-NEXT:            |  nvsize=8, nvalign=4]
234*67e74705SXin Li 
235*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
236*67e74705SXin Li // CHECK-NEXT:          0 | struct test4::D (empty)
237*67e74705SXin Li // CHECK-NEXT:            | [sizeof=1, align=1,
238*67e74705SXin Li // CHECK-NEXT:            |  nvsize=0, nvalign=1]
239*67e74705SXin Li 
240*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
241*67e74705SXin Li // CHECK-NEXT:          0 | struct test4::E
242*67e74705SXin Li // CHECK-NEXT:          0 |   int e
243*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
244*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
245*67e74705SXin Li 
246*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
247*67e74705SXin Li // CHECK-NEXT:          0 | struct test4::F
248*67e74705SXin Li // CHECK-NEXT:          0 |   struct test4::D (base) (empty)
249*67e74705SXin Li // CHECK-NEXT:          0 |   struct test4::E (base)
250*67e74705SXin Li // CHECK-NEXT:          0 |     int e
251*67e74705SXin Li // CHECK-NEXT:            | [sizeof=4, align=4,
252*67e74705SXin Li // CHECK-NEXT:            |  nvsize=4, nvalign=4]
253*67e74705SXin Li 
254*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
255*67e74705SXin Li // CHECK-NEXT:          0 | struct test4::G
256*67e74705SXin Li // CHECK-NEXT:          0 |   struct test4::C (base)
257*67e74705SXin Li // CHECK-NEXT:          0 |     struct test4::A (base)
258*67e74705SXin Li // CHECK-NEXT:          0 |       int a
259*67e74705SXin Li // CHECK-NEXT:          4 |     struct test4::B b (empty)
260*67e74705SXin Li // CHECK-NEXT:          8 |   struct test4::F (base)
261*67e74705SXin Li // CHECK-NEXT:          8 |     struct test4::D (base) (empty)
262*67e74705SXin Li // CHECK-NEXT:          8 |     struct test4::E (base)
263*67e74705SXin Li // CHECK-NEXT:          8 |       int e
264*67e74705SXin Li // CHECK-NEXT:            | [sizeof=12, align=4,
265*67e74705SXin Li // CHECK-NEXT:            |  nvsize=12, nvalign=4]
266*67e74705SXin Li }
267