brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.0 KiB · 98eba93 Raw
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