710 lines · cpp
1// RUN: %clang_cc1 -fno-rtti -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only -Wno-inaccessible-base %s 2>&1 \2// RUN: | FileCheck %s --strict-whitespace3// RUN: %clang_cc1 -fno-rtti -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only -Wno-inaccessible-base %s 2>/dev/null \4// RUN: | FileCheck %s -check-prefix CHECK-X64 --strict-whitespace5 6extern "C" int printf(const char *fmt, ...);7char buffer[419430400];8 9struct 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 17struct 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)26struct 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-LABEL: 0 | struct X{{$}}39// CHECK-NEXT: 0 | struct B a40// CHECK-NEXT: 0 | long long a41// CHECK-NEXT: 8 | char b42// CHECK-NEXT: 10 | int c43// CHECK-NEXT: | [sizeof=16, align=444// CHECK-NEXT: | nvsize=14, nvalign=4]45// CHECK-X64-LABEL: 0 | struct X{{$}}46// CHECK-X64-NEXT: 0 | struct B a47// CHECK-X64-NEXT: 0 | long long a48// CHECK-X64-NEXT: 8 | char b49// CHECK-X64-NEXT: 10 | int c50// CHECK-X64-NEXT: | [sizeof=16, align=451// CHECK-X64-NEXT: | nvsize=14, nvalign=4]52 53struct Y : A, B {54 char a;55 int b;56 Y() {57 printf("Y = %d\n", (int)((char*)this - buffer));58 printf("Y.a = %d\n", (int)((char*)&a - buffer));59 printf("Y.b = %d\n", (int)((char*)&b - buffer));60 }61};62 63// CHECK-LABEL: 0 | struct Y{{$}}64// CHECK-NEXT: 0 | struct A (base)65// CHECK-NEXT: 0 | char a66// CHECK-NEXT: 4 | struct B (base)67// CHECK-NEXT: 4 | long long a68// CHECK-NEXT: 12 | char a69// CHECK-NEXT: 14 | int b70// CHECK-NEXT: | [sizeof=20, align=471// CHECK-NEXT: | nvsize=18, nvalign=4]72// CHECK-X64-LABEL: 0 | struct Y{{$}}73// CHECK-X64-NEXT: 0 | struct A (base)74// CHECK-X64-NEXT: 0 | char a75// CHECK-X64-NEXT: 4 | struct B (base)76// CHECK-X64-NEXT: 4 | long long a77// CHECK-X64-NEXT: 12 | char a78// CHECK-X64-NEXT: 14 | int b79// CHECK-X64-NEXT: | [sizeof=20, align=480// CHECK-X64-NEXT: | nvsize=18, nvalign=4]81 82struct Z : virtual B {83 char a;84 int b;85 Z() {86 printf("Z = %d\n", (int)((char*)this - buffer));87 printf("Z.a = %d\n", (int)((char*)&a - buffer));88 printf("Z.b = %d\n", (int)((char*)&b - buffer));89 }90};91 92// CHECK-LABEL: 0 | struct Z{{$}}93// CHECK-NEXT: 0 | (Z vbtable pointer)94// CHECK-NEXT: 4 | char a95// CHECK-NEXT: 6 | int b96// CHECK-NEXT: 12 | struct B (virtual base)97// CHECK-NEXT: 12 | long long a98// CHECK-NEXT: | [sizeof=20, align=499// CHECK-NEXT: | nvsize=10, nvalign=4]100// CHECK-X64-LABEL: 0 | struct Z{{$}}101// CHECK-X64-NEXT: 0 | (Z vbtable pointer)102// CHECK-X64-NEXT: 8 | char a103// CHECK-X64-NEXT: 10 | int b104// CHECK-X64-NEXT: 16 | struct B (virtual base)105// CHECK-X64-NEXT: 16 | long long a106// CHECK-X64-NEXT: | [sizeof=24, align=4107// CHECK-X64-NEXT: | nvsize=14, nvalign=4]108 109#pragma pack(pop)110 111struct A1 { long long a; };112#pragma pack(push, 1)113struct B1 : virtual A1 { char a; };114#pragma pack(pop)115struct C1 : B1 {};116 117// CHECK-LABEL: 0 | struct C1{{$}}118// CHECK-NEXT: 0 | struct B1 (base)119// CHECK-NEXT: 0 | (B1 vbtable pointer)120// CHECK-NEXT: 4 | char a121// CHECK-NEXT: 8 | struct A1 (virtual base)122// CHECK-NEXT: 8 | long long a123// CHECK-NEXT: | [sizeof=16, align=8124// CHECK-NEXT: | nvsize=5, nvalign=8]125// CHECK-X64-LABEL: 0 | struct C1{{$}}126// CHECK-X64-NEXT: 0 | struct B1 (base)127// CHECK-X64-NEXT: 0 | (B1 vbtable pointer)128// CHECK-X64-NEXT: 8 | char a129// CHECK-X64-NEXT: 16 | struct A1 (virtual base)130// CHECK-X64-NEXT: 16 | long long a131// CHECK-X64-NEXT: | [sizeof=24, align=8132// CHECK-X64-NEXT: | nvsize=9, nvalign=8]133 134struct CA0 {135 CA0() {}136};137struct CA1 : virtual CA0 {138 CA1() {}139};140#pragma pack(push, 1)141struct CA2 : public CA1, public CA0 {142 virtual void CA2Method() {}143 CA2() {}144};145#pragma pack(pop)146 147// CHECK-LABEL: 0 | struct CA2{{$}}148// CHECK-NEXT: 0 | (CA2 vftable pointer)149// CHECK-NEXT: 4 | struct CA1 (base)150// CHECK-NEXT: 4 | (CA1 vbtable pointer)151// CHECK-NEXT: 9 | struct CA0 (base) (empty)152// CHECK-NEXT: 9 | struct CA0 (virtual base) (empty)153// CHECK-NEXT: | [sizeof=9, align=1154// CHECK-NEXT: | nvsize=9, nvalign=1]155// CHECK-X64-LABEL: 0 | struct CA2{{$}}156// CHECK-X64-NEXT: 0 | (CA2 vftable pointer)157// CHECK-X64-NEXT: 8 | struct CA1 (base)158// CHECK-X64-NEXT: 8 | (CA1 vbtable pointer)159// CHECK-X64-NEXT: 17 | struct CA0 (base) (empty)160// CHECK-X64-NEXT: 17 | struct CA0 (virtual base) (empty)161// CHECK-X64-NEXT: | [sizeof=17, align=1162// CHECK-X64-NEXT: | nvsize=17, nvalign=1]163 164#pragma pack(16)165struct YA {166 __declspec(align(32)) char : 1;167};168// CHECK-LABEL: 0 | struct YA{{$}}169// CHECK-NEXT:0:0-0 | char170// CHECK-NEXT: | [sizeof=32, align=32171// CHECK-NEXT: | nvsize=32, nvalign=32]172// CHECK-X64-LABEL: 0 | struct YA{{$}}173// CHECK-X64-NEXT:0:0-0 | char174// CHECK-X64-NEXT: | [sizeof=32, align=32175// CHECK-X64-NEXT: | nvsize=32, nvalign=32]176 177#pragma pack(1)178struct YB {179 char a;180 YA b;181};182// CHECK-LABEL: 0 | struct YB{{$}}183// CHECK-NEXT: 0 | char a184// CHECK-NEXT: 1 | struct YA b185// CHECK-NEXT:1:0-0 | char186// CHECK-NEXT: | [sizeof=33, align=1187// CHECK-NEXT: | nvsize=33, nvalign=1]188// CHECK-X64-LABEL: 0 | struct YB{{$}}189// CHECK-X64-NEXT: 0 | char a190// CHECK-X64-NEXT: 1 | struct YA b191// CHECK-X64-NEXT:1:0-0 | char192// CHECK-X64-NEXT: | [sizeof=33, align=1193// CHECK-X64-NEXT: | nvsize=33, nvalign=1]194 195#pragma pack(8)196struct YC {197 __declspec(align(32)) char : 1;198};199// CHECK-LABEL: 0 | struct YC{{$}}200// CHECK-NEXT:0:0-0 | char201// CHECK-NEXT: | [sizeof=32, align=32202// CHECK-NEXT: | nvsize=32, nvalign=32]203// CHECK-X64-LABEL: 0 | struct YC{{$}}204// CHECK-X64-NEXT: 0:0-0 | char205// CHECK-X64-NEXT: | [sizeof=8, align=32206// CHECK-X64-NEXT: | nvsize=8, nvalign=32]207 208#pragma pack(1)209struct YD {210 char a;211 YC b;212};213// CHECK-LABEL: 0 | struct YD{{$}}214// CHECK-NEXT: 0 | char a215// CHECK-NEXT: 1 | struct YC b216// CHECK-NEXT:1:0-0 | char217// CHECK-NEXT: | [sizeof=33, align=1218// CHECK-NEXT: | nvsize=33, nvalign=1]219// CHECK-X64-LABEL: 0 | struct YD{{$}}220// CHECK-X64-NEXT: 0 | char a221// CHECK-X64-NEXT: 1 | struct YC b222// CHECK-X64-NEXT:1:0-0 | char223// CHECK-X64-NEXT: | [sizeof=9, align=1224// CHECK-X64-NEXT: | nvsize=9, nvalign=1]225 226#pragma pack(4)227struct YE {228 __declspec(align(32)) char : 1;229};230// CHECK-LABEL: 0 | struct YE{{$}}231// CHECK-NEXT: 0:0-0 | char232// CHECK-NEXT: | [sizeof=4, align=32233// CHECK-NEXT: | nvsize=4, nvalign=32]234// CHECK-X64-LABEL: 0 | struct YE{{$}}235// CHECK-X64-NEXT: 0:0-0 | char236// CHECK-X64-NEXT: | [sizeof=4, align=32237// CHECK-X64-NEXT: | nvsize=4, nvalign=32]238 239#pragma pack(1)240struct YF {241 char a;242 YE b;243};244// CHECK-LABEL: 0 | struct YF{{$}}245// CHECK-NEXT: 0 | char a246// CHECK-NEXT: 1 | struct YE b247// CHECK-NEXT:1:0-0 | char248// CHECK-NEXT: | [sizeof=5, align=1249// CHECK-NEXT: | nvsize=5, nvalign=1]250// CHECK-X64-LABEL: 0 | struct YF{{$}}251// CHECK-X64-NEXT: 0 | char a252// CHECK-X64-NEXT: 1 | struct YE b253// CHECK-X64-NEXT:1:0-0 | char254// CHECK-X64-NEXT: | [sizeof=5, align=1255// CHECK-X64-NEXT: | nvsize=5, nvalign=1]256 257#pragma pack(16)258struct __declspec(align(16)) D0 { char a; };259#pragma pack(1)260struct D1 : public D0 { char a; };261#pragma pack(16)262struct D2 : D1 { char a; };263 264// CHECK-LABEL: 0 | struct D2{{$}}265// CHECK-NEXT: 0 | struct D1 (base)266// CHECK-NEXT: 0 | struct D0 (base)267// CHECK-NEXT: 0 | char a268// CHECK-NEXT: 1 | char a269// CHECK-NEXT: 2 | char a270// CHECK-NEXT: | [sizeof=16, align=16271// CHECK-NEXT: | nvsize=16, nvalign=16]272// CHECK-X64-LABEL: 0 | struct D2{{$}}273// CHECK-X64-NEXT: 0 | struct D1 (base)274// CHECK-X64-NEXT: 0 | struct D0 (base)275// CHECK-X64-NEXT: 0 | char a276// CHECK-X64-NEXT: 1 | char a277// CHECK-X64-NEXT: 2 | char a278// CHECK-X64-NEXT: | [sizeof=16, align=16279// CHECK-X64-NEXT: | nvsize=16, nvalign=16]280 281#pragma pack()282struct JA { char a; };283#pragma pack(1)284struct JB { __declspec(align(4)) char a; };285#pragma pack()286struct JC : JB, JA { };287 288// CHECK-LABEL: 0 | struct JC{{$}}289// CHECK-NEXT: 0 | struct JB (base)290// CHECK-NEXT: 0 | char a291// CHECK-NEXT: 1 | struct JA (base)292// CHECK-NEXT: 1 | char a293// CHECK-NEXT: | [sizeof=4, align=4294// CHECK-NEXT: | nvsize=4, nvalign=4]295// CHECK-X64-LABEL: 0 | struct JC{{$}}296// CHECK-X64-NEXT: 0 | struct JB (base)297// CHECK-X64-NEXT: 0 | char a298// CHECK-X64-NEXT: 1 | struct JA (base)299// CHECK-X64-NEXT: 1 | char a300// CHECK-X64-NEXT: | [sizeof=4, align=4301// CHECK-X64-NEXT: | nvsize=4, nvalign=4]302 303#pragma pack()304struct KA { char a; };305#pragma pack(1)306struct KB : KA { __declspec(align(2)) char a; };307 308// CHECK-LABEL: 0 | struct KB{{$}}309// CHECK-NEXT: 0 | struct KA (base)310// CHECK-NEXT: 0 | char a311// CHECK-NEXT: 2 | char a312// CHECK-NEXT: | [sizeof=4, align=2313// CHECK-NEXT: | nvsize=3, nvalign=2]314// CHECK-X64-LABEL: 0 | struct KB{{$}}315// CHECK-X64-NEXT: 0 | struct KA (base)316// CHECK-X64-NEXT: 0 | char a317// CHECK-X64-NEXT: 2 | char a318// CHECK-X64-NEXT: | [sizeof=4, align=2319// CHECK-X64-NEXT: | nvsize=3, nvalign=2]320 321#pragma pack(1)322struct L {323 virtual void fun() {}324 __declspec(align(256)) int Field;325};326 327// CHECK-LABEL: 0 | struct L{{$}}328// CHECK-NEXT: 0 | (L vftable pointer)329// CHECK-NEXT: 256 | int Field330// CHECK-NEXT: | [sizeof=512, align=256331// CHECK-NEXT: | nvsize=260, nvalign=256]332// CHECK-X64-LABEL: 0 | struct L{{$}}333// CHECK-X64-NEXT: 0 | (L vftable pointer)334// CHECK-X64-NEXT: 256 | int Field335// CHECK-X64-NEXT: | [sizeof=512, align=256336// CHECK-X64-NEXT: | nvsize=260, nvalign=256]337 338#pragma pack()339struct MA {};340#pragma pack(1)341struct MB : virtual MA {342 __declspec(align(256)) int Field;343};344 345// CHECK-LABEL: 0 | struct MB{{$}}346// CHECK-NEXT: 0 | (MB vbtable pointer)347// CHECK-NEXT: 256 | int Field348// CHECK-NEXT: 260 | struct MA (virtual base) (empty)349// CHECK-NEXT: | [sizeof=512, align=256350// CHECK-NEXT: | nvsize=260, nvalign=256]351// CHECK-X64-LABEL: 0 | struct MB{{$}}352// CHECK-X64-NEXT: 0 | (MB vbtable pointer)353// CHECK-X64-NEXT: 256 | int Field354// CHECK-X64-NEXT: 260 | struct MA (virtual base) (empty)355// CHECK-X64-NEXT: | [sizeof=512, align=256356// CHECK-X64-NEXT: | nvsize=260, nvalign=256]357 358struct RA {};359#pragma pack(1)360struct __declspec(align(8)) RB0 { 361 __declspec(align(1024)) int b : 3;362};363 364struct __declspec(align(8)) RB1 { 365 __declspec(align(1024)) int b : 3;366 virtual void f() {}367};368 369struct __declspec(align(8)) RB2 : virtual RA { 370 __declspec(align(1024)) int b : 3;371};372 373struct __declspec(align(8)) RB3 : virtual RA { 374 __declspec(align(1024)) int b : 3;375 virtual void f() {}376};377 378struct RC {379 char _;380 __declspec(align(1024)) int c : 3;381};382struct RE {383 char _;384 RC c;385};386#pragma pack()387 388// CHECK-LABEL: 0 | struct RB0{{$}}389// CHECK-NEXT:0:0-2 | int b390// CHECK-NEXT: | [sizeof=8, align=1024391// CHECK-NEXT: | nvsize=4, nvalign=1024]392// CHECK-LABEL: 0 | struct RB1{{$}}393// CHECK-NEXT: 0 | (RB1 vftable pointer)394// CHECK-NEXT: 1024:0-2 | int b395// CHECK-NEXT: | [sizeof=1032, align=1024396// CHECK-NEXT: | nvsize=1028, nvalign=1024]397// CHECK-LABEL: 0 | struct RB2{{$}}398// CHECK-NEXT: 0 | (RB2 vbtable pointer)399// CHECK-NEXT: 1024:0-2 | int b400// CHECK-NEXT: 1028 | struct RA (virtual base) (empty)401// CHECK-NEXT: | [sizeof=1032, align=1024402// CHECK-NEXT: | nvsize=1028, nvalign=1024]403// CHECK-LABEL: 0 | struct RB3{{$}}404// CHECK-NEXT: 0 | (RB3 vftable pointer)405// CHECK-NEXT: 1024 | (RB3 vbtable pointer)406// CHECK-NEXT: 2048:0-2 | int b407// CHECK-NEXT: 2052 | struct RA (virtual base) (empty)408// CHECK-NEXT: | [sizeof=2056, align=1024409// CHECK-NEXT: | nvsize=2052, nvalign=1024]410// CHECK-LABEL: 0 | struct RC{{$}}411// CHECK-NEXT: 0 | char _412// CHECK-NEXT: 1024:0-2 | int c413// CHECK-NEXT: | [sizeof=1028, align=1024414// CHECK-NEXT: | nvsize=1028, nvalign=1024]415// CHECK-LABEL: 0 | struct RE{{$}}416// CHECK-NEXT: 0 | char _417// CHECK-NEXT: 1 | struct RC c418// CHECK-NEXT: 1 | char _419// CHECK-NEXT: 1025:0-2 | int c420// CHECK-NEXT: | [sizeof=1029, align=1421// CHECK-NEXT: | nvsize=1029, nvalign=1]422// CHECK-X64-LABEL: 0 | struct RB0{{$}}423// CHECK-X64-NEXT: 0:0-2 | int b424// CHECK-X64-NEXT: | [sizeof=8, align=1024425// CHECK-X64-NEXT: | nvsize=4, nvalign=1024]426// CHECK-X64-LABEL: 0 | struct RB1{{$}}427// CHECK-X64-NEXT: 0 | (RB1 vftable pointer)428// CHECK-X64-NEXT: 1024:0-2 | int b429// CHECK-X64-NEXT: | [sizeof=1032, align=1024430// CHECK-X64-NEXT: | nvsize=1028, nvalign=1024]431// CHECK-X64-LABEL: 0 | struct RB2{{$}}432// CHECK-X64-NEXT: 0 | (RB2 vbtable pointer)433// CHECK-X64-NEXT: 1024:0-2 | int b434// CHECK-X64-NEXT: 1028 | struct RA (virtual base) (empty)435// CHECK-X64-NEXT: | [sizeof=1032, align=1024436// CHECK-X64-NEXT: | nvsize=1028, nvalign=1024]437// CHECK-X64-LABEL: 0 | struct RB3{{$}}438// CHECK-X64-NEXT: 0 | (RB3 vftable pointer)439// CHECK-X64-NEXT: 1024 | (RB3 vbtable pointer)440// CHECK-X64-NEXT: 2048:0-2 | int b441// CHECK-X64-NEXT: 2052 | struct RA (virtual base) (empty)442// CHECK-X64-NEXT: | [sizeof=2056, align=1024443// CHECK-X64-NEXT: | nvsize=2052, nvalign=1024]444// CHECK-X64-LABEL: 0 | struct RC{{$}}445// CHECK-X64-NEXT: 0 | char _446// CHECK-X64-NEXT: 1024:0-2 | int c447// CHECK-X64-NEXT: | [sizeof=1028, align=1024448// CHECK-X64-NEXT: | nvsize=1028, nvalign=1024]449// CHECK-X64-LABEL: 0 | struct RE{{$}}450// CHECK-X64-NEXT: 0 | char _451// CHECK-X64-NEXT: 1 | struct RC c452// CHECK-X64-NEXT: 1 | char _453// CHECK-X64-NEXT: 1025:0-2 | int c454// CHECK-X64-NEXT: | [sizeof=1029, align=1455// CHECK-X64-NEXT: | nvsize=1029, nvalign=1]456 457struct NA {};458struct NB {};459#pragma pack(push, 1)460struct NC : virtual NA, virtual NB {};461#pragma pack(pop)462struct ND : NC {};463 464// CHECK-LABEL: 0 | struct NA (empty){{$}}465// CHECK-NEXT: | [sizeof=1, align=1466// CHECK-NEXT: | nvsize=0, nvalign=1]467// CHECK-LABEL: 0 | struct NB (empty){{$}}468// CHECK-NEXT: | [sizeof=1, align=1469// CHECK-NEXT: | nvsize=0, nvalign=1]470// CHECK-LABEL: 0 | struct NC{{$}}471// CHECK-NEXT: 0 | (NC vbtable pointer)472// CHECK-NEXT: 4 | struct NA (virtual base) (empty)473// CHECK-NEXT: 8 | struct NB (virtual base) (empty)474// CHECK-NEXT: | [sizeof=8, align=1475// CHECK-NEXT: | nvsize=4, nvalign=1]476// CHECK-LABEL: 0 | struct ND{{$}}477// CHECK-NEXT: 0 | struct NC (base)478// CHECK-NEXT: 0 | (NC vbtable pointer)479// CHECK-NEXT: 4 | struct NA (virtual base) (empty)480// CHECK-NEXT: 8 | struct NB (virtual base) (empty)481// CHECK-NEXT: | [sizeof=8, align=4482// CHECK-NEXT: | nvsize=4, nvalign=4]483// CHECK-X64-LABEL: 0 | struct NA (empty){{$}}484// CHECK-X64-NEXT: | [sizeof=1, align=1485// CHECK-X64-NEXT: | nvsize=0, nvalign=1]486// CHECK-X64-LABEL: 0 | struct NB (empty){{$}}487// CHECK-X64-NEXT: | [sizeof=1, align=1488// CHECK-X64-NEXT: | nvsize=0, nvalign=1]489// CHECK-X64-LABEL: 0 | struct NC{{$}}490// CHECK-X64-NEXT: 0 | (NC vbtable pointer)491// CHECK-X64-NEXT: 8 | struct NA (virtual base) (empty)492// CHECK-X64-NEXT: 12 | struct NB (virtual base) (empty)493// CHECK-X64-NEXT: | [sizeof=12, align=1494// CHECK-X64-NEXT: | nvsize=8, nvalign=1]495// CHECK-X64-LABEL: 0 | struct ND{{$}}496// CHECK-X64-NEXT: 0 | struct NC (base)497// CHECK-X64-NEXT: 0 | (NC vbtable pointer)498// CHECK-X64-NEXT: 8 | struct NA (virtual base) (empty)499// CHECK-X64-NEXT: 12 | struct NB (virtual base) (empty)500// CHECK-X64-NEXT: | [sizeof=12, align=4501// CHECK-X64-NEXT: | nvsize=8, nvalign=4]502 503struct OA {};504struct OB {};505struct OC : virtual OA, virtual OB {};506#pragma pack(push, 1)507struct OD : OC {};508#pragma pack(pop)509 510// CHECK-LABEL: 0 | struct OA (empty){{$}}511// CHECK-NEXT: | [sizeof=1, align=1512// CHECK-NEXT: | nvsize=0, nvalign=1]513// CHECK-LABEL: 0 | struct OB (empty){{$}}514// CHECK-NEXT: | [sizeof=1, align=1515// CHECK-NEXT: | nvsize=0, nvalign=1]516// CHECK-LABEL: 0 | struct OC{{$}}517// CHECK-NEXT: 0 | (OC vbtable pointer)518// CHECK-NEXT: 4 | struct OA (virtual base) (empty)519// CHECK-NEXT: 8 | struct OB (virtual base) (empty)520// CHECK-NEXT: | [sizeof=8, align=4521// CHECK-NEXT: | nvsize=4, nvalign=4]522// CHECK-LABEL: 0 | struct OD{{$}}523// CHECK-NEXT: 0 | struct OC (base)524// CHECK-NEXT: 0 | (OC vbtable pointer)525// CHECK-NEXT: 4 | struct OA (virtual base) (empty)526// CHECK-NEXT: 8 | struct OB (virtual base) (empty)527// CHECK-NEXT: | [sizeof=8, align=1528// CHECK-NEXT: | nvsize=4, nvalign=1]529// CHECK-X64-LABEL: 0 | struct OA (empty){{$}}530// CHECK-X64-NEXT: | [sizeof=1, align=1531// CHECK-X64-NEXT: | nvsize=0, nvalign=1]532// CHECK-X64-LABEL: 0 | struct OB (empty){{$}}533// CHECK-X64-NEXT: | [sizeof=1, align=1534// CHECK-X64-NEXT: | nvsize=0, nvalign=1]535// CHECK-X64-LABEL: 0 | struct OC{{$}}536// CHECK-X64-NEXT: 0 | (OC vbtable pointer)537// CHECK-X64-NEXT: 8 | struct OA (virtual base) (empty)538// CHECK-X64-NEXT: 12 | struct OB (virtual base) (empty)539// CHECK-X64-NEXT: | [sizeof=16, align=8540// CHECK-X64-NEXT: | nvsize=8, nvalign=8]541// CHECK-X64-LABEL: 0 | struct OD{{$}}542// CHECK-X64-NEXT: 0 | struct OC (base)543// CHECK-X64-NEXT: 0 | (OC vbtable pointer)544// CHECK-X64-NEXT: 8 | struct OA (virtual base) (empty)545// CHECK-X64-NEXT: 12 | struct OB (virtual base) (empty)546// CHECK-X64-NEXT: | [sizeof=12, align=1547// CHECK-X64-NEXT: | nvsize=8, nvalign=1]548 549struct __declspec(align(4)) PA {550 int c;551};552 553typedef __declspec(align(8)) PA PB;554 555#pragma pack(push, 1)556struct PC {557 char a;558 PB x;559};560#pragma pack(pop)561 562// CHECK: 0 | struct PC563// CHECK-NEXT: 0 | char a564// CHECK-NEXT: 8 | struct PA x565// CHECK-NEXT: 8 | int c566// CHECK-NEXT: | [sizeof=16, align=8567// CHECK-NEXT: | nvsize=12, nvalign=8]568// CHECK-X64: 0 | struct PC569// CHECK-X64-NEXT: 0 | char a570// CHECK-X64-NEXT: 8 | struct PA x571// CHECK-X64-NEXT: 8 | int c572// CHECK-X64-NEXT: | [sizeof=16, align=8573// CHECK-X64-NEXT: | nvsize=12, nvalign=8]574 575typedef PB PD;576 577#pragma pack(push, 1)578struct PE {579 char a;580 PD x;581};582#pragma pack(pop)583 584// CHECK: 0 | struct PE585// CHECK-NEXT: 0 | char a586// CHECK-NEXT: 8 | struct PA x587// CHECK-NEXT: 8 | int c588// CHECK-NEXT: | [sizeof=16, align=8589// CHECK-NEXT: | nvsize=12, nvalign=8]590// CHECK-X64: 0 | struct PE591// CHECK-X64-NEXT: 0 | char a592// CHECK-X64-NEXT: 8 | struct PA x593// CHECK-X64-NEXT: 8 | int c594// CHECK-X64-NEXT: | [sizeof=16, align=8595// CHECK-X64-NEXT: | nvsize=12, nvalign=8]596 597typedef int __declspec(align(2)) QA;598#pragma pack(push, 1)599struct QB {600 char a;601 QA b;602};603#pragma pack(pop)604 605// CHECK-LABEL: 0 | struct QB{{$}}606// CHECK-NEXT: 0 | char a607// CHECK-NEXT: 2 | QA b608// CHECK-NEXT: | [sizeof=6, align=2609// CHECK-NEXT: | nvsize=6, nvalign=2]610// CHECK-X64-LABEL: 0 | struct QB{{$}}611// CHECK-X64-NEXT: 0 | char a612// CHECK-X64-NEXT: 2 | QA b613// CHECK-X64-NEXT: | [sizeof=6, align=2614// CHECK-X64-NEXT: | nvsize=6, nvalign=2]615 616struct QC {617 char a;618 QA b;619};620 621// CHECK-LABEL: 0 | struct QC{{$}}622// CHECK-NEXT: 0 | char a623// CHECK-NEXT: 4 | QA b624// CHECK-NEXT: | [sizeof=8, align=4625// CHECK-NEXT: | nvsize=8, nvalign=4]626// CHECK-X64-LABEL: 0 | struct QC{{$}}627// CHECK-X64-NEXT: 0 | char a628// CHECK-X64-NEXT: 4 | QA b629// CHECK-X64-NEXT: | [sizeof=8, align=4630// CHECK-X64-NEXT: | nvsize=8, nvalign=4]631 632struct QD {633 char a;634 QA b : 3;635};636 637// CHECK-LABEL: 0 | struct QD{{$}}638// CHECK-NEXT: 0 | char a639// CHECK-NEXT:4:0-2 | QA b640// CHECK-NEXT: | [sizeof=8, align=4641// CHECK-NEXT: | nvsize=8, nvalign=4]642// CHECK-X64-LABEL: 0 | struct QD{{$}}643// CHECK-X64-NEXT: 0 | char a644// CHECK-X64-NEXT:4:0-2 | QA b645// CHECK-X64-NEXT: | [sizeof=8, align=4646// CHECK-X64-NEXT: | nvsize=8, nvalign=4]647 648struct __declspec(align(4)) EmptyAlignedLongLongMemb {649 long long FlexArrayMemb[0];650};651 652// CHECK-LABEL: 0 | struct EmptyAlignedLongLongMemb{{$}}653// CHECK-NEXT: 0 | long long[0] FlexArrayMemb654// CHECK-NEXT: | [sizeof=8, align=8655// CHECK-NEXT: | nvsize=0, nvalign=8]656// CHECK-X64-LABEL: 0 | struct EmptyAlignedLongLongMemb{{$}}657// CHECK-X64-NEXT: 0 | long long[0] FlexArrayMemb658// CHECK-X64-NEXT: | [sizeof=8, align=8659// CHECK-X64-NEXT: | nvsize=0, nvalign=8]660 661#pragma pack(1)662struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb {663 long long FlexArrayMemb[0];664};665#pragma pack()666 667// CHECK-LABEL: 0 | struct EmptyPackedAlignedLongLongMemb{{$}}668// CHECK-NEXT: 0 | long long[0] FlexArrayMemb669// CHECK-NEXT: | [sizeof=4, align=4670// CHECK-NEXT: | nvsize=0, nvalign=4]671// CHECK-X64-LABEL: 0 | struct EmptyPackedAlignedLongLongMemb{{$}}672// CHECK-X64-NEXT: 0 | long long[0] FlexArrayMemb673// CHECK-X64-NEXT: | [sizeof=4, align=4674// CHECK-X64-NEXT: | nvsize=0, nvalign=4]675 676int a[677sizeof(X)+678sizeof(Y)+679sizeof(Z)+680sizeof(C1)+681sizeof(CA2)+682sizeof(YA)+683sizeof(YB)+684sizeof(YC)+685sizeof(YD)+686sizeof(YE)+687sizeof(YF)+688sizeof(YF)+689sizeof(D2)+690sizeof(JC)+691sizeof(KB)+692sizeof(L)+693sizeof(MB)+694sizeof(RB0)+695sizeof(RB1)+696sizeof(RB2)+697sizeof(RB3)+698sizeof(RC)+699sizeof(RE)+700sizeof(ND)+701sizeof(OD)+702sizeof(PC)+703sizeof(PE)+704sizeof(QB)+705sizeof(QC)+706sizeof(QD)+707sizeof(EmptyAlignedLongLongMemb)+708sizeof(EmptyPackedAlignedLongLongMemb)+7090];710