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