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