807 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 A4 {9 int a;10 A4() : a(0xf00000a4) {}11};12 13struct B4 {14 int a;15 B4() : a(0xf00000b4) {}16};17 18struct C4 {19 int a;20 C4() : a(0xf00000c4) {}21 virtual void f() {printf("C4");}22};23 24struct A16 {25 __declspec(align(16)) int a;26 A16() : a(0xf0000a16) {}27};28 29struct C16 {30 __declspec(align(16)) int a;31 C16() : a(0xf0000c16) {}32 virtual void f() {printf("C16");}33};34 35struct TestF3 : A4, virtual C16 {36 int a;37 TestF3() : a(0xf00000f3) {}38};39 40// CHECK-LABEL: 0 | struct TestF3{{$}}41// CHECK-NEXT: 0 | struct A4 (base)42// CHECK-NEXT: 0 | int a43// CHECK-NEXT: 4 | (TestF3 vbtable pointer)44// CHECK-NEXT: 8 | int a45// CHECK-NEXT: 16 | struct C16 (virtual base)46// CHECK-NEXT: 16 | (C16 vftable pointer)47// CHECK-NEXT: 32 | int a48// CHECK-NEXT: | [sizeof=48, align=1649// CHECK-NEXT: | nvsize=12, nvalign=16]50// CHECK-X64-LABEL: 0 | struct TestF3{{$}}51// CHECK-X64-NEXT: 0 | struct A4 (base)52// CHECK-X64-NEXT: 0 | int a53// CHECK-X64-NEXT: 8 | (TestF3 vbtable pointer)54// CHECK-X64-NEXT: 16 | int a55// CHECK-X64-NEXT: 32 | struct C16 (virtual base)56// CHECK-X64-NEXT: 32 | (C16 vftable pointer)57// CHECK-X64-NEXT: 48 | int a58// CHECK-X64-NEXT: | [sizeof=64, align=1659// CHECK-X64-NEXT: | nvsize=24, nvalign=16]60 61struct TestF7 : A4, virtual C16 {62 int a;63 TestF7() : a(0xf00000f7) {}64 virtual void f() { printf("F7"); }65};66 67// CHECK-LABEL: 0 | struct TestF7{{$}}68// CHECK-NEXT: 0 | struct A4 (base)69// CHECK-NEXT: 0 | int a70// CHECK-NEXT: 4 | (TestF7 vbtable pointer)71// CHECK-NEXT: 8 | int a72// CHECK-NEXT: 28 | (vtordisp for vbase C16)73// CHECK-NEXT: 32 | struct C16 (virtual base)74// CHECK-NEXT: 32 | (C16 vftable pointer)75// CHECK-NEXT: 48 | int a76// CHECK-NEXT: | [sizeof=64, align=1677// CHECK-NEXT: | nvsize=12, nvalign=16]78// CHECK-X64-LABEL: 0 | struct TestF7{{$}}79// CHECK-X64-NEXT: 0 | struct A4 (base)80// CHECK-X64-NEXT: 0 | int a81// CHECK-X64-NEXT: 8 | (TestF7 vbtable pointer)82// CHECK-X64-NEXT: 16 | int a83// CHECK-X64-NEXT: 44 | (vtordisp for vbase C16)84// CHECK-X64-NEXT: 48 | struct C16 (virtual base)85// CHECK-X64-NEXT: 48 | (C16 vftable pointer)86// CHECK-X64-NEXT: 64 | int a87// CHECK-X64-NEXT: | [sizeof=80, align=1688// CHECK-X64-NEXT: | nvsize=24, nvalign=16]89 90struct TestF9 : A4, virtual C16 {91 int a;92 TestF9() : a(0xf00000f9) {}93 virtual void g() { printf("F9"); }94};95 96// CHECK-LABEL: 0 | struct TestF9{{$}}97// CHECK-NEXT: 0 | (TestF9 vftable pointer)98// CHECK-NEXT: 4 | struct A4 (base)99// CHECK-NEXT: 4 | int a100// CHECK-NEXT: 8 | (TestF9 vbtable pointer)101// CHECK-NEXT: 12 | int a102// CHECK-NEXT: 16 | struct C16 (virtual base)103// CHECK-NEXT: 16 | (C16 vftable pointer)104// CHECK-NEXT: 32 | int a105// CHECK-NEXT: | [sizeof=48, align=16106// CHECK-NEXT: | nvsize=16, nvalign=16]107// CHECK-X64-LABEL: 0 | struct TestF9{{$}}108// CHECK-X64-NEXT: 0 | (TestF9 vftable pointer)109// CHECK-X64-NEXT: 8 | struct A4 (base)110// CHECK-X64-NEXT: 8 | int a111// CHECK-X64-NEXT: 16 | (TestF9 vbtable pointer)112// CHECK-X64-NEXT: 24 | int a113// CHECK-X64-NEXT: 32 | struct C16 (virtual base)114// CHECK-X64-NEXT: 32 | (C16 vftable pointer)115// CHECK-X64-NEXT: 48 | int a116// CHECK-X64-NEXT: | [sizeof=64, align=16117// CHECK-X64-NEXT: | nvsize=32, nvalign=16]118 119struct TestFB : A16, virtual C16 {120 int a;121 TestFB() : a(0xf00000fb) {}122 virtual void g() { printf("Fb"); }123};124 125// CHECK-LABEL: 0 | struct TestFB{{$}}126// CHECK-NEXT: 0 | (TestFB vftable pointer)127// CHECK-NEXT: 16 | struct A16 (base)128// CHECK-NEXT: 16 | int a129// CHECK-NEXT: 32 | (TestFB vbtable pointer)130// CHECK-NEXT: 48 | int a131// CHECK-NEXT: 64 | struct C16 (virtual base)132// CHECK-NEXT: 64 | (C16 vftable pointer)133// CHECK-NEXT: 80 | int a134// CHECK-NEXT: | [sizeof=96, align=16135// CHECK-NEXT: | nvsize=64, nvalign=16]136// CHECK-X64-LABEL: 0 | struct TestFB{{$}}137// CHECK-X64-NEXT: 0 | (TestFB vftable pointer)138// CHECK-X64-NEXT: 16 | struct A16 (base)139// CHECK-X64-NEXT: 16 | int a140// CHECK-X64-NEXT: 32 | (TestFB vbtable pointer)141// CHECK-X64-NEXT: 48 | int a142// CHECK-X64-NEXT: 64 | struct C16 (virtual base)143// CHECK-X64-NEXT: 64 | (C16 vftable pointer)144// CHECK-X64-NEXT: 80 | int a145// CHECK-X64-NEXT: | [sizeof=96, align=16146// CHECK-X64-NEXT: | nvsize=64, nvalign=16]147 148struct TestF0 : A4, virtual B4 {149 int a;150 TestF0() : a(0xf00000F0) {}151};152 153// CHECK-LABEL: 0 | struct TestF0{{$}}154// CHECK-NEXT: 0 | struct A4 (base)155// CHECK-NEXT: 0 | int a156// CHECK-NEXT: 4 | (TestF0 vbtable pointer)157// CHECK-NEXT: 8 | int a158// CHECK-NEXT: 12 | struct B4 (virtual base)159// CHECK-NEXT: 12 | int a160// CHECK-NEXT: | [sizeof=16, align=4161// CHECK-NEXT: | nvsize=12, nvalign=4]162// CHECK-X64-LABEL: 0 | struct TestF0{{$}}163// CHECK-X64-NEXT: 0 | struct A4 (base)164// CHECK-X64-NEXT: 0 | int a165// CHECK-X64-NEXT: 8 | (TestF0 vbtable pointer)166// CHECK-X64-NEXT: 16 | int a167// CHECK-X64-NEXT: 24 | struct B4 (virtual base)168// CHECK-X64-NEXT: 24 | int a169// CHECK-X64-NEXT: | [sizeof=32, align=8170// CHECK-X64-NEXT: | nvsize=24, nvalign=8]171 172struct TestF1 : A4, virtual A16 {173 int a;174 TestF1() : a(0xf00000f1) {}175};176 177// CHECK-LABEL: 0 | struct TestF1{{$}}178// CHECK-NEXT: 0 | struct A4 (base)179// CHECK-NEXT: 0 | int a180// CHECK-NEXT: 4 | (TestF1 vbtable pointer)181// CHECK-NEXT: 8 | int a182// CHECK-NEXT: 16 | struct A16 (virtual base)183// CHECK-NEXT: 16 | int a184// CHECK-NEXT: | [sizeof=32, align=16185// CHECK-NEXT: | nvsize=12, nvalign=16]186// CHECK-X64-LABEL: 0 | struct TestF1{{$}}187// CHECK-X64-NEXT: 0 | struct A4 (base)188// CHECK-X64-NEXT: 0 | int a189// CHECK-X64-NEXT: 8 | (TestF1 vbtable pointer)190// CHECK-X64-NEXT: 16 | int a191// CHECK-X64-NEXT: 32 | struct A16 (virtual base)192// CHECK-X64-NEXT: 32 | int a193// CHECK-X64-NEXT: | [sizeof=48, align=16194// CHECK-X64-NEXT: | nvsize=24, nvalign=16]195 196struct TestF2 : A4, virtual C4 {197 int a;198 TestF2() : a(0xf00000f2) {}199};200 201// CHECK-LABEL: 0 | struct TestF2{{$}}202// CHECK-NEXT: 0 | struct A4 (base)203// CHECK-NEXT: 0 | int a204// CHECK-NEXT: 4 | (TestF2 vbtable pointer)205// CHECK-NEXT: 8 | int a206// CHECK-NEXT: 12 | struct C4 (virtual base)207// CHECK-NEXT: 12 | (C4 vftable pointer)208// CHECK-NEXT: 16 | int a209// CHECK-NEXT: | [sizeof=20, align=4210// CHECK-NEXT: | nvsize=12, nvalign=4]211// CHECK-X64-LABEL: 0 | struct TestF2{{$}}212// CHECK-X64-NEXT: 0 | struct A4 (base)213// CHECK-X64-NEXT: 0 | int a214// CHECK-X64-NEXT: 8 | (TestF2 vbtable pointer)215// CHECK-X64-NEXT: 16 | int a216// CHECK-X64-NEXT: 24 | struct C4 (virtual base)217// CHECK-X64-NEXT: 24 | (C4 vftable pointer)218// CHECK-X64-NEXT: 32 | int a219// CHECK-X64-NEXT: | [sizeof=40, align=8220// CHECK-X64-NEXT: | nvsize=24, nvalign=8]221 222struct TestF4 : TestF3, A4 {223 int a;224 TestF4() : a(0xf00000f4) {}225};226 227// CHECK-LABEL: 0 | struct TestF4{{$}}228// CHECK-NEXT: 0 | struct TestF3 (base)229// CHECK-NEXT: 0 | struct A4 (base)230// CHECK-NEXT: 0 | int a231// CHECK-NEXT: 4 | (TestF3 vbtable pointer)232// CHECK-NEXT: 8 | int a233// CHECK-NEXT: 12 | struct A4 (base)234// CHECK-NEXT: 12 | int a235// CHECK-NEXT: 16 | int a236// CHECK-NEXT: 32 | struct C16 (virtual base)237// CHECK-NEXT: 32 | (C16 vftable pointer)238// CHECK-NEXT: 48 | int a239// CHECK-NEXT: | [sizeof=64, align=16240// CHECK-NEXT: | nvsize=32, nvalign=16]241// CHECK-X64-LABEL: 0 | struct TestF4{{$}}242// CHECK-X64-NEXT: 0 | struct TestF3 (base)243// CHECK-X64-NEXT: 0 | struct A4 (base)244// CHECK-X64-NEXT: 0 | int a245// CHECK-X64-NEXT: 8 | (TestF3 vbtable pointer)246// CHECK-X64-NEXT: 16 | int a247// CHECK-X64-NEXT: 24 | struct A4 (base)248// CHECK-X64-NEXT: 24 | int a249// CHECK-X64-NEXT: 28 | int a250// CHECK-X64-NEXT: 32 | struct C16 (virtual base)251// CHECK-X64-NEXT: 32 | (C16 vftable pointer)252// CHECK-X64-NEXT: 48 | int a253// CHECK-X64-NEXT: | [sizeof=64, align=16254// CHECK-X64-NEXT: | nvsize=32, nvalign=16]255 256struct TestF5 : TestF3, A4 {257 int a;258 TestF5() : a(0xf00000f5) {}259 virtual void g() {printf("F5");}260};261 262// CHECK-LABEL: 0 | struct TestF5{{$}}263// CHECK-NEXT: 0 | (TestF5 vftable pointer)264// CHECK-NEXT: 16 | struct TestF3 (base)265// CHECK-NEXT: 16 | struct A4 (base)266// CHECK-NEXT: 16 | int a267// CHECK-NEXT: 20 | (TestF3 vbtable pointer)268// CHECK-NEXT: 24 | int a269// CHECK-NEXT: 28 | struct A4 (base)270// CHECK-NEXT: 28 | int a271// CHECK-NEXT: 32 | int a272// CHECK-NEXT: 48 | struct C16 (virtual base)273// CHECK-NEXT: 48 | (C16 vftable pointer)274// CHECK-NEXT: 64 | int a275// CHECK-NEXT: | [sizeof=80, align=16276// CHECK-NEXT: | nvsize=48, nvalign=16]277// CHECK-X64-LABEL: 0 | struct TestF5{{$}}278// CHECK-X64-NEXT: 0 | (TestF5 vftable pointer)279// CHECK-X64-NEXT: 16 | struct TestF3 (base)280// CHECK-X64-NEXT: 16 | struct A4 (base)281// CHECK-X64-NEXT: 16 | int a282// CHECK-X64-NEXT: 24 | (TestF3 vbtable pointer)283// CHECK-X64-NEXT: 32 | int a284// CHECK-X64-NEXT: 40 | struct A4 (base)285// CHECK-X64-NEXT: 40 | int a286// CHECK-X64-NEXT: 44 | int a287// CHECK-X64-NEXT: 48 | struct C16 (virtual base)288// CHECK-X64-NEXT: 48 | (C16 vftable pointer)289// CHECK-X64-NEXT: 64 | int a290// CHECK-X64-NEXT: | [sizeof=80, align=16291// CHECK-X64-NEXT: | nvsize=48, nvalign=16]292 293struct TestF6 : TestF3, A4 {294 int a;295 TestF6() : a(0xf00000f6) {}296 virtual void f() {printf("F6");}297};298 299// CHECK-LABEL: 0 | struct TestF6{{$}}300// CHECK-NEXT: 0 | struct TestF3 (base)301// CHECK-NEXT: 0 | struct A4 (base)302// CHECK-NEXT: 0 | int a303// CHECK-NEXT: 4 | (TestF3 vbtable pointer)304// CHECK-NEXT: 8 | int a305// CHECK-NEXT: 12 | struct A4 (base)306// CHECK-NEXT: 12 | int a307// CHECK-NEXT: 16 | int a308// CHECK-NEXT: 44 | (vtordisp for vbase C16)309// CHECK-NEXT: 48 | struct C16 (virtual base)310// CHECK-NEXT: 48 | (C16 vftable pointer)311// CHECK-NEXT: 64 | int a312// CHECK-NEXT: | [sizeof=80, align=16313// CHECK-NEXT: | nvsize=32, nvalign=16]314// CHECK-X64-LABEL: 0 | struct TestF6{{$}}315// CHECK-X64-NEXT: 0 | struct TestF3 (base)316// CHECK-X64-NEXT: 0 | struct A4 (base)317// CHECK-X64-NEXT: 0 | int a318// CHECK-X64-NEXT: 8 | (TestF3 vbtable pointer)319// CHECK-X64-NEXT: 16 | int a320// CHECK-X64-NEXT: 24 | struct A4 (base)321// CHECK-X64-NEXT: 24 | int a322// CHECK-X64-NEXT: 28 | int a323// CHECK-X64-NEXT: 44 | (vtordisp for vbase C16)324// CHECK-X64-NEXT: 48 | struct C16 (virtual base)325// CHECK-X64-NEXT: 48 | (C16 vftable pointer)326// CHECK-X64-NEXT: 64 | int a327// CHECK-X64-NEXT: | [sizeof=80, align=16328// CHECK-X64-NEXT: | nvsize=32, nvalign=16]329 330struct TestF8 : TestF7, A4 {331 int a;332 TestF8() : a(0xf00000f8) {}333 virtual void f() {printf("F8");}334};335 336// CHECK-LABEL: 0 | struct TestF8{{$}}337// CHECK-NEXT: 0 | struct TestF7 (base)338// CHECK-NEXT: 0 | struct A4 (base)339// CHECK-NEXT: 0 | int a340// CHECK-NEXT: 4 | (TestF7 vbtable pointer)341// CHECK-NEXT: 8 | int a342// CHECK-NEXT: 12 | struct A4 (base)343// CHECK-NEXT: 12 | int a344// CHECK-NEXT: 16 | int a345// CHECK-NEXT: 44 | (vtordisp for vbase C16)346// CHECK-NEXT: 48 | struct C16 (virtual base)347// CHECK-NEXT: 48 | (C16 vftable pointer)348// CHECK-NEXT: 64 | int a349// CHECK-NEXT: | [sizeof=80, align=16350// CHECK-NEXT: | nvsize=32, nvalign=16]351// CHECK-X64-LABEL: 0 | struct TestF8{{$}}352// CHECK-X64-NEXT: 0 | struct TestF7 (base)353// CHECK-X64-NEXT: 0 | struct A4 (base)354// CHECK-X64-NEXT: 0 | int a355// CHECK-X64-NEXT: 8 | (TestF7 vbtable pointer)356// CHECK-X64-NEXT: 16 | int a357// CHECK-X64-NEXT: 24 | struct A4 (base)358// CHECK-X64-NEXT: 24 | int a359// CHECK-X64-NEXT: 28 | int a360// CHECK-X64-NEXT: 44 | (vtordisp for vbase C16)361// CHECK-X64-NEXT: 48 | struct C16 (virtual base)362// CHECK-X64-NEXT: 48 | (C16 vftable pointer)363// CHECK-X64-NEXT: 64 | int a364// CHECK-X64-NEXT: | [sizeof=80, align=16365// CHECK-X64-NEXT: | nvsize=32, nvalign=16]366 367struct TestFA : TestF9, A4 {368 int a;369 TestFA() : a(0xf00000fa) {}370 virtual void g() {printf("FA");}371};372 373// CHECK-LABEL: 0 | struct TestFA{{$}}374// CHECK-NEXT: 0 | struct TestF9 (primary base)375// CHECK-NEXT: 0 | (TestF9 vftable pointer)376// CHECK-NEXT: 4 | struct A4 (base)377// CHECK-NEXT: 4 | int a378// CHECK-NEXT: 8 | (TestF9 vbtable pointer)379// CHECK-NEXT: 12 | int a380// CHECK-NEXT: 16 | struct A4 (base)381// CHECK-NEXT: 16 | int a382// CHECK-NEXT: 20 | int a383// CHECK-NEXT: 32 | struct C16 (virtual base)384// CHECK-NEXT: 32 | (C16 vftable pointer)385// CHECK-NEXT: 48 | int a386// CHECK-NEXT: | [sizeof=64, align=16387// CHECK-NEXT: | nvsize=32, nvalign=16]388// CHECK-X64-LABEL: 0 | struct TestFA{{$}}389// CHECK-X64-NEXT: 0 | struct TestF9 (primary base)390// CHECK-X64-NEXT: 0 | (TestF9 vftable pointer)391// CHECK-X64-NEXT: 8 | struct A4 (base)392// CHECK-X64-NEXT: 8 | int a393// CHECK-X64-NEXT: 16 | (TestF9 vbtable pointer)394// CHECK-X64-NEXT: 24 | int a395// CHECK-X64-NEXT: 32 | struct A4 (base)396// CHECK-X64-NEXT: 32 | int a397// CHECK-X64-NEXT: 36 | int a398// CHECK-X64-NEXT: 48 | struct C16 (virtual base)399// CHECK-X64-NEXT: 48 | (C16 vftable pointer)400// CHECK-X64-NEXT: 64 | int a401// CHECK-X64-NEXT: | [sizeof=80, align=16402// CHECK-X64-NEXT: | nvsize=48, nvalign=16]403 404struct TestFC : TestFB, A4 {405 int a;406 TestFC() : a(0xf00000fc) {}407 virtual void g() {printf("FC");}408};409 410// CHECK-LABEL: 0 | struct TestFC{{$}}411// CHECK-NEXT: 0 | struct TestFB (primary base)412// CHECK-NEXT: 0 | (TestFB vftable pointer)413// CHECK-NEXT: 16 | struct A16 (base)414// CHECK-NEXT: 16 | int a415// CHECK-NEXT: 32 | (TestFB vbtable pointer)416// CHECK-NEXT: 48 | int a417// CHECK-NEXT: 64 | struct A4 (base)418// CHECK-NEXT: 64 | int a419// CHECK-NEXT: 68 | int a420// CHECK-NEXT: 80 | struct C16 (virtual base)421// CHECK-NEXT: 80 | (C16 vftable pointer)422// CHECK-NEXT: 96 | int a423// CHECK-NEXT: | [sizeof=112, align=16424// CHECK-NEXT: | nvsize=80, nvalign=16]425// CHECK-X64-LABEL: 0 | struct TestFC{{$}}426// CHECK-X64-NEXT: 0 | struct TestFB (primary base)427// CHECK-X64-NEXT: 0 | (TestFB vftable pointer)428// CHECK-X64-NEXT: 16 | struct A16 (base)429// CHECK-X64-NEXT: 16 | int a430// CHECK-X64-NEXT: 32 | (TestFB vbtable pointer)431// CHECK-X64-NEXT: 48 | int a432// CHECK-X64-NEXT: 64 | struct A4 (base)433// CHECK-X64-NEXT: 64 | int a434// CHECK-X64-NEXT: 68 | int a435// CHECK-X64-NEXT: 80 | struct C16 (virtual base)436// CHECK-X64-NEXT: 80 | (C16 vftable pointer)437// CHECK-X64-NEXT: 96 | int a438// CHECK-X64-NEXT: | [sizeof=112, align=16439// CHECK-X64-NEXT: | nvsize=80, nvalign=16]440 441struct A16f {442 __declspec(align(16)) int a;443 A16f() : a(0xf0000a16) {}444 virtual void f() {printf("A16f");}445};446 447struct Y { char y; Y() : y(0xaa) {} };448struct X : virtual A16f {};449 450struct B : A4, Y, X {451 int a;452 B() : a(0xf000000b) {}453};454 455struct F0 : A4, B {456 int a;457 F0() : a(0xf00000f0) {}458 virtual void g() {printf("F0");}459};460 461// CHECK-LABEL: 0 | struct F0{{$}}462// CHECK-NEXT: 0 | (F0 vftable pointer)463// CHECK-NEXT: 16 | struct A4 (base)464// CHECK-NEXT: 16 | int a465// CHECK-NEXT: 32 | struct B (base)466// CHECK-NEXT: 32 | struct A4 (base)467// CHECK-NEXT: 32 | int a468// CHECK-NEXT: 36 | struct Y (base)469// CHECK-NEXT: 36 | char y470// CHECK-NEXT: 48 | struct X (base)471// CHECK-NEXT: 48 | (X vbtable pointer)472// CHECK-NEXT: 52 | int a473// CHECK-NEXT: 64 | int a474// CHECK-NEXT: 80 | struct A16f (virtual base)475// CHECK-NEXT: 80 | (A16f vftable pointer)476// CHECK-NEXT: 96 | int a477// CHECK-NEXT: | [sizeof=112, align=16478// CHECK-NEXT: | nvsize=80, nvalign=16]479// CHECK-X64-LABEL: 0 | struct F0{{$}}480// CHECK-X64-NEXT: 0 | (F0 vftable pointer)481// CHECK-X64-NEXT: 16 | struct A4 (base)482// CHECK-X64-NEXT: 16 | int a483// CHECK-X64-NEXT: 32 | struct B (base)484// CHECK-X64-NEXT: 32 | struct A4 (base)485// CHECK-X64-NEXT: 32 | int a486// CHECK-X64-NEXT: 36 | struct Y (base)487// CHECK-X64-NEXT: 36 | char y488// CHECK-X64-NEXT: 48 | struct X (base)489// CHECK-X64-NEXT: 48 | (X vbtable pointer)490// CHECK-X64-NEXT: 56 | int a491// CHECK-X64-NEXT: 64 | int a492// CHECK-X64-NEXT: 80 | struct A16f (virtual base)493// CHECK-X64-NEXT: 80 | (A16f vftable pointer)494// CHECK-X64-NEXT: 96 | int a495// CHECK-X64-NEXT: | [sizeof=112, align=16496// CHECK-X64-NEXT: | nvsize=80, nvalign=16]497 498struct F1 : B, A4 {499 int a;500 F1() : a(0xf00000f1) {}501 virtual void g() {printf("F1");}502};503 504// CHECK-LABEL: 0 | struct F1{{$}}505// CHECK-NEXT: 0 | (F1 vftable pointer)506// CHECK-NEXT: 16 | struct B (base)507// CHECK-NEXT: 16 | struct A4 (base)508// CHECK-NEXT: 16 | int a509// CHECK-NEXT: 20 | struct Y (base)510// CHECK-NEXT: 20 | char y511// CHECK-NEXT: 32 | struct X (base)512// CHECK-NEXT: 32 | (X vbtable pointer)513// CHECK-NEXT: 36 | int a514// CHECK-NEXT: 48 | struct A4 (base)515// CHECK-NEXT: 48 | int a516// CHECK-NEXT: 52 | int a517// CHECK-NEXT: 64 | struct A16f (virtual base)518// CHECK-NEXT: 64 | (A16f vftable pointer)519// CHECK-NEXT: 80 | int a520// CHECK-NEXT: | [sizeof=96, align=16521// CHECK-NEXT: | nvsize=64, nvalign=16]522// CHECK-X64-LABEL: 0 | struct F1{{$}}523// CHECK-X64-NEXT: 0 | (F1 vftable pointer)524// CHECK-X64-NEXT: 16 | struct B (base)525// CHECK-X64-NEXT: 16 | struct A4 (base)526// CHECK-X64-NEXT: 16 | int a527// CHECK-X64-NEXT: 20 | struct Y (base)528// CHECK-X64-NEXT: 20 | char y529// CHECK-X64-NEXT: 32 | struct X (base)530// CHECK-X64-NEXT: 32 | (X vbtable pointer)531// CHECK-X64-NEXT: 40 | int a532// CHECK-X64-NEXT: 48 | struct A4 (base)533// CHECK-X64-NEXT: 48 | int a534// CHECK-X64-NEXT: 52 | int a535// CHECK-X64-NEXT: 64 | struct A16f (virtual base)536// CHECK-X64-NEXT: 64 | (A16f vftable pointer)537// CHECK-X64-NEXT: 80 | int a538// CHECK-X64-NEXT: | [sizeof=96, align=16539// CHECK-X64-NEXT: | nvsize=64, nvalign=16]540 541struct F2 : A4, virtual A16f {542 int a;543 F2() : a(0xf00000f2) {}544 virtual void g() {printf("F2");}545};546 547// CHECK-LABEL: 0 | struct F2{{$}}548// CHECK-NEXT: 0 | (F2 vftable pointer)549// CHECK-NEXT: 4 | struct A4 (base)550// CHECK-NEXT: 4 | int a551// CHECK-NEXT: 8 | (F2 vbtable pointer)552// CHECK-NEXT: 12 | int a553// CHECK-NEXT: 16 | struct A16f (virtual base)554// CHECK-NEXT: 16 | (A16f vftable pointer)555// CHECK-NEXT: 32 | int a556// CHECK-NEXT: | [sizeof=48, align=16557// CHECK-NEXT: | nvsize=16, nvalign=16]558// CHECK-X64-LABEL: 0 | struct F2{{$}}559// CHECK-X64-NEXT: 0 | (F2 vftable pointer)560// CHECK-X64-NEXT: 8 | struct A4 (base)561// CHECK-X64-NEXT: 8 | int a562// CHECK-X64-NEXT: 16 | (F2 vbtable pointer)563// CHECK-X64-NEXT: 24 | int a564// CHECK-X64-NEXT: 32 | struct A16f (virtual base)565// CHECK-X64-NEXT: 32 | (A16f vftable pointer)566// CHECK-X64-NEXT: 48 | int a567// CHECK-X64-NEXT: | [sizeof=64, align=16568// CHECK-X64-NEXT: | nvsize=32, nvalign=16]569 570struct F3 : A4, virtual A16f {571 __declspec(align(16)) int a;572 F3() : a(0xf00000f3) {}573 virtual void g() {printf("F3");}574};575 576// CHECK-LABEL: 0 | struct F3{{$}}577// CHECK-NEXT: 0 | (F3 vftable pointer)578// CHECK-NEXT: 16 | struct A4 (base)579// CHECK-NEXT: 16 | int a580// CHECK-NEXT: 20 | (F3 vbtable pointer)581// CHECK-NEXT: 48 | int a582// CHECK-NEXT: 64 | struct A16f (virtual base)583// CHECK-NEXT: 64 | (A16f vftable pointer)584// CHECK-NEXT: 80 | int a585// CHECK-NEXT: | [sizeof=96, align=16586// CHECK-NEXT: | nvsize=64, nvalign=16]587// CHECK-X64-LABEL: 0 | struct F3{{$}}588// CHECK-X64-NEXT: 0 | (F3 vftable pointer)589// CHECK-X64-NEXT: 16 | struct A4 (base)590// CHECK-X64-NEXT: 16 | int a591// CHECK-X64-NEXT: 24 | (F3 vbtable pointer)592// CHECK-X64-NEXT: 48 | int a593// CHECK-X64-NEXT: 64 | struct A16f (virtual base)594// CHECK-X64-NEXT: 64 | (A16f vftable pointer)595// CHECK-X64-NEXT: 80 | int a596// CHECK-X64-NEXT: | [sizeof=96, align=16597// CHECK-X64-NEXT: | nvsize=64, nvalign=16]598 599struct F4 : A4, B {600 __declspec(align(16)) int a;601 F4() : a(0xf00000f4) {}602 virtual void g() {printf("F4");}603};604 605// CHECK-LABEL: 0 | struct F4{{$}}606// CHECK-NEXT: 0 | (F4 vftable pointer)607// CHECK-NEXT: 16 | struct A4 (base)608// CHECK-NEXT: 16 | int a609// CHECK-NEXT: 32 | struct B (base)610// CHECK-NEXT: 32 | struct A4 (base)611// CHECK-NEXT: 32 | int a612// CHECK-NEXT: 36 | struct Y (base)613// CHECK-NEXT: 36 | char y614// CHECK-NEXT: 48 | struct X (base)615// CHECK-NEXT: 48 | (X vbtable pointer)616// CHECK-NEXT: 52 | int a617// CHECK-NEXT: 64 | int a618// CHECK-NEXT: 80 | struct A16f (virtual base)619// CHECK-NEXT: 80 | (A16f vftable pointer)620// CHECK-NEXT: 96 | int a621// CHECK-NEXT: | [sizeof=112, align=16622// CHECK-NEXT: | nvsize=80, nvalign=16]623// CHECK-X64-LABEL: 0 | struct F4{{$}}624// CHECK-X64-NEXT: 0 | (F4 vftable pointer)625// CHECK-X64-NEXT: 16 | struct A4 (base)626// CHECK-X64-NEXT: 16 | int a627// CHECK-X64-NEXT: 32 | struct B (base)628// CHECK-X64-NEXT: 32 | struct A4 (base)629// CHECK-X64-NEXT: 32 | int a630// CHECK-X64-NEXT: 36 | struct Y (base)631// CHECK-X64-NEXT: 36 | char y632// CHECK-X64-NEXT: 48 | struct X (base)633// CHECK-X64-NEXT: 48 | (X vbtable pointer)634// CHECK-X64-NEXT: 56 | int a635// CHECK-X64-NEXT: 64 | int a636// CHECK-X64-NEXT: 80 | struct A16f (virtual base)637// CHECK-X64-NEXT: 80 | (A16f vftable pointer)638// CHECK-X64-NEXT: 96 | int a639// CHECK-X64-NEXT: | [sizeof=112, align=16640// CHECK-X64-NEXT: | nvsize=80, nvalign=16]641 642struct F5 : A16f, virtual A4 {643 int a;644 F5() : a(0xf00000f5) {}645 virtual void g() {printf("F5");}646};647 648// CHECK-LABEL: 0 | struct F5{{$}}649// CHECK-NEXT: 0 | struct A16f (primary base)650// CHECK-NEXT: 0 | (A16f vftable pointer)651// CHECK-NEXT: 16 | int a652// CHECK-NEXT: 32 | (F5 vbtable pointer)653// CHECK-NEXT: 48 | int a654// CHECK-NEXT: 64 | struct A4 (virtual base)655// CHECK-NEXT: 64 | int a656// CHECK-NEXT: | [sizeof=80, align=16657// CHECK-NEXT: | nvsize=64, nvalign=16]658// CHECK-X64-LABEL: 0 | struct F5{{$}}659// CHECK-X64-NEXT: 0 | struct A16f (primary base)660// CHECK-X64-NEXT: 0 | (A16f vftable pointer)661// CHECK-X64-NEXT: 16 | int a662// CHECK-X64-NEXT: 32 | (F5 vbtable pointer)663// CHECK-X64-NEXT: 48 | int a664// CHECK-X64-NEXT: 64 | struct A4 (virtual base)665// CHECK-X64-NEXT: 64 | int a666// CHECK-X64-NEXT: | [sizeof=80, align=16667// CHECK-X64-NEXT: | nvsize=64, nvalign=16]668 669struct F6 : virtual A16f, A4, virtual B {670 int a;671 F6() : a(0xf00000f6) {}672 virtual void g() {printf("F6");}673};674 675// CHECK-LABEL: 0 | struct F6{{$}}676// CHECK-NEXT: 0 | (F6 vftable pointer)677// CHECK-NEXT: 4 | struct A4 (base)678// CHECK-NEXT: 4 | int a679// CHECK-NEXT: 8 | (F6 vbtable pointer)680// CHECK-NEXT: 12 | int a681// CHECK-NEXT: 16 | struct A16f (virtual base)682// CHECK-NEXT: 16 | (A16f vftable pointer)683// CHECK-NEXT: 32 | int a684// CHECK-NEXT: 48 | struct B (virtual base)685// CHECK-NEXT: 48 | struct A4 (base)686// CHECK-NEXT: 48 | int a687// CHECK-NEXT: 52 | struct Y (base)688// CHECK-NEXT: 52 | char y689// CHECK-NEXT: 64 | struct X (base)690// CHECK-NEXT: 64 | (X vbtable pointer)691// CHECK-NEXT: 68 | int a692// CHECK-NEXT: | [sizeof=80, align=16693// CHECK-NEXT: | nvsize=16, nvalign=16]694// CHECK-X64-LABEL: 0 | struct F6{{$}}695// CHECK-X64-NEXT: 0 | (F6 vftable pointer)696// CHECK-X64-NEXT: 8 | struct A4 (base)697// CHECK-X64-NEXT: 8 | int a698// CHECK-X64-NEXT: 16 | (F6 vbtable pointer)699// CHECK-X64-NEXT: 24 | int a700// CHECK-X64-NEXT: 32 | struct A16f (virtual base)701// CHECK-X64-NEXT: 32 | (A16f vftable pointer)702// CHECK-X64-NEXT: 48 | int a703// CHECK-X64-NEXT: 64 | struct B (virtual base)704// CHECK-X64-NEXT: 64 | struct A4 (base)705// CHECK-X64-NEXT: 64 | int a706// CHECK-X64-NEXT: 68 | struct Y (base)707// CHECK-X64-NEXT: 68 | char y708// CHECK-X64-NEXT: 80 | struct X (base)709// CHECK-X64-NEXT: 80 | (X vbtable pointer)710// CHECK-X64-NEXT: 88 | int a711// CHECK-X64-NEXT: | [sizeof=96, align=16712// CHECK-X64-NEXT: | nvsize=32, nvalign=16]713 714struct ArrayFieldOfRecords {715 A4 InlineElts[2];716};717 718// CHECK-LABEL: 0 | struct ArrayFieldOfRecords{{$}}719// CHECK-NEXT: 0 | A4[2] InlineElts720// CHECK-NEXT: | [sizeof=8, align=4721// CHECK-NEXT: | nvsize=8, nvalign=4]722// CHECK-X64-LABEL: 0 | struct ArrayFieldOfRecords{{$}}723// CHECK-X64-NEXT: 0 | A4[2] InlineElts724// CHECK-X64-NEXT: | [sizeof=8, align=4725// CHECK-X64-NEXT: | nvsize=8, nvalign=4]726 727struct ArrayOfArrayFieldOfRecords {728 A4 InlineElts[2][2];729};730 731// CHECK-LABEL: 0 | struct ArrayOfArrayFieldOfRecords{{$}}732// CHECK-NEXT: 0 | A4[2][2] InlineElts733// CHECK-NEXT: | [sizeof=16, align=4734// CHECK-NEXT: | nvsize=16, nvalign=4]735// CHECK-X64-LABEL: 0 | struct ArrayOfArrayFieldOfRecords{{$}}736// CHECK-X64-NEXT: 0 | A4[2][2] InlineElts737// CHECK-X64-NEXT: | [sizeof=16, align=4738// CHECK-X64-NEXT: | nvsize=16, nvalign=4]739 740struct RecordArrayTypedef {741 typedef A4 ArrayTy[2];742 ArrayTy InlineElts[2];743};744 745// CHECK-LABEL: 0 | struct RecordArrayTypedef{{$}}746// CHECK-NEXT: 0 | ArrayTy[2] InlineElts747// CHECK-NEXT: | [sizeof=16, align=4748// CHECK-NEXT: | nvsize=16, nvalign=4]749// CHECK-X64-LABEL: 0 | struct RecordArrayTypedef{{$}}750// CHECK-X64-NEXT: 0 | ArrayTy[2] InlineElts751// CHECK-X64-NEXT: | [sizeof=16, align=4752// CHECK-X64-NEXT: | nvsize=16, nvalign=4]753 754struct EmptyIntMemb {755 int FlexArrayMemb[0];756};757 758// CHECK-LABEL: 0 | struct EmptyIntMemb{{$}}759// CHECK-NEXT: 0 | int[0] FlexArrayMemb760// CHECK-NEXT: | [sizeof=1, align=4761// CHECK-NEXT: | nvsize=0, nvalign=4]762// CHECK-X64-LABEL: 0 | struct EmptyIntMemb{{$}}763// CHECK-X64-NEXT: 0 | int[0] FlexArrayMemb764// CHECK-X64-NEXT: | [sizeof=4, align=4765// CHECK-X64-NEXT: | nvsize=0, nvalign=4]766 767struct EmptyLongLongMemb {768 long long FlexArrayMemb[0];769};770 771// CHECK-LABEL: 0 | struct EmptyLongLongMemb{{$}}772// CHECK-NEXT: 0 | long long[0] FlexArrayMemb773// CHECK-NEXT: | [sizeof=1, align=8774// CHECK-NEXT: | nvsize=0, nvalign=8]775// CHECK-X64-LABEL: 0 | struct EmptyLongLongMemb{{$}}776// CHECK-X64-NEXT: 0 | long long[0] FlexArrayMemb777// CHECK-X64-NEXT: | [sizeof=8, align=8778// CHECK-X64-NEXT: | nvsize=0, nvalign=8]779 780int a[781sizeof(TestF0)+782sizeof(TestF1)+783sizeof(TestF2)+784sizeof(TestF3)+785sizeof(TestF4)+786sizeof(TestF5)+787sizeof(TestF6)+788sizeof(TestF7)+789sizeof(TestF8)+790sizeof(TestF9)+791sizeof(TestFA)+792sizeof(TestFB)+793sizeof(TestFC)+794sizeof(F0)+795sizeof(F1)+796sizeof(F2)+797sizeof(F3)+798sizeof(F4)+799sizeof(F5)+800sizeof(F6)+801sizeof(ArrayFieldOfRecords)+802sizeof(ArrayOfArrayFieldOfRecords)+803sizeof(RecordArrayTypedef)+804sizeof(EmptyIntMemb)+805sizeof(EmptyLongLongMemb)+8060];807