Home | History | Annotate | Download | only in Layout
      1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only %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 -fsyntax-only %s 2>/dev/null \
      4 // RUN:            | FileCheck %s -check-prefix CHECK-X64
      5 
      6 extern "C" int printf(const char *fmt, ...);
      7 
      8 struct B0 {
      9 	int a;
     10 	B0() : a(0xf00000B0) {}
     11 };
     12 struct __declspec(align(16)) B1 {
     13 	int a;
     14 	B1() : a(0xf00000B1) {}
     15 };
     16 struct B2 {
     17 	__declspec(align(16)) int a;
     18 	B2() : a(0xf00000B2) {}
     19 };
     20 struct __declspec(align(16)) B3 {
     21 	long long a1;
     22 	int a;
     23 	B3() : a(0xf00000B3), a1(0xf00000B3f00000B3ll) {}
     24 };
     25 struct V {
     26 	char a;
     27 	V() : a(0X11) {}
     28 };
     29 struct __declspec(align(32)) A16 {};
     30 struct V1 : A16 { virtual void f() {} };
     31 struct V2 {
     32 	long long a;
     33 	int a1;
     34 	V2() : a(0xf0000011f0000011ll), a1(0xf0000011) {}
     35 };
     36 struct V3 {
     37 	int a;
     38 	V3() : a(0xf0000022) {}
     39 };
     40 struct __declspec(align(16)) A16X {
     41 };
     42 struct __declspec(align(16)) B0X {
     43 	int a, a1;
     44 	B0X() : a(0xf00000B0), a1(0xf00000B0) {}
     45 };
     46 struct B1X {
     47 	int a;
     48 	B1X() : a(0xf00000B1) {}
     49 };
     50 struct B2X {
     51 	int a;
     52 	B2X() : a(0xf00000B2) {}
     53 };
     54 struct __declspec(align(16)) B3X {
     55 	int a;
     56 	B3X() : a(0xf00000B3) {}
     57 	virtual void g() {}
     58 };
     59 struct B4X : A16X {
     60 	int a, a1;
     61 	B4X() : a(0xf00000B4), a1(0xf00000B4) {}
     62 };
     63 struct B5X : virtual A16X {
     64 	int a, a1;
     65 	B5X() : a(0xf00000B5), a1(0xf00000B5) {}
     66 };
     67 struct B6X {
     68 	int a;
     69 	B6X() : a(0xf00000B6) {}
     70 };
     71 
     72 struct A : B1, B0, B2, virtual V {
     73 	int a;
     74 	A() : a(0xf000000A) {}
     75 };
     76 
     77 // CHECK: *** Dumping AST Record Layout
     78 // CHECK: *** Dumping AST Record Layout
     79 // CHECK: *** Dumping AST Record Layout
     80 // CHECK: *** Dumping AST Record Layout
     81 // CHECK: *** Dumping AST Record Layout
     82 // CHECK-NEXT:    0 | struct A
     83 // CHECK-NEXT:    0 |   struct B1 (base)
     84 // CHECK-NEXT:    0 |     int a
     85 // CHECK-NEXT:    4 |   struct B0 (base)
     86 // CHECK-NEXT:    4 |     int a
     87 // CHECK-NEXT:   16 |   struct B2 (base)
     88 // CHECK-NEXT:   16 |     int a
     89 // CHECK-NEXT:   32 |   (A vbtable pointer)
     90 // CHECK-NEXT:   48 |   int a
     91 // CHECK-NEXT:   64 |   struct V (virtual base)
     92 // CHECK-NEXT:   64 |     char a
     93 // CHECK-NEXT:      | [sizeof=80, align=16
     94 // CHECK-NEXT:      |  nvsize=64, nvalign=16]
     95 // CHECK-X64: *** Dumping AST Record Layout
     96 // CHECK-X64: *** Dumping AST Record Layout
     97 // CHECK-X64: *** Dumping AST Record Layout
     98 // CHECK-X64: *** Dumping AST Record Layout
     99 // CHECK-X64: *** Dumping AST Record Layout
    100 // CHECK-X64-NEXT:    0 | struct A
    101 // CHECK-X64-NEXT:    0 |   struct B1 (base)
    102 // CHECK-X64-NEXT:    0 |     int a
    103 // CHECK-X64-NEXT:    4 |   struct B0 (base)
    104 // CHECK-X64-NEXT:    4 |     int a
    105 // CHECK-X64-NEXT:   16 |   struct B2 (base)
    106 // CHECK-X64-NEXT:   16 |     int a
    107 // CHECK-X64-NEXT:   32 |   (A vbtable pointer)
    108 // CHECK-X64-NEXT:   48 |   int a
    109 // CHECK-X64-NEXT:   64 |   struct V (virtual base)
    110 // CHECK-X64-NEXT:   64 |     char a
    111 // CHECK-X64-NEXT:      | [sizeof=80, align=16
    112 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
    113 
    114 struct B : B2, B0, B1, virtual V {
    115 	int a;
    116 	B() : a(0xf000000B) {}
    117 };
    118 
    119 // CHECK: *** Dumping AST Record Layout
    120 // CHECK-NEXT:    0 | struct B
    121 // CHECK-NEXT:    0 |   struct B2 (base)
    122 // CHECK-NEXT:    0 |     int a
    123 // CHECK-NEXT:   16 |   struct B0 (base)
    124 // CHECK-NEXT:   16 |     int a
    125 // CHECK-NEXT:   32 |   struct B1 (base)
    126 // CHECK-NEXT:   32 |     int a
    127 // CHECK-NEXT:   36 |   (B vbtable pointer)
    128 // CHECK-NEXT:   52 |   int a
    129 // CHECK-NEXT:   64 |   struct V (virtual base)
    130 // CHECK-NEXT:   64 |     char a
    131 // CHECK-NEXT:      | [sizeof=80, align=16
    132 // CHECK-NEXT:      |  nvsize=64, nvalign=16]
    133 // CHECK-X64: *** Dumping AST Record Layout
    134 // CHECK-X64-NEXT:    0 | struct B
    135 // CHECK-X64-NEXT:    0 |   struct B2 (base)
    136 // CHECK-X64-NEXT:    0 |     int a
    137 // CHECK-X64-NEXT:   16 |   struct B0 (base)
    138 // CHECK-X64-NEXT:   16 |     int a
    139 // CHECK-X64-NEXT:   32 |   struct B1 (base)
    140 // CHECK-X64-NEXT:   32 |     int a
    141 // CHECK-X64-NEXT:   40 |   (B vbtable pointer)
    142 // CHECK-X64-NEXT:   52 |   int a
    143 // CHECK-X64-NEXT:   64 |   struct V (virtual base)
    144 // CHECK-X64-NEXT:   64 |     char a
    145 // CHECK-X64-NEXT:      | [sizeof=80, align=16
    146 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
    147 
    148 struct C : B1, B0, virtual V {
    149 	int a;
    150 	long long a1;
    151 	C() : a(0xf000000C), a1(0xf000000Cf000000Cll) {}
    152 };
    153 
    154 // CHECK: *** Dumping AST Record Layout
    155 // CHECK-NEXT:    0 | struct C
    156 // CHECK-NEXT:    0 |   struct B1 (base)
    157 // CHECK-NEXT:    0 |     int a
    158 // CHECK-NEXT:    4 |   struct B0 (base)
    159 // CHECK-NEXT:    4 |     int a
    160 // CHECK-NEXT:    8 |   (C vbtable pointer)
    161 // CHECK-NEXT:   24 |   int a
    162 // CHECK-NEXT:   32 |   long long a1
    163 // CHECK-NEXT:   48 |   struct V (virtual base)
    164 // CHECK-NEXT:   48 |     char a
    165 // CHECK-NEXT:      | [sizeof=64, align=16
    166 // CHECK-NEXT:      |  nvsize=48, nvalign=16]
    167 // CHECK-X64: *** Dumping AST Record Layout
    168 // CHECK-X64-NEXT:    0 | struct C
    169 // CHECK-X64-NEXT:    0 |   struct B1 (base)
    170 // CHECK-X64-NEXT:    0 |     int a
    171 // CHECK-X64-NEXT:    4 |   struct B0 (base)
    172 // CHECK-X64-NEXT:    4 |     int a
    173 // CHECK-X64-NEXT:    8 |   (C vbtable pointer)
    174 // CHECK-X64-NEXT:   24 |   int a
    175 // CHECK-X64-NEXT:   32 |   long long a1
    176 // CHECK-X64-NEXT:   48 |   struct V (virtual base)
    177 // CHECK-X64-NEXT:   48 |     char a
    178 // CHECK-X64-NEXT:      | [sizeof=64, align=16
    179 // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
    180 
    181 struct D : B2, B0, virtual V {
    182 	int a;
    183 	D() : a(0xf000000D) {}
    184 };
    185 
    186 // CHECK: *** Dumping AST Record Layout
    187 // CHECK-NEXT:    0 | struct D
    188 // CHECK-NEXT:    0 |   struct B2 (base)
    189 // CHECK-NEXT:    0 |     int a
    190 // CHECK-NEXT:   16 |   struct B0 (base)
    191 // CHECK-NEXT:   16 |     int a
    192 // CHECK-NEXT:   20 |   (D vbtable pointer)
    193 // CHECK-NEXT:   36 |   int a
    194 // CHECK-NEXT:   48 |   struct V (virtual base)
    195 // CHECK-NEXT:   48 |     char a
    196 // CHECK-NEXT:      | [sizeof=64, align=16
    197 // CHECK-NEXT:      |  nvsize=48, nvalign=16]
    198 // CHECK-X64: *** Dumping AST Record Layout
    199 // CHECK-X64-NEXT:    0 | struct D
    200 // CHECK-X64-NEXT:    0 |   struct B2 (base)
    201 // CHECK-X64-NEXT:    0 |     int a
    202 // CHECK-X64-NEXT:   16 |   struct B0 (base)
    203 // CHECK-X64-NEXT:   16 |     int a
    204 // CHECK-X64-NEXT:   24 |   (D vbtable pointer)
    205 // CHECK-X64-NEXT:   36 |   int a
    206 // CHECK-X64-NEXT:   48 |   struct V (virtual base)
    207 // CHECK-X64-NEXT:   48 |     char a
    208 // CHECK-X64-NEXT:      | [sizeof=64, align=16
    209 // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
    210 
    211 struct E : B3, B0, virtual V {
    212 	int a;
    213 	E() : a(0xf000000E) {}
    214 };
    215 
    216 // CHECK: *** Dumping AST Record Layout
    217 // CHECK: *** Dumping AST Record Layout
    218 // CHECK-NEXT:    0 | struct E
    219 // CHECK-NEXT:    0 |   struct B3 (base)
    220 // CHECK-NEXT:    0 |     long long a1
    221 // CHECK-NEXT:    8 |     int a
    222 // CHECK-NEXT:   16 |   struct B0 (base)
    223 // CHECK-NEXT:   16 |     int a
    224 // CHECK-NEXT:   20 |   (E vbtable pointer)
    225 // CHECK-NEXT:   36 |   int a
    226 // CHECK-NEXT:   48 |   struct V (virtual base)
    227 // CHECK-NEXT:   48 |     char a
    228 // CHECK-NEXT:      | [sizeof=64, align=16
    229 // CHECK-NEXT:      |  nvsize=48, nvalign=16]
    230 // CHECK-X64: *** Dumping AST Record Layout
    231 // CHECK-X64: *** Dumping AST Record Layout
    232 // CHECK-X64-NEXT:    0 | struct E
    233 // CHECK-X64-NEXT:    0 |   struct B3 (base)
    234 // CHECK-X64-NEXT:    0 |     long long a1
    235 // CHECK-X64-NEXT:    8 |     int a
    236 // CHECK-X64-NEXT:   16 |   struct B0 (base)
    237 // CHECK-X64-NEXT:   16 |     int a
    238 // CHECK-X64-NEXT:   24 |   (E vbtable pointer)
    239 // CHECK-X64-NEXT:   36 |   int a
    240 // CHECK-X64-NEXT:   48 |   struct V (virtual base)
    241 // CHECK-X64-NEXT:   48 |     char a
    242 // CHECK-X64-NEXT:      | [sizeof=64, align=16
    243 // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
    244 
    245 struct F : B0, virtual V1 {
    246 	__declspec(align(16)) int a;
    247 	F() : a(0xf000000F) {}
    248 	virtual void f() {}
    249 };
    250 
    251 // CHECK: *** Dumping AST Record Layout
    252 // CHECK: *** Dumping AST Record Layout
    253 // CHECK: *** Dumping AST Record Layout
    254 // CHECK-NEXT:    0 | struct F
    255 // CHECK-NEXT:    0 |   struct B0 (base)
    256 // CHECK-NEXT:    0 |     int a
    257 // CHECK-NEXT:    4 |   (F vbtable pointer)
    258 // CHECK-NEXT:   32 |   int a
    259 // CHECK-NEXT:   92 |   (vtordisp for vbase V1)
    260 // CHECK-NEXT:   96 |   struct V1 (virtual base)
    261 // CHECK-NEXT:   96 |     (V1 vftable pointer)
    262 // CHECK-NEXT:  128 |     struct A16 (base) (empty)
    263 // CHECK-NEXT:      | [sizeof=128, align=32
    264 // CHECK-NEXT:      |  nvsize=48, nvalign=32]
    265 // CHECK-X64: *** Dumping AST Record Layout
    266 // CHECK-X64: *** Dumping AST Record Layout
    267 // CHECK-X64: *** Dumping AST Record Layout
    268 // CHECK-X64-NEXT:    0 | struct F
    269 // CHECK-X64-NEXT:    0 |   struct B0 (base)
    270 // CHECK-X64-NEXT:    0 |     int a
    271 // CHECK-X64-NEXT:    8 |   (F vbtable pointer)
    272 // CHECK-X64-NEXT:   32 |   int a
    273 // CHECK-X64-NEXT:   92 |   (vtordisp for vbase V1)
    274 // CHECK-X64-NEXT:   96 |   struct V1 (virtual base)
    275 // CHECK-X64-NEXT:   96 |     (V1 vftable pointer)
    276 // CHECK-X64-NEXT:  128 |     struct A16 (base) (empty)
    277 // CHECK-X64-NEXT:      | [sizeof=128, align=32
    278 // CHECK-X64-NEXT:      |  nvsize=48, nvalign=32]
    279 
    280 struct G : virtual V2, virtual V3 {
    281 	int a;
    282 	G() : a(0xf0000001) {}
    283 };
    284 
    285 // CHECK: *** Dumping AST Record Layout
    286 // CHECK: *** Dumping AST Record Layout
    287 // CHECK: *** Dumping AST Record Layout
    288 // CHECK-NEXT:    0 | struct G
    289 // CHECK-NEXT:    0 |   (G vbtable pointer)
    290 // CHECK-NEXT:    4 |   int a
    291 // CHECK-NEXT:    8 |   struct V2 (virtual base)
    292 // CHECK-NEXT:    8 |     long long a
    293 // CHECK-NEXT:   16 |     int a1
    294 // CHECK-NEXT:   24 |   struct V3 (virtual base)
    295 // CHECK-NEXT:   24 |     int a
    296 // CHECK-NEXT:      | [sizeof=28, align=8
    297 // CHECK-NEXT:      |  nvsize=8, nvalign=8]
    298 // CHECK-X64: *** Dumping AST Record Layout
    299 // CHECK-X64: *** Dumping AST Record Layout
    300 // CHECK-X64: *** Dumping AST Record Layout
    301 // CHECK-X64-NEXT:    0 | struct G
    302 // CHECK-X64-NEXT:    0 |   (G vbtable pointer)
    303 // CHECK-X64-NEXT:    8 |   int a
    304 // CHECK-X64-NEXT:   16 |   struct V2 (virtual base)
    305 // CHECK-X64-NEXT:   16 |     long long a
    306 // CHECK-X64-NEXT:   24 |     int a1
    307 // CHECK-X64-NEXT:   32 |   struct V3 (virtual base)
    308 // CHECK-X64-NEXT:   32 |     int a
    309 // CHECK-X64-NEXT:      | [sizeof=40, align=8
    310 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
    311 
    312 struct H {
    313 	__declspec(align(16)) int a;
    314 	int b;
    315 	H() : a(0xf0000010), b(0xf0000010) {}
    316 };
    317 
    318 // CHECK: *** Dumping AST Record Layout
    319 // CHECK-NEXT:    0 | struct H
    320 // CHECK-NEXT:    0 |   int a
    321 // CHECK-NEXT:    4 |   int b
    322 // CHECK-NEXT:      | [sizeof=16, align=16
    323 // CHECK-NEXT:      |  nvsize=16, nvalign=16]
    324 // CHECK-X64: *** Dumping AST Record Layout
    325 // CHECK-X64-NEXT:    0 | struct H
    326 // CHECK-X64-NEXT:    0 |   int a
    327 // CHECK-X64-NEXT:    4 |   int b
    328 // CHECK-X64-NEXT:      | [sizeof=16, align=16
    329 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
    330 
    331 struct I {
    332 	B2 a;
    333 	int b;
    334 	I() : b(0xf0000010) {}
    335 };
    336 
    337 // CHECK: *** Dumping AST Record Layout
    338 // CHECK-NEXT:    0 | struct I
    339 // CHECK-NEXT:    0 |   struct B2 a
    340 // CHECK-NEXT:    0 |     int a
    341 // CHECK:        16 |   int b
    342 // CHECK-NEXT:      | [sizeof=32, align=16
    343 // CHECK-NEXT:      |  nvsize=32, nvalign=16]
    344 // CHECK-X64: *** Dumping AST Record Layout
    345 // CHECK-X64-NEXT:    0 | struct I
    346 // CHECK-X64-NEXT:    0 |   struct B2 a
    347 // CHECK-X64-NEXT:    0 |     int a
    348 // CHECK-X64:        16 |   int b
    349 // CHECK-X64-NEXT:      | [sizeof=32, align=16
    350 // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
    351 
    352 struct AX : B0X, virtual B2X, virtual B6X, virtual B3X {
    353 	int a;
    354 	AX() : a(0xf000000A) {}
    355 	virtual void f() {}
    356 	virtual void g() {}
    357 };
    358 
    359 // CHECK: *** Dumping AST Record Layout
    360 // CHECK: *** Dumping AST Record Layout
    361 // CHECK: *** Dumping AST Record Layout
    362 // CHECK: *** Dumping AST Record Layout
    363 // CHECK: *** Dumping AST Record Layout
    364 // CHECK-NEXT:    0 | struct AX
    365 // CHECK-NEXT:    0 |   (AX vftable pointer)
    366 // CHECK-NEXT:   16 |   struct B0X (base)
    367 // CHECK-NEXT:   16 |     int a
    368 // CHECK-NEXT:   20 |     int a1
    369 // CHECK-NEXT:   24 |   (AX vbtable pointer)
    370 // CHECK-NEXT:   40 |   int a
    371 // CHECK-NEXT:   48 |   struct B2X (virtual base)
    372 // CHECK-NEXT:   48 |     int a
    373 // CHECK-NEXT:   52 |   struct B6X (virtual base)
    374 // CHECK-NEXT:   52 |     int a
    375 // CHECK-NEXT:   76 |   (vtordisp for vbase B3X)
    376 // CHECK-NEXT:   80 |   struct B3X (virtual base)
    377 // CHECK-NEXT:   80 |     (B3X vftable pointer)
    378 // CHECK-NEXT:   84 |     int a
    379 // CHECK-NEXT:      | [sizeof=96, align=16
    380 // CHECK-NEXT:      |  nvsize=48, nvalign=16]
    381 // CHECK-X64: *** Dumping AST Record Layout
    382 // CHECK-X64: *** Dumping AST Record Layout
    383 // CHECK-X64: *** Dumping AST Record Layout
    384 // CHECK-X64: *** Dumping AST Record Layout
    385 // CHECK-X64: *** Dumping AST Record Layout
    386 // CHECK-X64-NEXT:    0 | struct AX
    387 // CHECK-X64-NEXT:    0 |   (AX vftable pointer)
    388 // CHECK-X64-NEXT:   16 |   struct B0X (base)
    389 // CHECK-X64-NEXT:   16 |     int a
    390 // CHECK-X64-NEXT:   20 |     int a1
    391 // CHECK-X64-NEXT:   24 |   (AX vbtable pointer)
    392 // CHECK-X64-NEXT:   40 |   int a
    393 // CHECK-X64-NEXT:   48 |   struct B2X (virtual base)
    394 // CHECK-X64-NEXT:   48 |     int a
    395 // CHECK-X64-NEXT:   52 |   struct B6X (virtual base)
    396 // CHECK-X64-NEXT:   52 |     int a
    397 // CHECK-X64-NEXT:   76 |   (vtordisp for vbase B3X)
    398 // CHECK-X64-NEXT:   80 |   struct B3X (virtual base)
    399 // CHECK-X64-NEXT:   80 |     (B3X vftable pointer)
    400 // CHECK-X64-NEXT:   88 |     int a
    401 // CHECK-X64-NEXT:      | [sizeof=96, align=16
    402 // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
    403 
    404 struct BX : B4X, virtual B2X, virtual B6X, virtual B3X {
    405 	int a;
    406 	BX() : a(0xf000000B) {}
    407 	virtual void f() {}
    408 	virtual void g() {}
    409 };
    410 
    411 // CHECK: *** Dumping AST Record Layout
    412 // CHECK: *** Dumping AST Record Layout
    413 // CHECK: *** Dumping AST Record Layout
    414 // CHECK-NEXT:    0 | struct BX
    415 // CHECK-NEXT:    0 |   (BX vftable pointer)
    416 // CHECK-NEXT:   16 |   struct B4X (base)
    417 // CHECK-NEXT:   16 |     struct A16X (base) (empty)
    418 // CHECK-NEXT:   16 |     int a
    419 // CHECK-NEXT:   20 |     int a1
    420 // CHECK-NEXT:   32 |   (BX vbtable pointer)
    421 // CHECK-NEXT:   48 |   int a
    422 // CHECK-NEXT:   64 |   struct B2X (virtual base)
    423 // CHECK-NEXT:   64 |     int a
    424 // CHECK-NEXT:   68 |   struct B6X (virtual base)
    425 // CHECK-NEXT:   68 |     int a
    426 // CHECK-NEXT:   92 |   (vtordisp for vbase B3X)
    427 // CHECK-NEXT:   96 |   struct B3X (virtual base)
    428 // CHECK-NEXT:   96 |     (B3X vftable pointer)
    429 // CHECK-NEXT:  100 |     int a
    430 // CHECK-NEXT:      | [sizeof=112, align=16
    431 // CHECK-NEXT:      |  nvsize=64, nvalign=16]
    432 // CHECK-X64: *** Dumping AST Record Layout
    433 // CHECK-X64: *** Dumping AST Record Layout
    434 // CHECK-X64: *** Dumping AST Record Layout
    435 // CHECK-X64-NEXT:    0 | struct BX
    436 // CHECK-X64-NEXT:    0 |   (BX vftable pointer)
    437 // CHECK-X64-NEXT:   16 |   struct B4X (base)
    438 // CHECK-X64-NEXT:   16 |     struct A16X (base) (empty)
    439 // CHECK-X64-NEXT:   16 |     int a
    440 // CHECK-X64-NEXT:   20 |     int a1
    441 // CHECK-X64-NEXT:   32 |   (BX vbtable pointer)
    442 // CHECK-X64-NEXT:   48 |   int a
    443 // CHECK-X64-NEXT:   64 |   struct B2X (virtual base)
    444 // CHECK-X64-NEXT:   64 |     int a
    445 // CHECK-X64-NEXT:   68 |   struct B6X (virtual base)
    446 // CHECK-X64-NEXT:   68 |     int a
    447 // CHECK-X64-NEXT:   92 |   (vtordisp for vbase B3X)
    448 // CHECK-X64-NEXT:   96 |   struct B3X (virtual base)
    449 // CHECK-X64-NEXT:   96 |     (B3X vftable pointer)
    450 // CHECK-X64-NEXT:  104 |     int a
    451 // CHECK-X64-NEXT:      | [sizeof=112, align=16
    452 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
    453 
    454 struct CX : B5X, virtual B2X, virtual B6X, virtual B3X {
    455 	int a;
    456 	CX() : a(0xf000000C) {}
    457 	virtual void f() {}
    458 	virtual void g() {}
    459 };
    460 
    461 // CHECK: *** Dumping AST Record Layout
    462 // CHECK: *** Dumping AST Record Layout
    463 // CHECK-NEXT:    0 | struct CX
    464 // CHECK-NEXT:    0 |   (CX vftable pointer)
    465 // CHECK-NEXT:   16 |   struct B5X (base)
    466 // CHECK-NEXT:   16 |     (B5X vbtable pointer)
    467 // CHECK-NEXT:   20 |     int a
    468 // CHECK-NEXT:   24 |     int a1
    469 // CHECK-NEXT:   28 |   int a
    470 // CHECK-NEXT:   32 |   struct A16X (virtual base) (empty)
    471 // CHECK-NEXT:   32 |   struct B2X (virtual base)
    472 // CHECK-NEXT:   32 |     int a
    473 // CHECK-NEXT:   36 |   struct B6X (virtual base)
    474 // CHECK-NEXT:   36 |     int a
    475 // CHECK-NEXT:   60 |   (vtordisp for vbase B3X)
    476 // CHECK-NEXT:   64 |   struct B3X (virtual base)
    477 // CHECK-NEXT:   64 |     (B3X vftable pointer)
    478 // CHECK-NEXT:   68 |     int a
    479 // CHECK-NEXT:      | [sizeof=80, align=16
    480 // CHECK-NEXT:      |  nvsize=32, nvalign=16]
    481 // CHECK-X64: *** Dumping AST Record Layout
    482 // CHECK-X64: *** Dumping AST Record Layout
    483 // CHECK-X64-NEXT:    0 | struct CX
    484 // CHECK-X64-NEXT:    0 |   (CX vftable pointer)
    485 // CHECK-X64-NEXT:   16 |   struct B5X (base)
    486 // CHECK-X64-NEXT:   16 |     (B5X vbtable pointer)
    487 // CHECK-X64-NEXT:   24 |     int a
    488 // CHECK-X64-NEXT:   28 |     int a1
    489 // CHECK-X64-NEXT:   32 |   int a
    490 // CHECK-X64-NEXT:   48 |   struct A16X (virtual base) (empty)
    491 // CHECK-X64-NEXT:   48 |   struct B2X (virtual base)
    492 // CHECK-X64-NEXT:   48 |     int a
    493 // CHECK-X64-NEXT:   52 |   struct B6X (virtual base)
    494 // CHECK-X64-NEXT:   52 |     int a
    495 // CHECK-X64-NEXT:   76 |   (vtordisp for vbase B3X)
    496 // CHECK-X64-NEXT:   80 |   struct B3X (virtual base)
    497 // CHECK-X64-NEXT:   80 |     (B3X vftable pointer)
    498 // CHECK-X64-NEXT:   88 |     int a
    499 // CHECK-X64-NEXT:      | [sizeof=96, align=16
    500 // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
    501 
    502 struct __declspec(align(16)) DX {
    503 	int a;
    504 	DX() : a(0xf000000D) {}
    505 	virtual void f() {}
    506 };
    507 
    508 // CHECK: *** Dumping AST Record Layout
    509 // CHECK-NEXT:    0 | struct DX
    510 // CHECK-NEXT:    0 |   (DX vftable pointer)
    511 // CHECK-NEXT:    4 |   int a
    512 // CHECK-NEXT:      | [sizeof=16, align=16
    513 // CHECK-NEXT:      |  nvsize=8, nvalign=16]
    514 // CHECK-X64: *** Dumping AST Record Layout
    515 // CHECK-X64-NEXT:    0 | struct DX
    516 // CHECK-X64-NEXT:    0 |   (DX vftable pointer)
    517 // CHECK-X64-NEXT:    8 |   int a
    518 // CHECK-X64-NEXT:      | [sizeof=16, align=16
    519 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
    520 
    521 int a[
    522 sizeof(A)+
    523 sizeof(B)+
    524 sizeof(C)+
    525 sizeof(D)+
    526 sizeof(E)+
    527 sizeof(F)+
    528 sizeof(G)+
    529 sizeof(H)+
    530 sizeof(I)+
    531 sizeof(AX)+
    532 sizeof(BX)+
    533 sizeof(CX)+
    534 sizeof(DX)];
    535