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