708 lines · cpp
1// RUN: %clang_cc1 -fno-rtti -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \2// RUN: | FileCheck %s --strict-whitespace3// RUN: %clang_cc1 -fno-rtti -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \4// RUN: | FileCheck %s -check-prefix CHECK-X64 --strict-whitespace5 6extern "C" int printf(const char *fmt, ...);7 8struct __declspec(align(8)) B0 { B0() {printf("B0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };9struct __declspec(align(8)) B1 { B1() {printf("B1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };10struct __declspec(align(8)) B2 { B2() {printf("B2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };11struct __declspec(align(8)) B3 { B3() {printf("B3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };12struct __declspec(align(8)) B4 { B4() {printf("B4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };13 14struct C0 { int a; C0() : a(0xf00000C0) {printf("C0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };15struct C1 { int a; C1() : a(0xf00000C1) {printf("C1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };16struct C2 { int a; C2() : a(0xf00000C2) {printf("C2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };17struct C3 { int a; C3() : a(0xf00000C3) {printf("C3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };18struct C4 { int a; C4() : a(0xf00000C4) {printf("C4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };19 20struct __declspec(align(16)) D0 { D0() {printf("D0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} virtual void f() {} };21struct D1 { D1() {printf("D1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };22struct D2 { int a[8]; D2() {printf("D2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };23 24struct A : virtual B0 {25 int a;26 A() : a(0xf000000A) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}27};28 29// CHECK-LABEL: 0 | struct A{{$}}30// CHECK-NEXT: 0 | (A vbtable pointer)31// CHECK-NEXT: 4 | int a32// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)33// CHECK-NEXT: | [sizeof=8, align=834// CHECK-NEXT: | nvsize=8, nvalign=8]35// CHECK-X64-LABEL: 0 | struct A{{$}}36// CHECK-X64-NEXT: 0 | (A vbtable pointer)37// CHECK-X64-NEXT: 8 | int a38// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)39// CHECK-X64-NEXT: | [sizeof=16, align=840// CHECK-X64-NEXT: | nvsize=16, nvalign=8]41 42struct B : virtual B0 {43 B0 b0;44 int a;45 B() : a(0xf000000B) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}46};47 48// CHECK-LABEL: 0 | struct B{{$}}49// CHECK-NEXT: 0 | (B vbtable pointer)50// CHECK-NEXT: 8 | struct B0 b0 (empty)51// CHECK: 16 | int a52// CHECK-NEXT: 24 | struct B0 (virtual base) (empty)53// CHECK-NEXT: | [sizeof=24, align=854// CHECK-NEXT: | nvsize=24, nvalign=8]55// CHECK-X64-LABEL: 0 | struct B{{$}}56// CHECK-X64-NEXT: 0 | (B vbtable pointer)57// CHECK-X64-NEXT: 8 | struct B0 b0 (empty)58// CHECK-X64: 16 | int a59// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)60// CHECK-X64-NEXT: | [sizeof=24, align=861// CHECK-X64-NEXT: | nvsize=24, nvalign=8]62 63struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {64 int a;65 C() : a(0xf000000C) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}66};67 68// CHECK-LABEL: 0 | struct C{{$}}69// CHECK-NEXT: 0 | (C vbtable pointer)70// CHECK-NEXT: 4 | int a71// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)72// CHECK-NEXT: 16 | struct B1 (virtual base) (empty)73// CHECK-NEXT: 24 | struct B2 (virtual base) (empty)74// CHECK-NEXT: 32 | struct B3 (virtual base) (empty)75// CHECK-NEXT: 40 | struct B4 (virtual base) (empty)76// CHECK-NEXT: | [sizeof=40, align=877// CHECK-NEXT: | nvsize=8, nvalign=8]78// CHECK-X64-LABEL: 0 | struct C{{$}}79// CHECK-X64-NEXT: 0 | (C vbtable pointer)80// CHECK-X64-NEXT: 8 | int a81// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)82// CHECK-X64-NEXT: 24 | struct B1 (virtual base) (empty)83// CHECK-X64-NEXT: 32 | struct B2 (virtual base) (empty)84// CHECK-X64-NEXT: 40 | struct B3 (virtual base) (empty)85// CHECK-X64-NEXT: 48 | struct B4 (virtual base) (empty)86// CHECK-X64-NEXT: | [sizeof=48, align=887// CHECK-X64-NEXT: | nvsize=16, nvalign=8]88 89struct D {90 B0 b0;91 C0 c0;92 C1 c1;93 C2 c2;94 B1 b1;95 int a;96 D() : a(0xf000000D) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}97};98 99// CHECK-LABEL: 0 | struct D{{$}}100// CHECK-NEXT: 0 | struct B0 b0 (empty)101// CHECK: 8 | struct C0 c0102// CHECK-NEXT: 8 | int a103// CHECK: 12 | struct C1 c1104// CHECK-NEXT: 12 | int a105// CHECK: 16 | struct C2 c2106// CHECK-NEXT: 16 | int a107// CHECK: 24 | struct B1 b1 (empty)108// CHECK: 32 | int a109// CHECK-NEXT: | [sizeof=40, align=8110// CHECK-NEXT: | nvsize=40, nvalign=8]111// CHECK-X64-LABEL: 0 | struct D{{$}}112// CHECK-X64-NEXT: 0 | struct B0 b0 (empty)113// CHECK-X64: 8 | struct C0 c0114// CHECK-X64-NEXT: 8 | int a115// CHECK-X64: 12 | struct C1 c1116// CHECK-X64-NEXT: 12 | int a117// CHECK-X64: 16 | struct C2 c2118// CHECK-X64-NEXT: 16 | int a119// CHECK-X64: 24 | struct B1 b1 (empty)120// CHECK-X64: 32 | int a121// CHECK-X64-NEXT: | [sizeof=40, align=8122// CHECK-X64-NEXT: | nvsize=40, nvalign=8]123 124struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {125 int a;126 E() : a(0xf000000E) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}127};128 129// CHECK-LABEL: 0 | struct E{{$}}130// CHECK-NEXT: 0 | (E vbtable pointer)131// CHECK-NEXT: 4 | int a132// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)133// CHECK-NEXT: 8 | struct C0 (virtual base)134// CHECK-NEXT: 8 | int a135// CHECK-NEXT: 12 | struct C1 (virtual base)136// CHECK-NEXT: 12 | int a137// CHECK-NEXT: 16 | struct C2 (virtual base)138// CHECK-NEXT: 16 | int a139// CHECK-NEXT: 24 | struct B1 (virtual base) (empty)140// CHECK-NEXT: | [sizeof=24, align=8141// CHECK-NEXT: | nvsize=8, nvalign=8]142// CHECK-X64-LABEL: 0 | struct E{{$}}143// CHECK-X64-NEXT: 0 | (E vbtable pointer)144// CHECK-X64-NEXT: 8 | int a145// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)146// CHECK-X64-NEXT: 16 | struct C0 (virtual base)147// CHECK-X64-NEXT: 16 | int a148// CHECK-X64-NEXT: 20 | struct C1 (virtual base)149// CHECK-X64-NEXT: 20 | int a150// CHECK-X64-NEXT: 24 | struct C2 (virtual base)151// CHECK-X64-NEXT: 24 | int a152// CHECK-X64-NEXT: 32 | struct B1 (virtual base) (empty)153// CHECK-X64-NEXT: | [sizeof=32, align=8154// CHECK-X64-NEXT: | nvsize=16, nvalign=8]155 156struct F : virtual C0, virtual B0, virtual B1, virtual C1 {157 int a;158 F() : a(0xf000000F) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}159};160 161// CHECK-LABEL: 0 | struct F{{$}}162// CHECK-NEXT: 0 | (F vbtable pointer)163// CHECK-NEXT: 4 | int a164// CHECK-NEXT: 8 | struct C0 (virtual base)165// CHECK-NEXT: 8 | int a166// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)167// CHECK-NEXT: 24 | struct B1 (virtual base) (empty)168// CHECK-NEXT: 24 | struct C1 (virtual base)169// CHECK-NEXT: 24 | int a170// CHECK-NEXT: | [sizeof=32, align=8171// CHECK-NEXT: | nvsize=8, nvalign=8]172// CHECK-X64-LABEL: 0 | struct F{{$}}173// CHECK-X64-NEXT: 0 | (F vbtable pointer)174// CHECK-X64-NEXT: 8 | int a175// CHECK-X64-NEXT: 16 | struct C0 (virtual base)176// CHECK-X64-NEXT: 16 | int a177// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)178// CHECK-X64-NEXT: 32 | struct B1 (virtual base) (empty)179// CHECK-X64-NEXT: 32 | struct C1 (virtual base)180// CHECK-X64-NEXT: 32 | int a181// CHECK-X64-NEXT: | [sizeof=40, align=8182// CHECK-X64-NEXT: | nvsize=16, nvalign=8]183 184struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {185 int a;186 G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}187 virtual void f() {}188};189 190// CHECK-LABEL: 0 | struct G{{$}}191// CHECK-NEXT: 0 | struct D0 (primary base)192// CHECK-NEXT: 0 | (D0 vftable pointer)193// CHECK-NEXT: 4 | (G vbtable pointer)194// CHECK-NEXT: 20 | int a195// CHECK-NEXT: 32 | struct C0 (virtual base)196// CHECK-NEXT: 32 | int a197// CHECK-NEXT: 40 | struct B0 (virtual base) (empty)198// CHECK-NEXT: 56 | struct B1 (virtual base) (empty)199// CHECK-NEXT: 56 | struct C1 (virtual base)200// CHECK-NEXT: 56 | int a201// CHECK-NEXT: | [sizeof=64, align=16202// CHECK-NEXT: | nvsize=32, nvalign=16]203// CHECK-X64-LABEL: 0 | struct G{{$}}204// CHECK-X64-NEXT: 0 | struct D0 (primary base)205// CHECK-X64-NEXT: 0 | (D0 vftable pointer)206// CHECK-X64-NEXT: 8 | (G vbtable pointer)207// CHECK-X64-NEXT: 24 | int a208// CHECK-X64-NEXT: 32 | struct C0 (virtual base)209// CHECK-X64-NEXT: 32 | int a210// CHECK-X64-NEXT: 40 | struct B0 (virtual base) (empty)211// CHECK-X64-NEXT: 56 | struct B1 (virtual base) (empty)212// CHECK-X64-NEXT: 56 | struct C1 (virtual base)213// CHECK-X64-NEXT: 56 | int a214// CHECK-X64-NEXT: | [sizeof=64, align=16215// CHECK-X64-NEXT: | nvsize=32, nvalign=16]216 217struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {218 int a;219 H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}220 virtual void f() {}221};222 223// CHECK-LABEL: 0 | struct H{{$}}224// CHECK-NEXT: 0 | (H vbtable pointer)225// CHECK-NEXT: 4 | int a226// CHECK-NEXT: 8 | struct C0 (virtual base)227// CHECK-NEXT: 8 | int a228// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)229// CHECK-NEXT: 24 | struct B1 (virtual base) (empty)230// CHECK-NEXT: 44 | (vtordisp for vbase D0)231// CHECK-NEXT: 48 | struct D0 (virtual base)232// CHECK-NEXT: 48 | (D0 vftable pointer)233// CHECK-NEXT: 52 | struct C1 (virtual base)234// CHECK-NEXT: 52 | int a235// CHECK-NEXT: | [sizeof=64, align=16236// CHECK-NEXT: | nvsize=8, nvalign=16]237// CHECK-X64-LABEL: 0 | struct H{{$}}238// CHECK-X64-NEXT: 0 | (H vbtable pointer)239// CHECK-X64-NEXT: 8 | int a240// CHECK-X64-NEXT: 16 | struct C0 (virtual base)241// CHECK-X64-NEXT: 16 | int a242// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)243// CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)244// CHECK-X64-NEXT: 60 | (vtordisp for vbase D0)245// CHECK-X64-NEXT: 64 | struct D0 (virtual base)246// CHECK-X64-NEXT: 64 | (D0 vftable pointer)247// CHECK-X64-NEXT: 72 | struct C1 (virtual base)248// CHECK-X64-NEXT: 72 | int a249// CHECK-X64-NEXT: | [sizeof=80, align=16250// CHECK-X64-NEXT: | nvsize=16, nvalign=16]251 252struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {253 __declspec(align(32)) int a;254 I() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}255};256 257// CHECK-LABEL: 0 | struct I{{$}}258// CHECK-NEXT: 0 | (I vbtable pointer)259// CHECK-NEXT: 32 | int a260// CHECK-NEXT: 64 | struct B0 (virtual base) (empty)261// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)262// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)263// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)264// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)265// CHECK-NEXT: | [sizeof=192, align=32266// CHECK-NEXT: | nvsize=64, nvalign=32]267// CHECK-X64-LABEL: 0 | struct I{{$}}268// CHECK-X64-NEXT: 0 | (I vbtable pointer)269// CHECK-X64-NEXT: 32 | int a270// CHECK-X64-NEXT: 64 | struct B0 (virtual base) (empty)271// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)272// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)273// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)274// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)275// CHECK-X64-NEXT: | [sizeof=192, align=32276// CHECK-X64-NEXT: | nvsize=64, nvalign=32]277 278struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {279 int a;280 J() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}281};282 283// CHECK-LABEL: 0 | struct J{{$}}284// CHECK-NEXT: 0 | (J vbtable pointer)285// CHECK-NEXT: 4 | int a286// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)287// CHECK-NEXT: 40 | struct B1 (virtual base) (empty)288// CHECK-NEXT: 72 | struct B2 (virtual base) (empty)289// CHECK-NEXT: 104 | struct B3 (virtual base) (empty)290// CHECK-NEXT: 136 | struct B4 (virtual base) (empty)291// CHECK-NEXT: | [sizeof=160, align=32292// CHECK-NEXT: | nvsize=8, nvalign=32]293// CHECK-X64-LABEL: 0 | struct J{{$}}294// CHECK-X64-NEXT: 0 | (J vbtable pointer)295// CHECK-X64-NEXT: 8 | int a296// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)297// CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)298// CHECK-X64-NEXT: 72 | struct B2 (virtual base) (empty)299// CHECK-X64-NEXT: 104 | struct B3 (virtual base) (empty)300// CHECK-X64-NEXT: 136 | struct B4 (virtual base) (empty)301// CHECK-X64-NEXT: | [sizeof=160, align=32302// CHECK-X64-NEXT: | nvsize=16, nvalign=32]303 304struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {305 __declspec(align(32)) int a;306 K() : a(0xf0000013) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}307};308 309// CHECK-LABEL: 0 | struct K{{$}}310// CHECK-NEXT: 0 | (K vbtable pointer)311// CHECK-NEXT: 32 | int a312// CHECK-NEXT: 64 | struct D1 (virtual base) (empty)313// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)314// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)315// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)316// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)317// CHECK-NEXT: | [sizeof=192, align=32318// CHECK-NEXT: | nvsize=64, nvalign=32]319// CHECK-X64-LABEL: 0 | struct K{{$}}320// CHECK-X64-NEXT: 0 | (K vbtable pointer)321// CHECK-X64-NEXT: 32 | int a322// CHECK-X64-NEXT: 64 | struct D1 (virtual base) (empty)323// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)324// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)325// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)326// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)327// CHECK-X64-NEXT: | [sizeof=192, align=32328// CHECK-X64-NEXT: | nvsize=64, nvalign=32]329 330struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {331 __declspec(align(32)) int a;332 L() : a(0xf0000014) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}333};334 335// CHECK-LABEL: 0 | struct L{{$}}336// CHECK-NEXT: 0 | (L vbtable pointer)337// CHECK-NEXT: 32 | int a338// CHECK-NEXT: 64 | struct B1 (virtual base) (empty)339// CHECK-NEXT: 68 | struct D1 (virtual base) (empty)340// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)341// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)342// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)343// CHECK-NEXT: | [sizeof=192, align=32344// CHECK-NEXT: | nvsize=64, nvalign=32]345// CHECK-X64-LABEL: 0 | struct L{{$}}346// CHECK-X64-NEXT: 0 | (L vbtable pointer)347// CHECK-X64-NEXT: 32 | int a348// CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)349// CHECK-X64-NEXT: 68 | struct D1 (virtual base) (empty)350// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)351// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)352// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)353// CHECK-X64-NEXT: | [sizeof=192, align=32354// CHECK-X64-NEXT: | nvsize=64, nvalign=32]355 356struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {357 __declspec(align(32)) int a;358 M() : a(0xf0000015) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}359};360 361// CHECK-LABEL: 0 | struct M{{$}}362// CHECK-NEXT: 0 | (M vbtable pointer)363// CHECK-NEXT: 32 | int a364// CHECK-NEXT: 64 | struct B1 (virtual base) (empty)365// CHECK-NEXT: 72 | struct B2 (virtual base) (empty)366// CHECK-NEXT: 100 | struct D1 (virtual base) (empty)367// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)368// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)369// CHECK-NEXT: | [sizeof=192, align=32370// CHECK-NEXT: | nvsize=64, nvalign=32]371// CHECK-X64-LABEL: 0 | struct M{{$}}372// CHECK-X64-NEXT: 0 | (M vbtable pointer)373// CHECK-X64-NEXT: 32 | int a374// CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)375// CHECK-X64-NEXT: 72 | struct B2 (virtual base) (empty)376// CHECK-X64-NEXT: 100 | struct D1 (virtual base) (empty)377// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)378// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)379// CHECK-X64-NEXT: | [sizeof=192, align=32380// CHECK-X64-NEXT: | nvsize=64, nvalign=32]381 382struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {383 __declspec(align(32)) int a;384 N() : a(0xf0000016) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}385};386 387// CHECK-LABEL: 0 | struct N{{$}}388// CHECK-NEXT: 0 | (N vbtable pointer)389// CHECK-NEXT: 32 | int a390// CHECK-NEXT: 64 | struct C0 (virtual base)391// CHECK-NEXT: 64 | int a392// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)393// CHECK-NEXT: 100 | struct D1 (virtual base) (empty)394// CHECK-NEXT: 136 | struct B2 (virtual base) (empty)395// CHECK-NEXT: 168 | struct B3 (virtual base) (empty)396// CHECK-NEXT: 200 | struct B4 (virtual base) (empty)397// CHECK-NEXT: | [sizeof=224, align=32398// CHECK-NEXT: | nvsize=64, nvalign=32]399// CHECK-X64-LABEL: 0 | struct N{{$}}400// CHECK-X64-NEXT: 0 | (N vbtable pointer)401// CHECK-X64-NEXT: 32 | int a402// CHECK-X64-NEXT: 64 | struct C0 (virtual base)403// CHECK-X64-NEXT: 64 | int a404// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)405// CHECK-X64-NEXT: 100 | struct D1 (virtual base) (empty)406// CHECK-X64-NEXT: 136 | struct B2 (virtual base) (empty)407// CHECK-X64-NEXT: 168 | struct B3 (virtual base) (empty)408// CHECK-X64-NEXT: 200 | struct B4 (virtual base) (empty)409// CHECK-X64-NEXT: | [sizeof=224, align=32410// CHECK-X64-NEXT: | nvsize=64, nvalign=32]411 412struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {413 __declspec(align(32)) int a;414 O() : a(0xf0000017) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}415};416 417// CHECK-LABEL: 0 | struct O{{$}}418// CHECK-NEXT: 0 | (O vbtable pointer)419// CHECK-NEXT: 32 | int a420// CHECK-NEXT: 64 | struct C0 (virtual base)421// CHECK-NEXT: 64 | int a422// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)423// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)424// CHECK-NEXT: 132 | struct D1 (virtual base) (empty)425// CHECK-NEXT: 168 | struct B3 (virtual base) (empty)426// CHECK-NEXT: 200 | struct B4 (virtual base) (empty)427// CHECK-NEXT: | [sizeof=224, align=32428// CHECK-NEXT: | nvsize=64, nvalign=32]429// CHECK-X64-LABEL: 0 | struct O{{$}}430// CHECK-X64-NEXT: 0 | (O vbtable pointer)431// CHECK-X64-NEXT: 32 | int a432// CHECK-X64-NEXT: 64 | struct C0 (virtual base)433// CHECK-X64-NEXT: 64 | int a434// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)435// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)436// CHECK-X64-NEXT: 132 | struct D1 (virtual base) (empty)437// CHECK-X64-NEXT: 168 | struct B3 (virtual base) (empty)438// CHECK-X64-NEXT: 200 | struct B4 (virtual base) (empty)439// CHECK-X64-NEXT: | [sizeof=224, align=32440// CHECK-X64-NEXT: | nvsize=64, nvalign=32]441 442struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 {443 __declspec(align(32)) int a;444 P() : a(0xf0000018) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}445};446 447// CHECK-LABEL: 0 | struct P{{$}}448// CHECK-NEXT: 0 | (P vbtable pointer)449// CHECK-NEXT: 32 | int a450// CHECK-NEXT: 64 | struct B1 (virtual base) (empty)451// CHECK-NEXT: 64 | struct C0 (virtual base)452// CHECK-NEXT: 64 | int a453// CHECK-NEXT: 68 | struct D1 (virtual base) (empty)454// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)455// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)456// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)457// CHECK-NEXT: | [sizeof=192, align=32458// CHECK-NEXT: | nvsize=64, nvalign=32]459// CHECK-X64-LABEL: 0 | struct P{{$}}460// CHECK-X64-NEXT: 0 | (P vbtable pointer)461// CHECK-X64-NEXT: 32 | int a462// CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)463// CHECK-X64-NEXT: 64 | struct C0 (virtual base)464// CHECK-X64-NEXT: 64 | int a465// CHECK-X64-NEXT: 68 | struct D1 (virtual base) (empty)466// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)467// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)468// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)469// CHECK-X64-NEXT: | [sizeof=192, align=32470// CHECK-X64-NEXT: | nvsize=64, nvalign=32]471 472struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 {473 __declspec(align(32)) int a;474 Q() : a(0xf0000019) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}475};476 477// CHECK-LABEL: 0 | struct Q{{$}}478// CHECK-NEXT: 0 | (Q vbtable pointer)479// CHECK-NEXT: 32 | int a480// CHECK-NEXT: 64 | struct B1 (virtual base) (empty)481// CHECK-NEXT: 64 | struct C0 (virtual base)482// CHECK-NEXT: 64 | int a483// CHECK-NEXT: 72 | struct B2 (virtual base) (empty)484// CHECK-NEXT: 100 | struct D1 (virtual base) (empty)485// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)486// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)487// CHECK-NEXT: | [sizeof=192, align=32488// CHECK-NEXT: | nvsize=64, nvalign=32]489// CHECK-X64-LABEL: 0 | struct Q{{$}}490// CHECK-X64-NEXT: 0 | (Q vbtable pointer)491// CHECK-X64-NEXT: 32 | int a492// CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)493// CHECK-X64-NEXT: 64 | struct C0 (virtual base)494// CHECK-X64-NEXT: 64 | int a495// CHECK-X64-NEXT: 72 | struct B2 (virtual base) (empty)496// CHECK-X64-NEXT: 100 | struct D1 (virtual base) (empty)497// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)498// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)499// CHECK-X64-NEXT: | [sizeof=192, align=32500// CHECK-X64-NEXT: | nvsize=64, nvalign=32]501 502struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 {503 __declspec(align(32)) int a;504 R() : a(0xf0000020) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}505};506 507// CHECK-LABEL: 0 | struct R{{$}}508// CHECK-NEXT: 0 | (R vbtable pointer)509// CHECK-NEXT: 32 | int a510// CHECK-NEXT: 64 | struct B0 (virtual base) (empty)511// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)512// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)513// CHECK-NEXT: 104 | struct C0 (virtual base)514// CHECK-NEXT: 104 | int a515// CHECK-NEXT: 112 | struct B3 (virtual base) (empty)516// CHECK-NEXT: 136 | struct B4 (virtual base) (empty)517// CHECK-NEXT: | [sizeof=160, align=32518// CHECK-NEXT: | nvsize=64, nvalign=32]519// CHECK-X64-LABEL: 0 | struct R{{$}}520// CHECK-X64-NEXT: 0 | (R vbtable pointer)521// CHECK-X64-NEXT: 32 | int a522// CHECK-X64-NEXT: 64 | struct B0 (virtual base) (empty)523// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)524// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)525// CHECK-X64-NEXT: 104 | struct C0 (virtual base)526// CHECK-X64-NEXT: 104 | int a527// CHECK-X64-NEXT: 112 | struct B3 (virtual base) (empty)528// CHECK-X64-NEXT: 136 | struct B4 (virtual base) (empty)529// CHECK-X64-NEXT: | [sizeof=160, align=32530// CHECK-X64-NEXT: | nvsize=64, nvalign=32]531 532struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 {533 __declspec(align(32)) int a;534 S() : a(0xf0000021) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}535};536 537// CHECK-LABEL: 0 | struct S{{$}}538// CHECK-NEXT: 0 | (S vbtable pointer)539// CHECK-NEXT: 32 | int a540// CHECK-NEXT: 64 | struct B0 (virtual base) (empty)541// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)542// CHECK-NEXT: 72 | struct C0 (virtual base)543// CHECK-NEXT: 72 | int a544// CHECK-NEXT: 80 | struct B2 (virtual base) (empty)545// CHECK-NEXT: 104 | struct B3 (virtual base) (empty)546// CHECK-NEXT: 136 | struct B4 (virtual base) (empty)547// CHECK-NEXT: | [sizeof=160, align=32548// CHECK-NEXT: | nvsize=64, nvalign=32]549// CHECK-X64-LABEL: 0 | struct S{{$}}550// CHECK-X64-NEXT: 0 | (S vbtable pointer)551// CHECK-X64-NEXT: 32 | int a552// CHECK-X64-NEXT: 64 | struct B0 (virtual base) (empty)553// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)554// CHECK-X64-NEXT: 72 | struct C0 (virtual base)555// CHECK-X64-NEXT: 72 | int a556// CHECK-X64-NEXT: 80 | struct B2 (virtual base) (empty)557// CHECK-X64-NEXT: 104 | struct B3 (virtual base) (empty)558// CHECK-X64-NEXT: 136 | struct B4 (virtual base) (empty)559// CHECK-X64-NEXT: | [sizeof=160, align=32560// CHECK-X64-NEXT: | nvsize=64, nvalign=32]561 562struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 {563 __declspec(align(16)) int a;564 T() : a(0xf0000022) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}565};566 567// CHECK-LABEL: 0 | struct T{{$}}568// CHECK-NEXT: 0 | (T vbtable pointer)569// CHECK-NEXT: 16 | int a570// CHECK-NEXT: 32 | struct B0 (virtual base) (empty)571// CHECK-NEXT: 40 | struct B1 (virtual base) (empty)572// CHECK-NEXT: 40 | struct C0 (virtual base)573// CHECK-NEXT: 40 | int a574// CHECK-NEXT: 44 | struct D2 (virtual base)575// CHECK-NEXT: 44 | int[8] a576// CHECK-NEXT: 80 | struct B2 (virtual base) (empty)577// CHECK-NEXT: 88 | struct B3 (virtual base) (empty)578// CHECK-NEXT: 104 | struct B4 (virtual base) (empty)579// CHECK-NEXT: | [sizeof=112, align=16580// CHECK-NEXT: | nvsize=32, nvalign=16]581// CHECK-X64-LABEL: 0 | struct T{{$}}582// CHECK-X64-NEXT: 0 | (T vbtable pointer)583// CHECK-X64-NEXT: 16 | int a584// CHECK-X64-NEXT: 32 | struct B0 (virtual base) (empty)585// CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)586// CHECK-X64-NEXT: 40 | struct C0 (virtual base)587// CHECK-X64-NEXT: 40 | int a588// CHECK-X64-NEXT: 44 | struct D2 (virtual base)589// CHECK-X64-NEXT: 44 | int[8] a590// CHECK-X64-NEXT: 80 | struct B2 (virtual base) (empty)591// CHECK-X64-NEXT: 88 | struct B3 (virtual base) (empty)592// CHECK-X64-NEXT: 104 | struct B4 (virtual base) (empty)593// CHECK-X64-NEXT: | [sizeof=112, align=16594// CHECK-X64-NEXT: | nvsize=32, nvalign=16]595 596struct __declspec(align(32)) U : virtual B0, virtual B1 {597 int a;598 U() : a(0xf0000023) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}599};600 601// CHECK-LABEL: 0 | struct U{{$}}602// CHECK-NEXT: 0 | (U vbtable pointer)603// CHECK-NEXT: 4 | int a604// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)605// CHECK-NEXT: 40 | struct B1 (virtual base) (empty)606// CHECK-NEXT: | [sizeof=64, align=32607// CHECK-NEXT: | nvsize=8, nvalign=32]608// CHECK-X64-LABEL: 0 | struct U{{$}}609// CHECK-X64-NEXT: 0 | (U vbtable pointer)610// CHECK-X64-NEXT: 8 | int a611// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)612// CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)613// CHECK-X64-NEXT: | [sizeof=64, align=32614// CHECK-X64-NEXT: | nvsize=16, nvalign=32]615 616struct __declspec(align(32)) V : virtual D1 {617 int a;618 V() : a(0xf0000024) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}619};620 621// CHECK-LABEL: 0 | struct V{{$}}622// CHECK-NEXT: 0 | (V vbtable pointer)623// CHECK-NEXT: 4 | int a624// CHECK-NEXT: 8 | struct D1 (virtual base) (empty)625// CHECK-NEXT: | [sizeof=32, align=32626// CHECK-NEXT: | nvsize=8, nvalign=32]627// CHECK-X64-LABEL: 0 | struct V{{$}}628// CHECK-X64-NEXT: 0 | (V vbtable pointer)629// CHECK-X64-NEXT: 8 | int a630// CHECK-X64-NEXT: 16 | struct D1 (virtual base) (empty)631// CHECK-X64-NEXT: | [sizeof=32, align=32632// CHECK-X64-NEXT: | nvsize=16, nvalign=32]633 634struct T0 {};635struct T1 : T0 { char a; };636struct T3 : virtual T1, virtual T0 { long long a; };637 638// CHECK-LABEL: 0 | struct T3{{$}}639// CHECK-NEXT: 0 | (T3 vbtable pointer)640// CHECK-NEXT: 8 | long long a641// CHECK-NEXT: 16 | struct T1 (virtual base)642// CHECK-NEXT: 16 | struct T0 (base) (empty)643// CHECK-NEXT: 16 | char a644// CHECK-NEXT: 24 | struct T0 (virtual base) (empty)645// CHECK-NEXT: | [sizeof=24, align=8646// CHECK-NEXT: | nvsize=16, nvalign=8]647// CHECK-X64-LABEL: 0 | struct T3{{$}}648// CHECK-X64-NEXT: 0 | (T3 vbtable pointer)649// CHECK-X64-NEXT: 8 | long long a650// CHECK-X64-NEXT: 16 | struct T1 (virtual base)651// CHECK-X64-NEXT: 16 | struct T0 (base) (empty)652// CHECK-X64-NEXT: 16 | char a653// CHECK-X64-NEXT: 24 | struct T0 (virtual base) (empty)654// CHECK-X64-NEXT: | [sizeof=24, align=8655// CHECK-X64-NEXT: | nvsize=16, nvalign=8]656 657struct Q0A {};658struct Q0B { char Q0BField; };659struct Q0C : virtual Q0A, virtual Q0B { char Q0CField; };660struct Q0D : Q0C, Q0A {};661 662// CHECK-LABEL: 0 | struct Q0D{{$}}663// CHECK-NEXT: 0 | struct Q0C (base)664// CHECK-NEXT: 0 | (Q0C vbtable pointer)665// CHECK-NEXT: 4 | char Q0CField666// CHECK-NEXT: 8 | struct Q0A (base) (empty)667// CHECK-NEXT: 8 | struct Q0A (virtual base) (empty)668// CHECK-NEXT: 8 | struct Q0B (virtual base)669// CHECK-NEXT: 8 | char Q0BField670// CHECK-NEXT: | [sizeof=9, align=4671// CHECK-NEXT: | nvsize=8, nvalign=4]672// CHECK-X64-LABEL: 0 | struct Q0D{{$}}673// CHECK-X64-NEXT: 0 | struct Q0C (base)674// CHECK-X64-NEXT: 0 | (Q0C vbtable pointer)675// CHECK-X64-NEXT: 8 | char Q0CField676// CHECK-X64-NEXT: 16 | struct Q0A (base) (empty)677// CHECK-X64-NEXT: 16 | struct Q0A (virtual base) (empty)678// CHECK-X64-NEXT: 16 | struct Q0B (virtual base)679// CHECK-X64-NEXT: 16 | char Q0BField680// CHECK-X64-NEXT: | [sizeof=24, align=8681// CHECK-X64-NEXT: | nvsize=16, nvalign=8]682 683int a[684sizeof(A)+685sizeof(B)+686sizeof(C)+687sizeof(D)+688sizeof(E)+689sizeof(F)+690sizeof(G)+691sizeof(H)+692sizeof(I)+693sizeof(J)+694sizeof(K)+695sizeof(L)+696sizeof(M)+697sizeof(N)+698sizeof(O)+699sizeof(P)+700sizeof(Q)+701sizeof(R)+702sizeof(S)+703sizeof(T)+704sizeof(U)+705sizeof(V)+706sizeof(T3)+707sizeof(Q0D)];708