Home | History | Annotate | Download | only in Layout
      1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -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 -fms-extensions -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 __declspec(align(8)) B0 { B0() {printf("B0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
      9 struct __declspec(align(8)) B1 { B1() {printf("B1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     10 struct __declspec(align(8)) B2 { B2() {printf("B2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     11 struct __declspec(align(8)) B3 { B3() {printf("B3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     12 struct __declspec(align(8)) B4 { B4() {printf("B4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     13 
     14 struct C0 { int a; C0() : a(0xf00000C0) {printf("C0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     15 struct C1 { int a; C1() : a(0xf00000C1) {printf("C1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     16 struct C2 { int a; C2() : a(0xf00000C2) {printf("C2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     17 struct C3 { int a; C3() : a(0xf00000C3) {printf("C3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     18 struct C4 { int a; C4() : a(0xf00000C4) {printf("C4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     19 
     20 struct __declspec(align(16)) D0 { D0() {printf("D0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} virtual void f() {} };
     21 struct D1 { D1() {printf("D1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     22 struct D2 { int a[8]; D2() {printf("D2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
     23 
     24 struct A : virtual B0 {
     25 	int a;
     26 	A() : a(0xf000000A) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
     27 };
     28 
     29 // CHECK: *** Dumping AST Record Layout
     30 // CHECK: *** Dumping AST Record Layout
     31 // CHECK-NEXT:    0 | struct A
     32 // CHECK-NEXT:    0 |   (A vbtable pointer)
     33 // CHECK-NEXT:    4 |   int a
     34 // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
     35 // CHECK-NEXT:      | [sizeof=8, align=8
     36 // CHECK-NEXT:      |  nvsize=8, nvalign=8]
     37 // CHECK-X64: *** Dumping AST Record Layout
     38 // CHECK-X64: *** Dumping AST Record Layout
     39 // CHECK-X64-NEXT:    0 | struct A
     40 // CHECK-X64-NEXT:    0 |   (A vbtable pointer)
     41 // CHECK-X64-NEXT:    8 |   int a
     42 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
     43 // CHECK-X64-NEXT:      | [sizeof=16, align=8
     44 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
     45 
     46 struct B : virtual B0 {
     47 	B0 b0;
     48 	int a;
     49 	B() : a(0xf000000B) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
     50 };
     51 
     52 // CHECK: *** Dumping AST Record Layout
     53 // CHECK-NEXT:    0 | struct B
     54 // CHECK-NEXT:    0 |   (B vbtable pointer)
     55 // CHECK-NEXT:    8 |   struct B0 b0 (empty)
     56 // CHECK:        16 |   int a
     57 // CHECK-NEXT:   24 |   struct B0 (virtual base) (empty)
     58 // CHECK-NEXT:      | [sizeof=24, align=8
     59 // CHECK-NEXT:      |  nvsize=24, nvalign=8]
     60 // CHECK-X64: *** Dumping AST Record Layout
     61 // CHECK-X64-NEXT:    0 | struct B
     62 // CHECK-X64-NEXT:    0 |   (B vbtable pointer)
     63 // CHECK-X64-NEXT:    8 |   struct B0 b0 (empty)
     64 // CHECK-X64:        16 |   int a
     65 // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
     66 // CHECK-X64-NEXT:      | [sizeof=24, align=8
     67 // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
     68 
     69 struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
     70 	int a;
     71 	C() : a(0xf000000C) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
     72 };
     73 
     74 // CHECK: *** Dumping AST Record Layout
     75 // CHECK: *** Dumping AST Record Layout
     76 // CHECK: *** Dumping AST Record Layout
     77 // CHECK: *** Dumping AST Record Layout
     78 // CHECK: *** Dumping AST Record Layout
     79 // CHECK-NEXT:    0 | struct C
     80 // CHECK-NEXT:    0 |   (C vbtable pointer)
     81 // CHECK-NEXT:    4 |   int a
     82 // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
     83 // CHECK-NEXT:   16 |   struct B1 (virtual base) (empty)
     84 // CHECK-NEXT:   24 |   struct B2 (virtual base) (empty)
     85 // CHECK-NEXT:   32 |   struct B3 (virtual base) (empty)
     86 // CHECK-NEXT:   40 |   struct B4 (virtual base) (empty)
     87 // CHECK-NEXT:      | [sizeof=40, align=8
     88 // CHECK-NEXT:      |  nvsize=8, nvalign=8]
     89 // CHECK-X64: *** Dumping AST Record Layout
     90 // CHECK-X64: *** Dumping AST Record Layout
     91 // CHECK-X64: *** Dumping AST Record Layout
     92 // CHECK-X64: *** Dumping AST Record Layout
     93 // CHECK-X64: *** Dumping AST Record Layout
     94 // CHECK-X64-NEXT:    0 | struct C
     95 // CHECK-X64-NEXT:    0 |   (C vbtable pointer)
     96 // CHECK-X64-NEXT:    8 |   int a
     97 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
     98 // CHECK-X64-NEXT:   24 |   struct B1 (virtual base) (empty)
     99 // CHECK-X64-NEXT:   32 |   struct B2 (virtual base) (empty)
    100 // CHECK-X64-NEXT:   40 |   struct B3 (virtual base) (empty)
    101 // CHECK-X64-NEXT:   48 |   struct B4 (virtual base) (empty)
    102 // CHECK-X64-NEXT:      | [sizeof=48, align=8
    103 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
    104 
    105 struct D {
    106 	B0 b0;
    107 	C0 c0;
    108 	C1 c1;
    109 	C2 c2;
    110 	B1 b1;
    111 	int a;
    112 	D() : a(0xf000000D) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    113 };
    114 
    115 // CHECK: *** Dumping AST Record Layout
    116 // CHECK: *** Dumping AST Record Layout
    117 // CHECK: *** Dumping AST Record Layout
    118 // CHECK: *** Dumping AST Record Layout
    119 // CHECK-NEXT:    0 | struct D
    120 // CHECK-NEXT:    0 |   struct B0 b0 (empty)
    121 // CHECK:         8 |   struct C0 c0
    122 // CHECK-NEXT:    8 |     int a
    123 // CHECK:        12 |   struct C1 c1
    124 // CHECK-NEXT:   12 |     int a
    125 // CHECK:        16 |   struct C2 c2
    126 // CHECK-NEXT:   16 |     int a
    127 // CHECK:        24 |   struct B1 b1 (empty)
    128 // CHECK:        32 |   int a
    129 // CHECK-NEXT:      | [sizeof=40, align=8
    130 // CHECK-NEXT:      |  nvsize=40, nvalign=8]
    131 // CHECK-X64: *** Dumping AST Record Layout
    132 // CHECK-X64: *** Dumping AST Record Layout
    133 // CHECK-X64: *** Dumping AST Record Layout
    134 // CHECK-X64: *** Dumping AST Record Layout
    135 // CHECK-X64-NEXT:    0 | struct D
    136 // CHECK-X64-NEXT:    0 |   struct B0 b0 (empty)
    137 // CHECK-X64:         8 |   struct C0 c0
    138 // CHECK-X64-NEXT:    8 |     int a
    139 // CHECK-X64:        12 |   struct C1 c1
    140 // CHECK-X64-NEXT:   12 |     int a
    141 // CHECK-X64:        16 |   struct C2 c2
    142 // CHECK-X64-NEXT:   16 |     int a
    143 // CHECK-X64:        24 |   struct B1 b1 (empty)
    144 // CHECK-X64:        32 |   int a
    145 // CHECK-X64-NEXT:      | [sizeof=40, align=8
    146 // CHECK-X64-NEXT:      |  nvsize=40, nvalign=8]
    147 
    148 struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {
    149 	int a;
    150 	E() : a(0xf000000E) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    151 };
    152 
    153 // CHECK: *** Dumping AST Record Layout
    154 // CHECK-NEXT:    0 | struct E
    155 // CHECK-NEXT:    0 |   (E vbtable pointer)
    156 // CHECK-NEXT:    4 |   int a
    157 // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
    158 // CHECK-NEXT:    8 |   struct C0 (virtual base)
    159 // CHECK-NEXT:    8 |     int a
    160 // CHECK-NEXT:   12 |   struct C1 (virtual base)
    161 // CHECK-NEXT:   12 |     int a
    162 // CHECK-NEXT:   16 |   struct C2 (virtual base)
    163 // CHECK-NEXT:   16 |     int a
    164 // CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
    165 // CHECK-NEXT:      | [sizeof=24, align=8
    166 // CHECK-NEXT:      |  nvsize=8, nvalign=8]
    167 // CHECK-X64: *** Dumping AST Record Layout
    168 // CHECK-X64-NEXT:    0 | struct E
    169 // CHECK-X64-NEXT:    0 |   (E vbtable pointer)
    170 // CHECK-X64-NEXT:    8 |   int a
    171 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
    172 // CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
    173 // CHECK-X64-NEXT:   16 |     int a
    174 // CHECK-X64-NEXT:   20 |   struct C1 (virtual base)
    175 // CHECK-X64-NEXT:   20 |     int a
    176 // CHECK-X64-NEXT:   24 |   struct C2 (virtual base)
    177 // CHECK-X64-NEXT:   24 |     int a
    178 // CHECK-X64-NEXT:   32 |   struct B1 (virtual base) (empty)
    179 // CHECK-X64-NEXT:      | [sizeof=32, align=8
    180 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
    181 
    182 struct F : virtual C0, virtual B0, virtual B1, virtual C1 {
    183 	int a;
    184 	F() : a(0xf000000F) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    185 };
    186 
    187 // CHECK: *** Dumping AST Record Layout
    188 // CHECK-NEXT:    0 | struct F
    189 // CHECK-NEXT:    0 |   (F vbtable pointer)
    190 // CHECK-NEXT:    4 |   int a
    191 // CHECK-NEXT:    8 |   struct C0 (virtual base)
    192 // CHECK-NEXT:    8 |     int a
    193 // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
    194 // CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
    195 // CHECK-NEXT:   24 |   struct C1 (virtual base)
    196 // CHECK-NEXT:   24 |     int a
    197 // CHECK-NEXT:      | [sizeof=32, align=8
    198 // CHECK-NEXT:      |  nvsize=8, nvalign=8]
    199 // CHECK-X64: *** Dumping AST Record Layout
    200 // CHECK-X64-NEXT:    0 | struct F
    201 // CHECK-X64-NEXT:    0 |   (F vbtable pointer)
    202 // CHECK-X64-NEXT:    8 |   int a
    203 // CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
    204 // CHECK-X64-NEXT:   16 |     int a
    205 // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
    206 // CHECK-X64-NEXT:   32 |   struct B1 (virtual base) (empty)
    207 // CHECK-X64-NEXT:   32 |   struct C1 (virtual base)
    208 // CHECK-X64-NEXT:   32 |     int a
    209 // CHECK-X64-NEXT:      | [sizeof=40, align=8
    210 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
    211 
    212 struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {
    213 	int a;
    214 	G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    215 	virtual void f() {}
    216 };
    217 
    218 // CHECK: *** Dumping AST Record Layout
    219 // CHECK: *** Dumping AST Record Layout
    220 // CHECK-NEXT:    0 | struct G
    221 // CHECK-NEXT:    0 |   struct D0 (primary base)
    222 // CHECK-NEXT:    0 |     (D0 vftable pointer)
    223 // CHECK-NEXT:    4 |   (G vbtable pointer)
    224 // CHECK-NEXT:   20 |   int a
    225 // CHECK-NEXT:   32 |   struct C0 (virtual base)
    226 // CHECK-NEXT:   32 |     int a
    227 // CHECK-NEXT:   40 |   struct B0 (virtual base) (empty)
    228 // CHECK-NEXT:   56 |   struct B1 (virtual base) (empty)
    229 // CHECK-NEXT:   56 |   struct C1 (virtual base)
    230 // CHECK-NEXT:   56 |     int a
    231 // CHECK-NEXT:      | [sizeof=64, align=16
    232 // CHECK-NEXT:      |  nvsize=32, nvalign=16]
    233 // CHECK-X64: *** Dumping AST Record Layout
    234 // CHECK-X64: *** Dumping AST Record Layout
    235 // CHECK-X64-NEXT:    0 | struct G
    236 // CHECK-X64-NEXT:    0 |   struct D0 (primary base)
    237 // CHECK-X64-NEXT:    0 |     (D0 vftable pointer)
    238 // CHECK-X64-NEXT:    8 |   (G vbtable pointer)
    239 // CHECK-X64-NEXT:   24 |   int a
    240 // CHECK-X64-NEXT:   32 |   struct C0 (virtual base)
    241 // CHECK-X64-NEXT:   32 |     int a
    242 // CHECK-X64-NEXT:   40 |   struct B0 (virtual base) (empty)
    243 // CHECK-X64-NEXT:   56 |   struct B1 (virtual base) (empty)
    244 // CHECK-X64-NEXT:   56 |   struct C1 (virtual base)
    245 // CHECK-X64-NEXT:   56 |     int a
    246 // CHECK-X64-NEXT:      | [sizeof=64, align=16
    247 // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
    248 
    249 struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {
    250 	int a;
    251 	H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    252 	virtual void f() {}
    253 };
    254 
    255 // CHECK: *** Dumping AST Record Layout
    256 // CHECK-NEXT:    0 | struct H
    257 // CHECK-NEXT:    0 |   (H vbtable pointer)
    258 // CHECK-NEXT:    4 |   int a
    259 // CHECK-NEXT:    8 |   struct C0 (virtual base)
    260 // CHECK-NEXT:    8 |     int a
    261 // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
    262 // CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
    263 // CHECK-NEXT:   44 |   (vtordisp for vbase D0)
    264 // CHECK-NEXT:   48 |   struct D0 (virtual base)
    265 // CHECK-NEXT:   48 |     (D0 vftable pointer)
    266 // CHECK-NEXT:   52 |   struct C1 (virtual base)
    267 // CHECK-NEXT:   52 |     int a
    268 // CHECK-NEXT:      | [sizeof=64, align=16
    269 // CHECK-NEXT:      |  nvsize=8, nvalign=16]
    270 // CHECK-X64: *** Dumping AST Record Layout
    271 // CHECK-X64-NEXT:    0 | struct H
    272 // CHECK-X64-NEXT:    0 |   (H vbtable pointer)
    273 // CHECK-X64-NEXT:    8 |   int a
    274 // CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
    275 // CHECK-X64-NEXT:   16 |     int a
    276 // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
    277 // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
    278 // CHECK-X64-NEXT:   60 |   (vtordisp for vbase D0)
    279 // CHECK-X64-NEXT:   64 |   struct D0 (virtual base)
    280 // CHECK-X64-NEXT:   64 |     (D0 vftable pointer)
    281 // CHECK-X64-NEXT:   72 |   struct C1 (virtual base)
    282 // CHECK-X64-NEXT:   72 |     int a
    283 // CHECK-X64-NEXT:      | [sizeof=80, align=16
    284 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
    285 
    286 struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
    287 	__declspec(align(32)) int a;
    288 	I() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    289 };
    290 
    291 // CHECK: *** Dumping AST Record Layout
    292 // CHECK-NEXT:    0 | struct I
    293 // CHECK-NEXT:    0 |   (I vbtable pointer)
    294 // CHECK-NEXT:   32 |   int a
    295 // CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
    296 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
    297 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
    298 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
    299 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
    300 // CHECK-NEXT:      | [sizeof=192, align=32
    301 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
    302 // CHECK-X64: *** Dumping AST Record Layout
    303 // CHECK-X64-NEXT:    0 | struct I
    304 // CHECK-X64-NEXT:    0 |   (I vbtable pointer)
    305 // CHECK-X64-NEXT:   32 |   int a
    306 // CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
    307 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
    308 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
    309 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
    310 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
    311 // CHECK-X64-NEXT:      | [sizeof=192, align=32
    312 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
    313 
    314 struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
    315 	int a;
    316 	J() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    317 };
    318 
    319 // CHECK: *** Dumping AST Record Layout
    320 // CHECK-NEXT:    0 | struct J
    321 // CHECK-NEXT:    0 |   (J vbtable pointer)
    322 // CHECK-NEXT:    4 |   int a
    323 // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
    324 // CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
    325 // CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
    326 // CHECK-NEXT:  104 |   struct B3 (virtual base) (empty)
    327 // CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
    328 // CHECK-NEXT:      | [sizeof=160, align=32
    329 // CHECK-NEXT:      |  nvsize=8, nvalign=32]
    330 // CHECK-X64: *** Dumping AST Record Layout
    331 // CHECK-X64-NEXT:    0 | struct J
    332 // CHECK-X64-NEXT:    0 |   (J vbtable pointer)
    333 // CHECK-X64-NEXT:    8 |   int a
    334 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
    335 // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
    336 // CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
    337 // CHECK-X64-NEXT:  104 |   struct B3 (virtual base) (empty)
    338 // CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
    339 // CHECK-X64-NEXT:      | [sizeof=160, align=32
    340 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
    341 
    342 struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {
    343 	__declspec(align(32)) int a;
    344 	K() : a(0xf0000013) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    345 };
    346 
    347 // CHECK: *** Dumping AST Record Layout
    348 // CHECK: *** Dumping AST Record Layout
    349 // CHECK-NEXT:    0 | struct K
    350 // CHECK-NEXT:    0 |   (K vbtable pointer)
    351 // CHECK-NEXT:   32 |   int a
    352 // CHECK-NEXT:   64 |   struct D1 (virtual base) (empty)
    353 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
    354 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
    355 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
    356 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
    357 // CHECK-NEXT:      | [sizeof=192, align=32
    358 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
    359 // CHECK-X64: *** Dumping AST Record Layout
    360 // CHECK-X64: *** Dumping AST Record Layout
    361 // CHECK-X64-NEXT:    0 | struct K
    362 // CHECK-X64-NEXT:    0 |   (K vbtable pointer)
    363 // CHECK-X64-NEXT:   32 |   int a
    364 // CHECK-X64-NEXT:   64 |   struct D1 (virtual base) (empty)
    365 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
    366 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
    367 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
    368 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
    369 // CHECK-X64-NEXT:      | [sizeof=192, align=32
    370 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
    371 
    372 struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
    373 	__declspec(align(32)) int a;
    374 	L() : a(0xf0000014) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    375 };
    376 
    377 // CHECK: *** Dumping AST Record Layout
    378 // CHECK-NEXT:    0 | struct L
    379 // CHECK-NEXT:    0 |   (L vbtable pointer)
    380 // CHECK-NEXT:   32 |   int a
    381 // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
    382 // CHECK-NEXT:   68 |   struct D1 (virtual base) (empty)
    383 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
    384 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
    385 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
    386 // CHECK-NEXT:      | [sizeof=192, align=32
    387 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
    388 // CHECK-X64: *** Dumping AST Record Layout
    389 // CHECK-X64-NEXT:    0 | struct L
    390 // CHECK-X64-NEXT:    0 |   (L vbtable pointer)
    391 // CHECK-X64-NEXT:   32 |   int a
    392 // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
    393 // CHECK-X64-NEXT:   68 |   struct D1 (virtual base) (empty)
    394 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
    395 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
    396 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
    397 // CHECK-X64-NEXT:      | [sizeof=192, align=32
    398 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
    399 
    400 struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
    401 	__declspec(align(32)) int a;
    402 	M() : a(0xf0000015) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    403 };
    404 
    405 // CHECK: *** Dumping AST Record Layout
    406 // CHECK-NEXT:    0 | struct M
    407 // CHECK-NEXT:    0 |   (M vbtable pointer)
    408 // CHECK-NEXT:   32 |   int a
    409 // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
    410 // CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
    411 // CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
    412 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
    413 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
    414 // CHECK-NEXT:      | [sizeof=192, align=32
    415 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
    416 // CHECK-X64: *** Dumping AST Record Layout
    417 // CHECK-X64-NEXT:    0 | struct M
    418 // CHECK-X64-NEXT:    0 |   (M vbtable pointer)
    419 // CHECK-X64-NEXT:   32 |   int a
    420 // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
    421 // CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
    422 // CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
    423 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
    424 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
    425 // CHECK-X64-NEXT:      | [sizeof=192, align=32
    426 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
    427 
    428 struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
    429 	__declspec(align(32)) int a;
    430 	N() : a(0xf0000016) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    431 };
    432 
    433 // CHECK: *** Dumping AST Record Layout
    434 // CHECK-NEXT:    0 | struct N
    435 // CHECK-NEXT:    0 |   (N vbtable pointer)
    436 // CHECK-NEXT:   32 |   int a
    437 // CHECK-NEXT:   64 |   struct C0 (virtual base)
    438 // CHECK-NEXT:   64 |     int a
    439 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
    440 // CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
    441 // CHECK-NEXT:  136 |   struct B2 (virtual base) (empty)
    442 // CHECK-NEXT:  168 |   struct B3 (virtual base) (empty)
    443 // CHECK-NEXT:  200 |   struct B4 (virtual base) (empty)
    444 // CHECK-NEXT:      | [sizeof=224, align=32
    445 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
    446 // CHECK-X64: *** Dumping AST Record Layout
    447 // CHECK-X64-NEXT:    0 | struct N
    448 // CHECK-X64-NEXT:    0 |   (N vbtable pointer)
    449 // CHECK-X64-NEXT:   32 |   int a
    450 // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
    451 // CHECK-X64-NEXT:   64 |     int a
    452 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
    453 // CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
    454 // CHECK-X64-NEXT:  136 |   struct B2 (virtual base) (empty)
    455 // CHECK-X64-NEXT:  168 |   struct B3 (virtual base) (empty)
    456 // CHECK-X64-NEXT:  200 |   struct B4 (virtual base) (empty)
    457 // CHECK-X64-NEXT:      | [sizeof=224, align=32
    458 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
    459 
    460 struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
    461 	__declspec(align(32)) int a;
    462 	O() : a(0xf0000017) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    463 };
    464 
    465 // CHECK: *** Dumping AST Record Layout
    466 // CHECK-NEXT:    0 | struct O
    467 // CHECK-NEXT:    0 |   (O vbtable pointer)
    468 // CHECK-NEXT:   32 |   int a
    469 // CHECK-NEXT:   64 |   struct C0 (virtual base)
    470 // CHECK-NEXT:   64 |     int a
    471 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
    472 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
    473 // CHECK-NEXT:  132 |   struct D1 (virtual base) (empty)
    474 // CHECK-NEXT:  168 |   struct B3 (virtual base) (empty)
    475 // CHECK-NEXT:  200 |   struct B4 (virtual base) (empty)
    476 // CHECK-NEXT:      | [sizeof=224, align=32
    477 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
    478 // CHECK-X64: *** Dumping AST Record Layout
    479 // CHECK-X64-NEXT:    0 | struct O
    480 // CHECK-X64-NEXT:    0 |   (O vbtable pointer)
    481 // CHECK-X64-NEXT:   32 |   int a
    482 // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
    483 // CHECK-X64-NEXT:   64 |     int a
    484 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
    485 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
    486 // CHECK-X64-NEXT:  132 |   struct D1 (virtual base) (empty)
    487 // CHECK-X64-NEXT:  168 |   struct B3 (virtual base) (empty)
    488 // CHECK-X64-NEXT:  200 |   struct B4 (virtual base) (empty)
    489 // CHECK-X64-NEXT:      | [sizeof=224, align=32
    490 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
    491 
    492 struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 {
    493 	__declspec(align(32)) int a;
    494 	P() : a(0xf0000018) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    495 };
    496 
    497 // CHECK: *** Dumping AST Record Layout
    498 // CHECK-NEXT:    0 | struct P
    499 // CHECK-NEXT:    0 |   (P vbtable pointer)
    500 // CHECK-NEXT:   32 |   int a
    501 // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
    502 // CHECK-NEXT:   64 |   struct C0 (virtual base)
    503 // CHECK-NEXT:   64 |     int a
    504 // CHECK-NEXT:   68 |   struct D1 (virtual base) (empty)
    505 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
    506 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
    507 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
    508 // CHECK-NEXT:      | [sizeof=192, align=32
    509 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
    510 // CHECK-X64: *** Dumping AST Record Layout
    511 // CHECK-X64-NEXT:    0 | struct P
    512 // CHECK-X64-NEXT:    0 |   (P vbtable pointer)
    513 // CHECK-X64-NEXT:   32 |   int a
    514 // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
    515 // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
    516 // CHECK-X64-NEXT:   64 |     int a
    517 // CHECK-X64-NEXT:   68 |   struct D1 (virtual base) (empty)
    518 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
    519 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
    520 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
    521 // CHECK-X64-NEXT:      | [sizeof=192, align=32
    522 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
    523 
    524 struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 {
    525 	__declspec(align(32)) int a;
    526 	Q() : a(0xf0000019) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    527 };
    528 
    529 // CHECK: *** Dumping AST Record Layout
    530 // CHECK-NEXT:    0 | struct Q
    531 // CHECK-NEXT:    0 |   (Q vbtable pointer)
    532 // CHECK-NEXT:   32 |   int a
    533 // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
    534 // CHECK-NEXT:   64 |   struct C0 (virtual base)
    535 // CHECK-NEXT:   64 |     int a
    536 // CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
    537 // CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
    538 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
    539 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
    540 // CHECK-NEXT:      | [sizeof=192, align=32
    541 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
    542 // CHECK-X64: *** Dumping AST Record Layout
    543 // CHECK-X64-NEXT:    0 | struct Q
    544 // CHECK-X64-NEXT:    0 |   (Q vbtable pointer)
    545 // CHECK-X64-NEXT:   32 |   int a
    546 // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
    547 // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
    548 // CHECK-X64-NEXT:   64 |     int a
    549 // CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
    550 // CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
    551 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
    552 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
    553 // CHECK-X64-NEXT:      | [sizeof=192, align=32
    554 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
    555 
    556 struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 {
    557 	__declspec(align(32)) int a;
    558 	R() : a(0xf0000020) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    559 };
    560 
    561 // CHECK: *** Dumping AST Record Layout
    562 // CHECK-NEXT:    0 | struct R
    563 // CHECK-NEXT:    0 |   (R vbtable pointer)
    564 // CHECK-NEXT:   32 |   int a
    565 // CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
    566 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
    567 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
    568 // CHECK-NEXT:  104 |   struct C0 (virtual base)
    569 // CHECK-NEXT:  104 |     int a
    570 // CHECK-NEXT:  112 |   struct B3 (virtual base) (empty)
    571 // CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
    572 // CHECK-NEXT:      | [sizeof=160, align=32
    573 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
    574 // CHECK-X64: *** Dumping AST Record Layout
    575 // CHECK-X64-NEXT:    0 | struct R
    576 // CHECK-X64-NEXT:    0 |   (R vbtable pointer)
    577 // CHECK-X64-NEXT:   32 |   int a
    578 // CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
    579 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
    580 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
    581 // CHECK-X64-NEXT:  104 |   struct C0 (virtual base)
    582 // CHECK-X64-NEXT:  104 |     int a
    583 // CHECK-X64-NEXT:  112 |   struct B3 (virtual base) (empty)
    584 // CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
    585 // CHECK-X64-NEXT:      | [sizeof=160, align=32
    586 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
    587 
    588 struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 {
    589 	__declspec(align(32)) int a;
    590 	S() : a(0xf0000021) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    591 };
    592 
    593 // CHECK: *** Dumping AST Record Layout
    594 // CHECK-NEXT:    0 | struct S
    595 // CHECK-NEXT:    0 |   (S vbtable pointer)
    596 // CHECK-NEXT:   32 |   int a
    597 // CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
    598 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
    599 // CHECK-NEXT:   72 |   struct C0 (virtual base)
    600 // CHECK-NEXT:   72 |     int a
    601 // CHECK-NEXT:   80 |   struct B2 (virtual base) (empty)
    602 // CHECK-NEXT:  104 |   struct B3 (virtual base) (empty)
    603 // CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
    604 // CHECK-NEXT:      | [sizeof=160, align=32
    605 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
    606 // CHECK-X64: *** Dumping AST Record Layout
    607 // CHECK-X64-NEXT:    0 | struct S
    608 // CHECK-X64-NEXT:    0 |   (S vbtable pointer)
    609 // CHECK-X64-NEXT:   32 |   int a
    610 // CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
    611 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
    612 // CHECK-X64-NEXT:   72 |   struct C0 (virtual base)
    613 // CHECK-X64-NEXT:   72 |     int a
    614 // CHECK-X64-NEXT:   80 |   struct B2 (virtual base) (empty)
    615 // CHECK-X64-NEXT:  104 |   struct B3 (virtual base) (empty)
    616 // CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
    617 // CHECK-X64-NEXT:      | [sizeof=160, align=32
    618 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
    619 
    620 struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 {
    621 	__declspec(align(16)) int a;
    622 	T() : a(0xf0000022) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    623 };
    624 
    625 // CHECK: *** Dumping AST Record Layout
    626 // CHECK: *** Dumping AST Record Layout
    627 // CHECK-NEXT:    0 | struct T
    628 // CHECK-NEXT:    0 |   (T vbtable pointer)
    629 // CHECK-NEXT:   16 |   int a
    630 // CHECK-NEXT:   32 |   struct B0 (virtual base) (empty)
    631 // CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
    632 // CHECK-NEXT:   40 |   struct C0 (virtual base)
    633 // CHECK-NEXT:   40 |     int a
    634 // CHECK-NEXT:   44 |   struct D2 (virtual base)
    635 // CHECK-NEXT:   44 |     int [8] a
    636 // CHECK-NEXT:   80 |   struct B2 (virtual base) (empty)
    637 // CHECK-NEXT:   88 |   struct B3 (virtual base) (empty)
    638 // CHECK-NEXT:  104 |   struct B4 (virtual base) (empty)
    639 // CHECK-NEXT:      | [sizeof=112, align=16
    640 // CHECK-NEXT:      |  nvsize=32, nvalign=16]
    641 // CHECK-X64: *** Dumping AST Record Layout
    642 // CHECK-X64: *** Dumping AST Record Layout
    643 // CHECK-X64-NEXT:    0 | struct T
    644 // CHECK-X64-NEXT:    0 |   (T vbtable pointer)
    645 // CHECK-X64-NEXT:   16 |   int a
    646 // CHECK-X64-NEXT:   32 |   struct B0 (virtual base) (empty)
    647 // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
    648 // CHECK-X64-NEXT:   40 |   struct C0 (virtual base)
    649 // CHECK-X64-NEXT:   40 |     int a
    650 // CHECK-X64-NEXT:   44 |   struct D2 (virtual base)
    651 // CHECK-X64-NEXT:   44 |     int [8] a
    652 // CHECK-X64-NEXT:   80 |   struct B2 (virtual base) (empty)
    653 // CHECK-X64-NEXT:   88 |   struct B3 (virtual base) (empty)
    654 // CHECK-X64-NEXT:  104 |   struct B4 (virtual base) (empty)
    655 // CHECK-X64-NEXT:      | [sizeof=112, align=16
    656 // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
    657 
    658 struct __declspec(align(32)) U : virtual B0, virtual B1 {
    659 	int a;
    660 	U() : a(0xf0000023) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    661 };
    662 
    663 // CHECK: *** Dumping AST Record Layout
    664 // CHECK-NEXT:    0 | struct U
    665 // CHECK-NEXT:    0 |   (U vbtable pointer)
    666 // CHECK-NEXT:    4 |   int a
    667 // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
    668 // CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
    669 // CHECK-NEXT:      | [sizeof=64, align=32
    670 // CHECK-NEXT:      |  nvsize=8, nvalign=32]
    671 // CHECK-X64: *** Dumping AST Record Layout
    672 // CHECK-X64-NEXT:    0 | struct U
    673 // CHECK-X64-NEXT:    0 |   (U vbtable pointer)
    674 // CHECK-X64-NEXT:    8 |   int a
    675 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
    676 // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
    677 // CHECK-X64-NEXT:      | [sizeof=64, align=32
    678 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
    679 
    680 struct __declspec(align(32)) V : virtual D1 {
    681 	int a;
    682 	V() : a(0xf0000024) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
    683 };
    684 
    685 // CHECK: *** Dumping AST Record Layout
    686 // CHECK-NEXT:    0 | struct V
    687 // CHECK-NEXT:    0 |   (V vbtable pointer)
    688 // CHECK-NEXT:    4 |   int a
    689 // CHECK-NEXT:    8 |   struct D1 (virtual base) (empty)
    690 // CHECK-NEXT:      | [sizeof=32, align=32
    691 // CHECK-NEXT:      |  nvsize=8, nvalign=32]
    692 // CHECK-X64: *** Dumping AST Record Layout
    693 // CHECK-X64-NEXT:    0 | struct V
    694 // CHECK-X64-NEXT:    0 |   (V vbtable pointer)
    695 // CHECK-X64-NEXT:    8 |   int a
    696 // CHECK-X64-NEXT:   16 |   struct D1 (virtual base) (empty)
    697 // CHECK-X64-NEXT:      | [sizeof=32, align=32
    698 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
    699 
    700 struct T0 {};
    701 struct T1 : T0 { char a; };
    702 struct T3 : virtual T1, virtual T0 { long long a; };
    703 
    704 // CHECK: *** Dumping AST Record Layout
    705 // CHECK: *** Dumping AST Record Layout
    706 // CHECK: *** Dumping AST Record Layout
    707 // CHECK-NEXT:    0 | struct T3
    708 // CHECK-NEXT:    0 |   (T3 vbtable pointer)
    709 // CHECK-NEXT:    8 |   long long a
    710 // CHECK-NEXT:   16 |   struct T1 (virtual base)
    711 // CHECK-NEXT:   16 |     struct T0 (base) (empty)
    712 // CHECK-NEXT:   16 |     char a
    713 // CHECK-NEXT:   24 |   struct T0 (virtual base) (empty)
    714 // CHECK-NEXT:      | [sizeof=24, align=8
    715 // CHECK-NEXT:      |  nvsize=16, nvalign=8]
    716 // CHECK-X64: *** Dumping AST Record Layout
    717 // CHECK-X64: *** Dumping AST Record Layout
    718 // CHECK-X64: *** Dumping AST Record Layout
    719 // CHECK-X64-NEXT:    0 | struct T3
    720 // CHECK-X64-NEXT:    0 |   (T3 vbtable pointer)
    721 // CHECK-X64-NEXT:    8 |   long long a
    722 // CHECK-X64-NEXT:   16 |   struct T1 (virtual base)
    723 // CHECK-X64-NEXT:   16 |     struct T0 (base) (empty)
    724 // CHECK-X64-NEXT:   16 |     char a
    725 // CHECK-X64-NEXT:   24 |   struct T0 (virtual base) (empty)
    726 // CHECK-X64-NEXT:      | [sizeof=24, align=8
    727 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
    728 
    729 struct Q0A {};
    730 struct Q0B { char Q0BField; };
    731 struct Q0C : virtual Q0A, virtual Q0B { char Q0CField; };
    732 struct Q0D : Q0C, Q0A {};
    733 
    734 // CHECK: *** Dumping AST Record Layout
    735 // CHECK: *** Dumping AST Record Layout
    736 // CHECK: *** Dumping AST Record Layout
    737 // CHECK: *** Dumping AST Record Layout
    738 // CHECK-NEXT:    0 | struct Q0D
    739 // CHECK-NEXT:    0 |   struct Q0C (base)
    740 // CHECK-NEXT:    0 |     (Q0C vbtable pointer)
    741 // CHECK-NEXT:    4 |     char Q0CField
    742 // CHECK-NEXT:    8 |   struct Q0A (base) (empty)
    743 // CHECK-NEXT:    8 |   struct Q0A (virtual base) (empty)
    744 // CHECK-NEXT:    8 |   struct Q0B (virtual base)
    745 // CHECK-NEXT:    8 |     char Q0BField
    746 // CHECK-NEXT:      | [sizeof=9, align=4
    747 // CHECK-NEXT:      |  nvsize=8, nvalign=4]
    748 // CHECK-X64: *** Dumping AST Record Layout
    749 // CHECK-X64: *** Dumping AST Record Layout
    750 // CHECK-X64: *** Dumping AST Record Layout
    751 // CHECK-X64: *** Dumping AST Record Layout
    752 // CHECK-X64-NEXT:    0 | struct Q0D
    753 // CHECK-X64-NEXT:    0 |   struct Q0C (base)
    754 // CHECK-X64-NEXT:    0 |     (Q0C vbtable pointer)
    755 // CHECK-X64-NEXT:    8 |     char Q0CField
    756 // CHECK-X64-NEXT:   16 |   struct Q0A (base) (empty)
    757 // CHECK-X64-NEXT:   16 |   struct Q0A (virtual base) (empty)
    758 // CHECK-X64-NEXT:   16 |   struct Q0B (virtual base)
    759 // CHECK-X64-NEXT:   16 |     char Q0BField
    760 // CHECK-X64-NEXT:      | [sizeof=24, align=8
    761 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
    762 
    763 int a[
    764 sizeof(A)+
    765 sizeof(B)+
    766 sizeof(C)+
    767 sizeof(D)+
    768 sizeof(E)+
    769 sizeof(F)+
    770 sizeof(G)+
    771 sizeof(H)+
    772 sizeof(I)+
    773 sizeof(J)+
    774 sizeof(K)+
    775 sizeof(L)+
    776 sizeof(M)+
    777 sizeof(N)+
    778 sizeof(O)+
    779 sizeof(P)+
    780 sizeof(Q)+
    781 sizeof(R)+
    782 sizeof(S)+
    783 sizeof(T)+
    784 sizeof(U)+
    785 sizeof(V)+
    786 sizeof(T3)+
    787 sizeof(Q0D)];
    788