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