brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.0 KiB · b0dbd09 Raw
294 lines · cpp
1// RUN: %clang_cc1 -fno-rtti -triple i686-pc-win32 -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 -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 B0 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } virtual void f() { printf("B0"); } };9struct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } virtual void g() { printf("B1"); } };10struct B2 { int a; B2() : a(0xf00000B2) { printf("B1 = %p\n", this); } };11struct B0X { int a; B0X() : a(0xf00000B0) {} };12struct B1X { int a; B1X() : a(0xf00000B1) {} virtual void f() { printf("B0"); } };13struct B2X : virtual B1X { int a; B2X() : a(0xf00000B2) {} };14 15struct A : virtual B0 {16};17 18// CHECK-LABEL:   0 | struct A19// CHECK-NEXT:    0 |   (A vbtable pointer)20// CHECK-NEXT:    4 |   struct B0 (virtual base)21// CHECK-NEXT:    4 |     (B0 vftable pointer)22// CHECK-NEXT:    8 |     int a23// CHECK-NEXT:      | [sizeof=12, align=424// CHECK-NEXT:      |  nvsize=4, nvalign=4]25// CHECK-X64-LABEL:   0 | struct A26// CHECK-X64-NEXT:    0 |   (A vbtable pointer)27// CHECK-X64-NEXT:    8 |   struct B0 (virtual base)28// CHECK-X64-NEXT:    8 |     (B0 vftable pointer)29// CHECK-X64-NEXT:   16 |     int a30// CHECK-X64-NEXT:      | [sizeof=24, align=831// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]32 33struct B : virtual B0 {34	virtual void f() { printf("B"); }35};36 37// CHECK-LABEL:   0 | struct B38// CHECK-NEXT:    0 |   (B vbtable pointer)39// CHECK-NEXT:    4 |   struct B0 (virtual base)40// CHECK-NEXT:    4 |     (B0 vftable pointer)41// CHECK-NEXT:    8 |     int a42// CHECK-NEXT:      | [sizeof=12, align=443// CHECK-NEXT:      |  nvsize=4, nvalign=4]44// CHECK-X64-LABEL:   0 | struct B45// CHECK-X64-NEXT:    0 |   (B vbtable pointer)46// CHECK-X64-NEXT:    8 |   struct B0 (virtual base)47// CHECK-X64-NEXT:    8 |     (B0 vftable pointer)48// CHECK-X64-NEXT:   16 |     int a49// CHECK-X64-NEXT:      | [sizeof=24, align=850// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]51 52struct C : virtual B0 {53	virtual void g() { printf("A"); }54};55 56// CHECK-LABEL:   0 | struct C57// CHECK-NEXT:    0 |   (C vftable pointer)58// CHECK-NEXT:    4 |   (C vbtable pointer)59// CHECK-NEXT:    8 |   struct B0 (virtual base)60// CHECK-NEXT:    8 |     (B0 vftable pointer)61// CHECK-NEXT:   12 |     int a62// CHECK-NEXT:      | [sizeof=16, align=463// CHECK-NEXT:      |  nvsize=8, nvalign=4]64// CHECK-X64-LABEL:   0 | struct C65// CHECK-X64-NEXT:    0 |   (C vftable pointer)66// CHECK-X64-NEXT:    8 |   (C vbtable pointer)67// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)68// CHECK-X64-NEXT:   16 |     (B0 vftable pointer)69// CHECK-X64-NEXT:   24 |     int a70// CHECK-X64-NEXT:      | [sizeof=32, align=871// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]72 73struct D : virtual B2, virtual B0 {74	virtual void f() { printf("D"); }75	virtual void g() { printf("D"); }76};77 78// CHECK-LABEL:   0 | struct D79// CHECK-NEXT:    0 |   (D vftable pointer)80// CHECK-NEXT:    4 |   (D vbtable pointer)81// CHECK-NEXT:    8 |   struct B2 (virtual base)82// CHECK-NEXT:    8 |     int a83// CHECK-NEXT:   12 |   struct B0 (virtual base)84// CHECK-NEXT:   12 |     (B0 vftable pointer)85// CHECK-NEXT:   16 |     int a86// CHECK-NEXT:      | [sizeof=20, align=487// CHECK-NEXT:      |  nvsize=8, nvalign=4]88// CHECK-X64-LABEL:   0 | struct D89// CHECK-X64-NEXT:    0 |   (D vftable pointer)90// CHECK-X64-NEXT:    8 |   (D vbtable pointer)91// CHECK-X64-NEXT:   16 |   struct B2 (virtual base)92// CHECK-X64-NEXT:   16 |     int a93// CHECK-X64-NEXT:   24 |   struct B0 (virtual base)94// CHECK-X64-NEXT:   24 |     (B0 vftable pointer)95// CHECK-X64-NEXT:   32 |     int a96// CHECK-X64-NEXT:      | [sizeof=40, align=897// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]98 99struct E : B0, virtual B1 {100	virtual void f() { printf("E"); }101	virtual void g() { printf("E"); }102};103 104// CHECK-LABEL:   0 | struct E105// CHECK-NEXT:    0 |   struct B0 (primary base)106// CHECK-NEXT:    0 |     (B0 vftable pointer)107// CHECK-NEXT:    4 |     int a108// CHECK-NEXT:    8 |   (E vbtable pointer)109// CHECK-NEXT:   12 |   struct B1 (virtual base)110// CHECK-NEXT:   12 |     (B1 vftable pointer)111// CHECK-NEXT:   16 |     int a112// CHECK-NEXT:      | [sizeof=20, align=4113// CHECK-NEXT:      |  nvsize=12, nvalign=4]114// CHECK-X64-LABEL:   0 | struct E115// CHECK-X64-NEXT:    0 |   struct B0 (primary base)116// CHECK-X64-NEXT:    0 |     (B0 vftable pointer)117// CHECK-X64-NEXT:    8 |     int a118// CHECK-X64-NEXT:   16 |   (E vbtable pointer)119// CHECK-X64-NEXT:   24 |   struct B1 (virtual base)120// CHECK-X64-NEXT:   24 |     (B1 vftable pointer)121// CHECK-X64-NEXT:   32 |     int a122// CHECK-X64-NEXT:      | [sizeof=40, align=8123// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]124 125struct F : virtual B0, virtual B1 {126};127 128// CHECK-LABEL:   0 | struct F129// CHECK-NEXT:    0 |   (F vbtable pointer)130// CHECK-NEXT:    4 |   struct B0 (virtual base)131// CHECK-NEXT:    4 |     (B0 vftable pointer)132// CHECK-NEXT:    8 |     int a133// CHECK-NEXT:   12 |   struct B1 (virtual base)134// CHECK-NEXT:   12 |     (B1 vftable pointer)135// CHECK-NEXT:   16 |     int a136// CHECK-NEXT:      | [sizeof=20, align=4137// CHECK-NEXT:      |  nvsize=4, nvalign=4]138// CHECK-X64-LABEL:   0 | struct F139// CHECK-X64-NEXT:    0 |   (F vbtable pointer)140// CHECK-X64-NEXT:    8 |   struct B0 (virtual base)141// CHECK-X64-NEXT:    8 |     (B0 vftable pointer)142// CHECK-X64-NEXT:   16 |     int a143// CHECK-X64-NEXT:   24 |   struct B1 (virtual base)144// CHECK-X64-NEXT:   24 |     (B1 vftable pointer)145// CHECK-X64-NEXT:   32 |     int a146// CHECK-X64-NEXT:      | [sizeof=40, align=8147// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]148 149struct AX : B0X, B1X { int a; AX() : a(0xf000000A) {} virtual void f() { printf("A"); } };150 151// CHECK-LABEL:   0 | struct AX152// CHECK-NEXT:    0 |   struct B1X (primary base)153// CHECK-NEXT:    0 |     (B1X vftable pointer)154// CHECK-NEXT:    4 |     int a155// CHECK-NEXT:    8 |   struct B0X (base)156// CHECK-NEXT:    8 |     int a157// CHECK-NEXT:   12 |   int a158// CHECK-NEXT:      | [sizeof=16, align=4159// CHECK-NEXT:      |  nvsize=16, nvalign=4]160// CHECK-X64-LABEL:   0 | struct AX161// CHECK-X64-NEXT:    0 |   struct B1X (primary base)162// CHECK-X64-NEXT:    0 |     (B1X vftable pointer)163// CHECK-X64-NEXT:    8 |     int a164// CHECK-X64-NEXT:   16 |   struct B0X (base)165// CHECK-X64-NEXT:   16 |     int a166// CHECK-X64-NEXT:   20 |   int a167// CHECK-X64-NEXT:      | [sizeof=24, align=8168// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]169 170struct BX : B0X, B1X { int a; BX() : a(0xf000000B) {} virtual void g() { printf("B"); } };171 172// CHECK-LABEL:   0 | struct BX173// CHECK-NEXT:    0 |   struct B1X (primary base)174// CHECK-NEXT:    0 |     (B1X vftable pointer)175// CHECK-NEXT:    4 |     int a176// CHECK-NEXT:    8 |   struct B0X (base)177// CHECK-NEXT:    8 |     int a178// CHECK-NEXT:   12 |   int a179// CHECK-NEXT:      | [sizeof=16, align=4180// CHECK-NEXT:      |  nvsize=16, nvalign=4]181// CHECK-X64-LABEL:   0 | struct BX182// CHECK-X64-NEXT:    0 |   struct B1X (primary base)183// CHECK-X64-NEXT:    0 |     (B1X vftable pointer)184// CHECK-X64-NEXT:    8 |     int a185// CHECK-X64-NEXT:   16 |   struct B0X (base)186// CHECK-X64-NEXT:   16 |     int a187// CHECK-X64-NEXT:   20 |   int a188// CHECK-X64-NEXT:      | [sizeof=24, align=8189// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]190 191struct CX : B0X, B2X { int a; CX() : a(0xf000000C) {} virtual void g() { printf("C"); } };192 193// CHECK-LABEL:   0 | struct CX194// CHECK-NEXT:    0 |   (CX vftable pointer)195// CHECK-NEXT:    4 |   struct B0X (base)196// CHECK-NEXT:    4 |     int a197// CHECK-NEXT:    8 |   struct B2X (base)198// CHECK-NEXT:    8 |     (B2X vbtable pointer)199// CHECK-NEXT:   12 |     int a200// CHECK-NEXT:   16 |   int a201// CHECK-NEXT:   20 |   struct B1X (virtual base)202// CHECK-NEXT:   20 |     (B1X vftable pointer)203// CHECK-NEXT:   24 |     int a204// CHECK-NEXT:      | [sizeof=28, align=4205// CHECK-NEXT:      |  nvsize=20, nvalign=4]206// CHECK-X64-LABEL:   0 | struct CX207// CHECK-X64-NEXT:    0 |   (CX vftable pointer)208// CHECK-X64-NEXT:    8 |   struct B0X (base)209// CHECK-X64-NEXT:    8 |     int a210// CHECK-X64-NEXT:   16 |   struct B2X (base)211// CHECK-X64-NEXT:   16 |     (B2X vbtable pointer)212// CHECK-X64-NEXT:   24 |     int a213// CHECK-X64-NEXT:   32 |   int a214// CHECK-X64-NEXT:   40 |   struct B1X (virtual base)215// CHECK-X64-NEXT:   40 |     (B1X vftable pointer)216// CHECK-X64-NEXT:   48 |     int a217// CHECK-X64-NEXT:      | [sizeof=56, align=8218// CHECK-X64-NEXT:      |  nvsize=40, nvalign=8]219 220struct DX : virtual B1X { int a; DX() : a(0xf000000D) {} virtual void f() { printf("D"); } };221 222// CHECK-LABEL:   0 | struct DX223// CHECK-NEXT:    0 |   (DX vbtable pointer)224// CHECK-NEXT:    4 |   int a225// CHECK-NEXT:    8 |   (vtordisp for vbase B1X)226// CHECK-NEXT:   12 |   struct B1X (virtual base)227// CHECK-NEXT:   12 |     (B1X vftable pointer)228// CHECK-NEXT:   16 |     int a229// CHECK-NEXT:      | [sizeof=20, align=4230// CHECK-NEXT:      |  nvsize=8, nvalign=4]231// CHECK-X64-LABEL:   0 | struct DX232// CHECK-X64-NEXT:    0 |   (DX vbtable pointer)233// CHECK-X64-NEXT:    8 |   int a234// CHECK-X64-NEXT:   20 |   (vtordisp for vbase B1X)235// CHECK-X64-NEXT:   24 |   struct B1X (virtual base)236// CHECK-X64-NEXT:   24 |     (B1X vftable pointer)237// CHECK-X64-NEXT:   32 |     int a238// CHECK-X64-NEXT:      | [sizeof=40, align=8239// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]240 241struct EX : virtual B1X { int a; EX() : a(0xf000000E) {} virtual void g() { printf("E"); } };242 243// CHECK-LABEL:   0 | struct EX244// CHECK-NEXT:    0 |   (EX vftable pointer)245// CHECK-NEXT:    4 |   (EX vbtable pointer)246// CHECK-NEXT:    8 |   int a247// CHECK-NEXT:   12 |   struct B1X (virtual base)248// CHECK-NEXT:   12 |     (B1X vftable pointer)249// CHECK-NEXT:   16 |     int a250// CHECK-NEXT:      | [sizeof=20, align=4251// CHECK-NEXT:      |  nvsize=12, nvalign=4]252// CHECK-X64-LABEL:   0 | struct EX253// CHECK-X64-NEXT:    0 |   (EX vftable pointer)254// CHECK-X64-NEXT:    8 |   (EX vbtable pointer)255// CHECK-X64-NEXT:   16 |   int a256// CHECK-X64-NEXT:   24 |   struct B1X (virtual base)257// CHECK-X64-NEXT:   24 |     (B1X vftable pointer)258// CHECK-X64-NEXT:   32 |     int a259// CHECK-X64-NEXT:      | [sizeof=40, align=8260// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]261 262struct FX : virtual B1X { int a; FX() : a(0xf000000F) {} };263 264// CHECK-LABEL:   0 | struct FX265// CHECK-NEXT:    0 |   (FX vbtable pointer)266// CHECK-NEXT:    4 |   int a267// CHECK-NEXT:    8 |   struct B1X (virtual base)268// CHECK-NEXT:    8 |     (B1X vftable pointer)269// CHECK-NEXT:   12 |     int a270// CHECK-NEXT:      | [sizeof=16, align=4271// CHECK-NEXT:      |  nvsize=8, nvalign=4]272// CHECK-X64-LABEL:   0 | struct FX273// CHECK-X64-NEXT:    0 |   (FX vbtable pointer)274// CHECK-X64-NEXT:    8 |   int a275// CHECK-X64-NEXT:   16 |   struct B1X (virtual base)276// CHECK-X64-NEXT:   16 |     (B1X vftable pointer)277// CHECK-X64-NEXT:   24 |     int a278// CHECK-X64-NEXT:      | [sizeof=32, align=8279// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]280 281int a[282sizeof(A)+283sizeof(B)+284sizeof(C)+285sizeof(D)+286sizeof(E)+287sizeof(F)+288sizeof(AX)+289sizeof(BX)+290sizeof(CX)+291sizeof(DX)+292sizeof(EX)+293sizeof(FX)];294