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>&1 \
      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 char buffer[419430400];
      8 
      9 struct A {
     10 	char a;
     11 	A() {
     12 		printf("A   = %d\n", (int)((char*)this - buffer));
     13 		printf("A.a = %d\n", (int)((char*)&a - buffer));
     14 	}
     15 };
     16 
     17 struct B {
     18 	__declspec(align(4)) long long a;
     19 	B() {
     20 		printf("B   = %d\n", (int)((char*)this - buffer));
     21 		printf("B.a = %d\n", (int)((char*)&a - buffer));
     22 	}
     23 };
     24 
     25 #pragma pack(push, 2)
     26 struct X {
     27 	B a;
     28 	char b;
     29 	int c;
     30 	X() {
     31 		printf("X   = %d\n", (int)((char*)this - buffer));
     32 		printf("X.a = %d\n", (int)((char*)&a - buffer));
     33 		printf("X.b = %d\n", (int)((char*)&b - buffer));
     34 		printf("X.c = %d\n", (int)((char*)&c - buffer));
     35 	}
     36 };
     37 
     38 // CHECK: *** Dumping AST Record Layout
     39 // CHECK: *** Dumping AST Record Layout
     40 // CHECK-NEXT:    0 | struct X
     41 // CHECK-NEXT:    0 |   struct B a
     42 // CHECK-NEXT:    0 |     long long a
     43 // CHECK-NEXT:      |   [sizeof=8, align=8
     44 // CHECK-NEXT:      |    nvsize=8, nvalign=8]
     45 // CHECK-NEXT:    8 |   char b
     46 // CHECK-NEXT:   10 |   int c
     47 // CHECK-NEXT:      | [sizeof=16, align=4
     48 // CHECK-NEXT:      |  nvsize=14, nvalign=4]
     49 // CHECK-X64: *** Dumping AST Record Layout
     50 // CHECK-X64: *** Dumping AST Record Layout
     51 // CHECK-X64-NEXT:    0 | struct X
     52 // CHECK-X64-NEXT:    0 |   struct B a
     53 // CHECK-X64-NEXT:    0 |     long long a
     54 // CHECK-X64-NEXT:      |   [sizeof=8, align=8
     55 // CHECK-X64-NEXT:      |    nvsize=8, nvalign=8]
     56 // CHECK-X64-NEXT:    8 |   char b
     57 // CHECK-X64-NEXT:   10 |   int c
     58 // CHECK-X64-NEXT:      | [sizeof=16, align=4
     59 // CHECK-X64-NEXT:      |  nvsize=14, nvalign=4]
     60 
     61 struct Y : A, B {
     62 	char a;
     63 	int b;
     64 	Y() {
     65 		printf("Y   = %d\n", (int)((char*)this - buffer));
     66 		printf("Y.a = %d\n", (int)((char*)&a - buffer));
     67 		printf("Y.b = %d\n", (int)((char*)&b - buffer));
     68 	}
     69 };
     70 
     71 // CHECK: *** Dumping AST Record Layout
     72 // CHECK: *** Dumping AST Record Layout
     73 // CHECK-NEXT:    0 | struct Y
     74 // CHECK-NEXT:    0 |   struct A (base)
     75 // CHECK-NEXT:    0 |     char a
     76 // CHECK-NEXT:    4 |   struct B (base)
     77 // CHECK-NEXT:    4 |     long long a
     78 // CHECK-NEXT:   12 |   char a
     79 // CHECK-NEXT:   14 |   int b
     80 // CHECK-NEXT:      | [sizeof=20, align=4
     81 // CHECK-NEXT:      |  nvsize=18, nvalign=4]
     82 // CHECK-X64: *** Dumping AST Record Layout
     83 // CHECK-X64: *** Dumping AST Record Layout
     84 // CHECK-X64-NEXT:    0 | struct Y
     85 // CHECK-X64-NEXT:    0 |   struct A (base)
     86 // CHECK-X64-NEXT:    0 |     char a
     87 // CHECK-X64-NEXT:    4 |   struct B (base)
     88 // CHECK-X64-NEXT:    4 |     long long a
     89 // CHECK-X64-NEXT:   12 |   char a
     90 // CHECK-X64-NEXT:   14 |   int b
     91 // CHECK-X64-NEXT:      | [sizeof=20, align=4
     92 // CHECK-X64-NEXT:      |  nvsize=18, nvalign=4]
     93 
     94 struct Z : virtual B {
     95 	char a;
     96 	int b;
     97 	Z() {
     98 		printf("Z   = %d\n", (int)((char*)this - buffer));
     99 		printf("Z.a = %d\n", (int)((char*)&a - buffer));
    100 		printf("Z.b = %d\n", (int)((char*)&b - buffer));
    101 	}
    102 };
    103 
    104 // CHECK: *** Dumping AST Record Layout
    105 // CHECK-NEXT:    0 | struct Z
    106 // CHECK-NEXT:    0 |   (Z vbtable pointer)
    107 // CHECK-NEXT:    4 |   char a
    108 // CHECK-NEXT:    6 |   int b
    109 // CHECK-NEXT:   12 |   struct B (virtual base)
    110 // CHECK-NEXT:   12 |     long long a
    111 // CHECK-NEXT:      | [sizeof=20, align=4
    112 // CHECK-NEXT:      |  nvsize=10, nvalign=4]
    113 // CHECK-X64: *** Dumping AST Record Layout
    114 // CHECK-X64-NEXT:    0 | struct Z
    115 // CHECK-X64-NEXT:    0 |   (Z vbtable pointer)
    116 // CHECK-X64-NEXT:    8 |   char a
    117 // CHECK-X64-NEXT:   10 |   int b
    118 // CHECK-X64-NEXT:   16 |   struct B (virtual base)
    119 // CHECK-X64-NEXT:   16 |     long long a
    120 // CHECK-X64-NEXT:      | [sizeof=24, align=4
    121 // CHECK-X64-NEXT:      |  nvsize=14, nvalign=4]
    122 
    123 #pragma pack(pop)
    124 
    125 struct A1 { long long a; };
    126 #pragma pack(push, 1)
    127 struct B1 : virtual A1 { char a; };
    128 #pragma pack(pop)
    129 struct C1 : B1 {};
    130 
    131 // CHECK: *** Dumping AST Record Layout
    132 // CHECK: *** Dumping AST Record Layout
    133 // CHECK: *** Dumping AST Record Layout
    134 // CHECK-NEXT:    0 | struct C1
    135 // CHECK-NEXT:    0 |   struct B1 (base)
    136 // CHECK-NEXT:    0 |     (B1 vbtable pointer)
    137 // CHECK-NEXT:    4 |     char a
    138 // CHECK-NEXT:    8 |   struct A1 (virtual base)
    139 // CHECK-NEXT:    8 |     long long a
    140 // CHECK-NEXT:      | [sizeof=16, align=8
    141 // CHECK-NEXT:      |  nvsize=5, nvalign=8]
    142 // CHECK-X64: *** Dumping AST Record Layout
    143 // CHECK-X64: *** Dumping AST Record Layout
    144 // CHECK-X64: *** Dumping AST Record Layout
    145 // CHECK-X64-NEXT:    0 | struct C1
    146 // CHECK-X64-NEXT:    0 |   struct B1 (base)
    147 // CHECK-X64-NEXT:    0 |     (B1 vbtable pointer)
    148 // CHECK-X64-NEXT:    8 |     char a
    149 // CHECK-X64-NEXT:   16 |   struct A1 (virtual base)
    150 // CHECK-X64-NEXT:   16 |     long long a
    151 // CHECK-X64-NEXT:      | [sizeof=24, align=8
    152 // CHECK-X64-NEXT:      |  nvsize=9, nvalign=8]
    153 
    154 struct CA0 {
    155 	CA0() {}
    156 };
    157 struct CA1 : virtual CA0 {
    158 	CA1() {}
    159 };
    160 #pragma pack(push, 1)
    161 struct CA2 : public CA1, public CA0 {
    162 	virtual void CA2Method() {}
    163 	CA2() {}
    164 };
    165 #pragma pack(pop)
    166 
    167 // CHECK: *** Dumping AST Record Layout
    168 // CHECK: *** Dumping AST Record Layout
    169 // CHECK: *** Dumping AST Record Layout
    170 // CHECK-NEXT:    0 | struct CA2
    171 // CHECK-NEXT:    0 |   (CA2 vftable pointer)
    172 // CHECK-NEXT:    4 |   struct CA1 (base)
    173 // CHECK-NEXT:    4 |     (CA1 vbtable pointer)
    174 // CHECK-NEXT:    9 |   struct CA0 (base) (empty)
    175 // CHECK-NEXT:    9 |   struct CA0 (virtual base) (empty)
    176 // CHECK-NEXT:      | [sizeof=9, align=1
    177 // CHECK-NEXT:      |  nvsize=9, nvalign=1]
    178 // CHECK-X64: *** Dumping AST Record Layout
    179 // CHECK-X64: *** Dumping AST Record Layout
    180 // CHECK-X64: *** Dumping AST Record Layout
    181 // CHECK-X64-NEXT:    0 | struct CA2
    182 // CHECK-X64-NEXT:    0 |   (CA2 vftable pointer)
    183 // CHECK-X64-NEXT:    8 |   struct CA1 (base)
    184 // CHECK-X64-NEXT:    8 |     (CA1 vbtable pointer)
    185 // CHECK-X64-NEXT:   17 |   struct CA0 (base) (empty)
    186 // CHECK-X64-NEXT:   17 |   struct CA0 (virtual base) (empty)
    187 // CHECK-X64-NEXT:      | [sizeof=17, align=1
    188 // CHECK-X64-NEXT:      |  nvsize=17, nvalign=1]
    189 
    190 #pragma pack(16)
    191 struct YA {
    192 	__declspec(align(32)) char : 1;
    193 };
    194 // CHECK: *** Dumping AST Record Layout
    195 // CHECK-NEXT:    0 | struct YA (empty)
    196 // CHECK-NEXT:    0 |   char
    197 // CHECK-NEXT:      | [sizeof=32, align=32
    198 // CHECK-NEXT:      |  nvsize=32, nvalign=32]
    199 // CHECK-X64: *** Dumping AST Record Layout
    200 // CHECK-X64-NEXT:    0 | struct YA (empty)
    201 // CHECK-X64-NEXT:    0 |   char
    202 // CHECK-X64-NEXT:      | [sizeof=32, align=32
    203 // CHECK-X64-NEXT:      |  nvsize=32, nvalign=32]
    204 
    205 #pragma pack(1)
    206 struct YB {
    207 	char a;
    208 	YA b;
    209 };
    210 // CHECK: *** Dumping AST Record Layout
    211 // CHECK-NEXT:    0 | struct YB
    212 // CHECK-NEXT:    0 |   char a
    213 // CHECK-NEXT:    1 |   struct YA b (empty)
    214 // CHECK-NEXT:    1 |     char
    215 // CHECK-NEXT:      |   [sizeof=32, align=32
    216 // CHECK-NEXT:      |    nvsize=32, nvalign=32]
    217 // CHECK-NEXT:      | [sizeof=33, align=1
    218 // CHECK-NEXT:      |  nvsize=33, nvalign=1]
    219 // CHECK-X64: *** Dumping AST Record Layout
    220 // CHECK-X64-NEXT:    0 | struct YB
    221 // CHECK-X64-NEXT:    0 |   char a
    222 // CHECK-X64-NEXT:    1 |   struct YA b (empty)
    223 // CHECK-X64-NEXT:    1 |     char
    224 // CHECK-X64-NEXT:      |   [sizeof=32, align=32
    225 // CHECK-X64-NEXT:      |    nvsize=32, nvalign=32]
    226 // CHECK-X64-NEXT:      | [sizeof=33, align=1
    227 // CHECK-X64-NEXT:      |  nvsize=33, nvalign=1]
    228 
    229 #pragma pack(8)
    230 struct YC {
    231 	__declspec(align(32)) char : 1;
    232 };
    233 // CHECK: *** Dumping AST Record Layout
    234 // CHECK-NEXT:    0 | struct YC (empty)
    235 // CHECK-NEXT:    0 |   char
    236 // CHECK-NEXT:      | [sizeof=32, align=32
    237 // CHECK-NEXT:      |  nvsize=32, nvalign=32]
    238 // CHECK-X64: *** Dumping AST Record Layout
    239 // CHECK-X64-NEXT:    0 | struct YC (empty)
    240 // CHECK-X64-NEXT:    0 |   char
    241 // CHECK-X64-NEXT:      | [sizeof=8, align=32
    242 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=32]
    243 
    244 #pragma pack(1)
    245 struct YD {
    246 	char a;
    247 	YC b;
    248 };
    249 // CHECK: *** Dumping AST Record Layout
    250 // CHECK-NEXT:    0 | struct YD
    251 // CHECK-NEXT:    0 |   char a
    252 // CHECK-NEXT:    1 |   struct YC b (empty)
    253 // CHECK-NEXT:    1 |     char
    254 // CHECK-NEXT:      |   [sizeof=32, align=32
    255 // CHECK-NEXT:      |    nvsize=32, nvalign=32]
    256 // CHECK-NEXT:      | [sizeof=33, align=1
    257 // CHECK-NEXT:      |  nvsize=33, nvalign=1]
    258 // CHECK-X64: *** Dumping AST Record Layout
    259 // CHECK-X64-NEXT:    0 | struct YD
    260 // CHECK-X64-NEXT:    0 |   char a
    261 // CHECK-X64-NEXT:    1 |   struct YC b (empty)
    262 // CHECK-X64-NEXT:    1 |     char
    263 // CHECK-X64-NEXT:      |   [sizeof=8, align=32
    264 // CHECK-X64-NEXT:      |    nvsize=8, nvalign=32]
    265 // CHECK-X64-NEXT:      | [sizeof=9, align=1
    266 // CHECK-X64-NEXT:      |  nvsize=9, nvalign=1]
    267 
    268 #pragma pack(4)
    269 struct YE {
    270 	__declspec(align(32)) char : 1;
    271 };
    272 // CHECK: *** Dumping AST Record Layout
    273 // CHECK-NEXT:    0 | struct YE (empty)
    274 // CHECK-NEXT:    0 |   char
    275 // CHECK-NEXT:      | [sizeof=4, align=32
    276 // CHECK-NEXT:      |  nvsize=4, nvalign=32]
    277 // CHECK-X64: *** Dumping AST Record Layout
    278 // CHECK-X64-NEXT:    0 | struct YE (empty)
    279 // CHECK-X64-NEXT:    0 |   char
    280 // CHECK-X64-NEXT:      | [sizeof=4, align=32
    281 // CHECK-X64-NEXT:      |  nvsize=4, nvalign=32]
    282 
    283 #pragma pack(1)
    284 struct YF {
    285 	char a;
    286 	YE b;
    287 };
    288 // CHECK: *** Dumping AST Record Layout
    289 // CHECK-NEXT:    0 | struct YF
    290 // CHECK-NEXT:    0 |   char a
    291 // CHECK-NEXT:    1 |   struct YE b (empty)
    292 // CHECK-NEXT:    1 |     char
    293 // CHECK-NEXT:      |   [sizeof=4, align=32
    294 // CHECK-NEXT:      |    nvsize=4, nvalign=32]
    295 // CHECK-NEXT:      | [sizeof=5, align=1
    296 // CHECK-NEXT:      |  nvsize=5, nvalign=1]
    297 // CHECK-X64: *** Dumping AST Record Layout
    298 // CHECK-X64-NEXT:    0 | struct YF
    299 // CHECK-X64-NEXT:    0 |   char a
    300 // CHECK-X64-NEXT:    1 |   struct YE b (empty)
    301 // CHECK-X64-NEXT:    1 |     char
    302 // CHECK-X64-NEXT:      |   [sizeof=4, align=32
    303 // CHECK-X64-NEXT:      |    nvsize=4, nvalign=32]
    304 // CHECK-X64-NEXT:      | [sizeof=5, align=1
    305 // CHECK-X64-NEXT:      |  nvsize=5, nvalign=1]
    306 
    307 #pragma pack(16)
    308 struct __declspec(align(16)) D0 { char a; };
    309 #pragma pack(1)
    310 struct D1 : public D0 { char a; };
    311 #pragma pack(16)
    312 struct D2 : D1 { char a; };
    313 
    314 // CHECK: *** Dumping AST Record Layout
    315 // CHECK: *** Dumping AST Record Layout
    316 // CHECK: *** Dumping AST Record Layout
    317 // CHECK-NEXT:    0 | struct D2
    318 // CHECK-NEXT:    0 |   struct D1 (base)
    319 // CHECK-NEXT:    0 |     struct D0 (base)
    320 // CHECK-NEXT:    0 |       char a
    321 // CHECK-NEXT:    1 |     char a
    322 // CHECK-NEXT:    2 |   char a
    323 // CHECK-NEXT:      | [sizeof=16, align=16
    324 // CHECK-NEXT:      |  nvsize=16, nvalign=16]
    325 // CHECK-X64: *** Dumping AST Record Layout
    326 // CHECK-X64: *** Dumping AST Record Layout
    327 // CHECK-X64: *** Dumping AST Record Layout
    328 // CHECK-X64-NEXT:    0 | struct D2
    329 // CHECK-X64-NEXT:    0 |   struct D1 (base)
    330 // CHECK-X64-NEXT:    0 |     struct D0 (base)
    331 // CHECK-X64-NEXT:    0 |       char a
    332 // CHECK-X64-NEXT:    1 |     char a
    333 // CHECK-X64-NEXT:    2 |   char a
    334 // CHECK-X64-NEXT:      | [sizeof=16, align=16
    335 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
    336 
    337 #pragma pack()
    338 struct JA { char a; };
    339 #pragma pack(1)
    340 struct JB { __declspec(align(4)) char a; };
    341 #pragma pack()
    342 struct JC : JB, JA { };
    343 
    344 // CHECK: *** Dumping AST Record Layout
    345 // CHECK: *** Dumping AST Record Layout
    346 // CHECK: *** Dumping AST Record Layout
    347 // CHECK-NEXT:    0 | struct JC
    348 // CHECK-NEXT:    0 |   struct JB (base)
    349 // CHECK-NEXT:    0 |     char a
    350 // CHECK-NEXT:    1 |   struct JA (base)
    351 // CHECK-NEXT:    1 |     char a
    352 // CHECK-NEXT:      | [sizeof=4, align=4
    353 // CHECK-NEXT:      |  nvsize=4, nvalign=4]
    354 // CHECK-X64: *** Dumping AST Record Layout
    355 // CHECK-X64: *** Dumping AST Record Layout
    356 // CHECK-X64: *** Dumping AST Record Layout
    357 // CHECK-X64-NEXT:    0 | struct JC
    358 // CHECK-X64-NEXT:    0 |   struct JB (base)
    359 // CHECK-X64-NEXT:    0 |     char a
    360 // CHECK-X64-NEXT:    1 |   struct JA (base)
    361 // CHECK-X64-NEXT:    1 |     char a
    362 // CHECK-X64-NEXT:      | [sizeof=4, align=4
    363 // CHECK-X64-NEXT:      |  nvsize=4, nvalign=4]
    364 
    365 #pragma pack()
    366 struct KA { char a; };
    367 #pragma pack(1)
    368 struct KB : KA { __declspec(align(2)) char a; };
    369 
    370 // CHECK: *** Dumping AST Record Layout
    371 // CHECK: *** Dumping AST Record Layout
    372 // CHECK-NEXT:    0 | struct KB
    373 // CHECK-NEXT:    0 |   struct KA (base)
    374 // CHECK-NEXT:    0 |     char a
    375 // CHECK-NEXT:    2 |   char a
    376 // CHECK-NEXT:      | [sizeof=4, align=2
    377 // CHECK-NEXT:      |  nvsize=3, nvalign=2]
    378 // CHECK-X64: *** Dumping AST Record Layout
    379 // CHECK-X64: *** Dumping AST Record Layout
    380 // CHECK-X64-NEXT:    0 | struct KB
    381 // CHECK-X64-NEXT:    0 |   struct KA (base)
    382 // CHECK-X64-NEXT:    0 |     char a
    383 // CHECK-X64-NEXT:    2 |   char a
    384 // CHECK-X64-NEXT:      | [sizeof=4, align=2
    385 // CHECK-X64-NEXT:      |  nvsize=3, nvalign=2]
    386 
    387 #pragma pack(1)
    388 struct L {
    389   virtual void fun() {}
    390   __declspec(align(256)) int Field;
    391 };
    392 
    393 // CHECK: *** Dumping AST Record Layout
    394 // CHECK-NEXT:    0 | struct L
    395 // CHECK-NEXT:    0 |   (L vftable pointer)
    396 // CHECK-NEXT:  256 |   int Field
    397 // CHECK-NEXT:      | [sizeof=512, align=256
    398 // CHECK-NEXT:      |  nvsize=260, nvalign=256]
    399 // CHECK-X64: *** Dumping AST Record Layout
    400 // CHECK-X64-NEXT:    0 | struct L
    401 // CHECK-X64-NEXT:    0 |   (L vftable pointer)
    402 // CHECK-X64-NEXT:  256 |   int Field
    403 // CHECK-X64-NEXT:      | [sizeof=512, align=256
    404 // CHECK-X64-NEXT:      |  nvsize=260, nvalign=256]
    405 
    406 #pragma pack()
    407 struct MA {};
    408 #pragma pack(1)
    409 struct MB : virtual MA {
    410   __declspec(align(256)) int Field;
    411 };
    412 
    413 // CHECK: *** Dumping AST Record Layout
    414 // CHECK: *** Dumping AST Record Layout
    415 // CHECK-NEXT:    0 | struct MB
    416 // CHECK-NEXT:    0 |   (MB vbtable pointer)
    417 // CHECK-NEXT:  256 |   int Field
    418 // CHECK-NEXT:  260 |   struct MA (virtual base) (empty)
    419 // CHECK-NEXT:      | [sizeof=512, align=256
    420 // CHECK-NEXT:      |  nvsize=260, nvalign=256]
    421 // CHECK-X64: *** Dumping AST Record Layout
    422 // CHECK-X64: *** Dumping AST Record Layout
    423 // CHECK-X64-NEXT:    0 | struct MB
    424 // CHECK-X64-NEXT:    0 |   (MB vbtable pointer)
    425 // CHECK-X64-NEXT:  256 |   int Field
    426 // CHECK-X64-NEXT:  260 |   struct MA (virtual base) (empty)
    427 // CHECK-X64-NEXT:      | [sizeof=512, align=256
    428 // CHECK-X64-NEXT:      |  nvsize=260, nvalign=256]
    429 
    430 struct RA {};
    431 #pragma pack(1)
    432 struct __declspec(align(8)) RB0 {
    433 	__declspec(align(1024)) int b : 3;
    434 };
    435 
    436 struct __declspec(align(8)) RB1 {
    437 	__declspec(align(1024)) int b : 3;
    438 	virtual void f() {}
    439 };
    440 
    441 struct __declspec(align(8)) RB2 : virtual RA {
    442 	__declspec(align(1024)) int b : 3;
    443 };
    444 
    445 struct __declspec(align(8)) RB3 : virtual RA {
    446 	__declspec(align(1024)) int b : 3;
    447 	virtual void f() {}
    448 };
    449 
    450 struct RC {
    451 	char _;
    452 	__declspec(align(1024)) int c : 3;
    453 };
    454 struct RE {
    455 	char _;
    456 	RC c;
    457 };
    458 #pragma pack()
    459 
    460 // CHECK: *** Dumping AST Record Layout
    461 // CHECK-NEXT:    0 | struct RB0
    462 // CHECK-NEXT:    0 |   int b
    463 // CHECK-NEXT:      | [sizeof=8, align=1024
    464 // CHECK-NEXT:      |  nvsize=4, nvalign=1024]
    465 // CHECK: *** Dumping AST Record Layout
    466 // CHECK-NEXT:    0 | struct RB1
    467 // CHECK-NEXT:    0 |   (RB1 vftable pointer)
    468 // CHECK-NEXT: 1024 |   int b
    469 // CHECK-NEXT:      | [sizeof=1032, align=1024
    470 // CHECK-NEXT:      |  nvsize=1028, nvalign=1024]
    471 // CHECK: *** Dumping AST Record Layout
    472 // CHECK: *** Dumping AST Record Layout
    473 // CHECK-NEXT:    0 | struct RB2
    474 // CHECK-NEXT:    0 |   (RB2 vbtable pointer)
    475 // CHECK-NEXT: 1024 |   int b
    476 // CHECK-NEXT: 1028 |   struct RA (virtual base) (empty)
    477 // CHECK-NEXT:      | [sizeof=1032, align=1024
    478 // CHECK-NEXT:      |  nvsize=1028, nvalign=1024]
    479 // CHECK: *** Dumping AST Record Layout
    480 // CHECK-NEXT:    0 | struct RB3
    481 // CHECK-NEXT:    0 |   (RB3 vftable pointer)
    482 // CHECK-NEXT: 1024 |   (RB3 vbtable pointer)
    483 // CHECK-NEXT: 2048 |   int b
    484 // CHECK-NEXT: 2052 |   struct RA (virtual base) (empty)
    485 // CHECK-NEXT:      | [sizeof=2056, align=1024
    486 // CHECK-NEXT:      |  nvsize=2052, nvalign=1024]
    487 // CHECK: *** Dumping AST Record Layout
    488 // CHECK-NEXT:    0 | struct RC
    489 // CHECK-NEXT:    0 |   char _
    490 // CHECK-NEXT: 1024 |   int c
    491 // CHECK-NEXT:      | [sizeof=1028, align=1024
    492 // CHECK-NEXT:      |  nvsize=1028, nvalign=1024]
    493 // CHECK: *** Dumping AST Record Layout
    494 // CHECK-NEXT:    0 | struct RE
    495 // CHECK-NEXT:    0 |   char _
    496 // CHECK-NEXT:    1 |   struct RC c
    497 // CHECK-NEXT:    1 |     char _
    498 // CHECK-NEXT: 1025 |     int c
    499 // CHECK-NEXT:      |   [sizeof=1028, align=1024
    500 // CHECK-NEXT:      |    nvsize=1028, nvalign=1024]
    501 // CHECK-NEXT:      | [sizeof=1029, align=1
    502 // CHECK-NEXT:      |  nvsize=1029, nvalign=1]
    503 // CHECK-X64: *** Dumping AST Record Layout
    504 // CHECK-X64-NEXT:    0 | struct RB0
    505 // CHECK-X64-NEXT:    0 |   int b
    506 // CHECK-X64-NEXT:      | [sizeof=8, align=1024
    507 // CHECK-X64-NEXT:      |  nvsize=4, nvalign=1024]
    508 // CHECK-X64: *** Dumping AST Record Layout
    509 // CHECK-X64-NEXT:    0 | struct RB1
    510 // CHECK-X64-NEXT:    0 |   (RB1 vftable pointer)
    511 // CHECK-X64-NEXT: 1024 |   int b
    512 // CHECK-X64-NEXT:      | [sizeof=1032, align=1024
    513 // CHECK-X64-NEXT:      |  nvsize=1028, nvalign=1024]
    514 // CHECK-X64: *** Dumping AST Record Layout
    515 // CHECK-X64: *** Dumping AST Record Layout
    516 // CHECK-X64-NEXT:    0 | struct RB2
    517 // CHECK-X64-NEXT:    0 |   (RB2 vbtable pointer)
    518 // CHECK-X64-NEXT: 1024 |   int b
    519 // CHECK-X64-NEXT: 1028 |   struct RA (virtual base) (empty)
    520 // CHECK-X64-NEXT:      | [sizeof=1032, align=1024
    521 // CHECK-X64-NEXT:      |  nvsize=1028, nvalign=1024]
    522 // CHECK-X64: *** Dumping AST Record Layout
    523 // CHECK-X64-NEXT:    0 | struct RB3
    524 // CHECK-X64-NEXT:    0 |   (RB3 vftable pointer)
    525 // CHECK-X64-NEXT: 1024 |   (RB3 vbtable pointer)
    526 // CHECK-X64-NEXT: 2048 |   int b
    527 // CHECK-X64-NEXT: 2052 |   struct RA (virtual base) (empty)
    528 // CHECK-X64-NEXT:      | [sizeof=2056, align=1024
    529 // CHECK-X64-NEXT:      |  nvsize=2052, nvalign=1024]
    530 // CHECK-X64: *** Dumping AST Record Layout
    531 // CHECK-X64-NEXT:    0 | struct RC
    532 // CHECK-X64-NEXT:    0 |   char _
    533 // CHECK-X64-NEXT: 1024 |   int c
    534 // CHECK-X64-NEXT:      | [sizeof=1028, align=1024
    535 // CHECK-X64-NEXT:      |  nvsize=1028, nvalign=1024]
    536 // CHECK-X64: *** Dumping AST Record Layout
    537 // CHECK-X64-NEXT:    0 | struct RE
    538 // CHECK-X64-NEXT:    0 |   char _
    539 // CHECK-X64-NEXT:    1 |   struct RC c
    540 // CHECK-X64-NEXT:    1 |     char _
    541 // CHECK-X64-NEXT: 1025 |     int c
    542 // CHECK-X64-NEXT:      |   [sizeof=1028, align=1024
    543 // CHECK-X64-NEXT:      |    nvsize=1028, nvalign=1024]
    544 // CHECK-X64-NEXT:      | [sizeof=1029, align=1
    545 // CHECK-X64-NEXT:      |  nvsize=1029, nvalign=1]
    546 
    547 int a[
    548 sizeof(X)+
    549 sizeof(Y)+
    550 sizeof(Z)+
    551 sizeof(C1)+
    552 sizeof(CA2)+
    553 sizeof(YA)+
    554 sizeof(YB)+
    555 sizeof(YC)+
    556 sizeof(YD)+
    557 sizeof(YE)+
    558 sizeof(YF)+
    559 sizeof(YF)+
    560 sizeof(D2)+
    561 sizeof(JC)+
    562 sizeof(KB)+
    563 sizeof(L)+
    564 sizeof(MB)+
    565 sizeof(RB0)+
    566 sizeof(RB1)+
    567 sizeof(RB2)+
    568 sizeof(RB3)+
    569 sizeof(RC)+
    570 sizeof(RE)+
    571 0];
    572