229 lines · cpp
1// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts %s 2>/dev/null \2// RUN: | FileCheck %s3// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts %s 2>/dev/null \4// RUN: | FileCheck %s -check-prefix CHECK-X645 6 7struct U { char a; };8struct V { };9struct W { };10struct X : virtual V { char a; };11struct Y : virtual V { char a; };12struct Z : Y { };13 14struct A : X, W { char a; };15 16// CHECK: *** Dumping AST Record Layout17// CHECK: *** Dumping AST Record Layout18// CHECK: *** Dumping AST Record Layout19// CHECK: *** Dumping AST Record Layout20// CHECK-NEXT: 0 | struct A21// CHECK-NEXT: 0 | struct X (base)22// CHECK-NEXT: 0 | (X vbtable pointer)23// CHECK-NEXT: 4 | char a24// CHECK-NEXT: 9 | struct W (base) (empty)25// CHECK-NEXT: 9 | char a26// CHECK-NEXT: 12 | struct V (virtual base) (empty)27// CHECK-NEXT: | [sizeof=12, align=428// CHECK-NEXT: | nvsize=12, nvalign=4]29// CHECK-X64: *** Dumping AST Record Layout30// CHECK-X64: *** Dumping AST Record Layout31// CHECK-X64: *** Dumping AST Record Layout32// CHECK-X64: *** Dumping AST Record Layout33// CHECK-X64-NEXT: 0 | struct A34// CHECK-X64-NEXT: 0 | struct X (base)35// CHECK-X64-NEXT: 0 | (X vbtable pointer)36// CHECK-X64-NEXT: 8 | char a37// CHECK-X64-NEXT: 17 | struct W (base) (empty)38// CHECK-X64-NEXT: 17 | char a39// CHECK-X64-NEXT: 24 | struct V (virtual base) (empty)40// CHECK-X64-NEXT: | [sizeof=24, align=841// CHECK-X64-NEXT: | nvsize=24, nvalign=8]42 43struct B : X, U, W { char a; };44 45// CHECK: *** Dumping AST Record Layout46// CHECK: *** Dumping AST Record Layout47// CHECK-NEXT: 0 | struct B48// CHECK-NEXT: 0 | struct X (base)49// CHECK-NEXT: 0 | (X vbtable pointer)50// CHECK-NEXT: 4 | char a51// CHECK-NEXT: 8 | struct U (base)52// CHECK-NEXT: 8 | char a53// CHECK-NEXT: 9 | struct W (base) (empty)54// CHECK-NEXT: 9 | char a55// CHECK-NEXT: 12 | struct V (virtual base) (empty)56// CHECK-NEXT: | [sizeof=12, align=457// CHECK-NEXT: | nvsize=12, nvalign=4]58// CHECK-X64: *** Dumping AST Record Layout59// CHECK-X64: *** Dumping AST Record Layout60// CHECK-X64-NEXT: 0 | struct B61// CHECK-X64-NEXT: 0 | struct X (base)62// CHECK-X64-NEXT: 0 | (X vbtable pointer)63// CHECK-X64-NEXT: 8 | char a64// CHECK-X64-NEXT: 16 | struct U (base)65// CHECK-X64-NEXT: 16 | char a66// CHECK-X64-NEXT: 17 | struct W (base) (empty)67// CHECK-X64-NEXT: 17 | char a68// CHECK-X64-NEXT: 24 | struct V (virtual base) (empty)69// CHECK-X64-NEXT: | [sizeof=24, align=870// CHECK-X64-NEXT: | nvsize=24, nvalign=8]71 72struct C : X, V, W { char a; };73 74// CHECK: *** Dumping AST Record Layout75// CHECK-NEXT: 0 | struct C76// CHECK-NEXT: 0 | struct X (base)77// CHECK-NEXT: 0 | (X vbtable pointer)78// CHECK-NEXT: 4 | char a79// CHECK-NEXT: 9 | struct V (base) (empty)80// CHECK-NEXT: 10 | struct W (base) (empty)81// CHECK-NEXT: 10 | char a82// CHECK-NEXT: 12 | struct V (virtual base) (empty)83// CHECK-NEXT: | [sizeof=12, align=484// CHECK-NEXT: | nvsize=12, nvalign=4]85// CHECK-X64: *** Dumping AST Record Layout86// CHECK-X64-NEXT: 0 | struct C87// CHECK-X64-NEXT: 0 | struct X (base)88// CHECK-X64-NEXT: 0 | (X vbtable pointer)89// CHECK-X64-NEXT: 8 | char a90// CHECK-X64-NEXT: 17 | struct V (base) (empty)91// CHECK-X64-NEXT: 18 | struct W (base) (empty)92// CHECK-X64-NEXT: 18 | char a93// CHECK-X64-NEXT: 24 | struct V (virtual base) (empty)94// CHECK-X64-NEXT: | [sizeof=24, align=895// CHECK-X64-NEXT: | nvsize=24, nvalign=8]96 97struct D : X, U, V, W { char a; };98 99// CHECK: *** Dumping AST Record Layout100// CHECK-NEXT: 0 | struct D101// CHECK-NEXT: 0 | struct X (base)102// CHECK-NEXT: 0 | (X vbtable pointer)103// CHECK-NEXT: 4 | char a104// CHECK-NEXT: 8 | struct U (base)105// CHECK-NEXT: 8 | char a106// CHECK-NEXT: 9 | struct V (base) (empty)107// CHECK-NEXT: 10 | struct W (base) (empty)108// CHECK-NEXT: 10 | char a109// CHECK-NEXT: 12 | struct V (virtual base) (empty)110// CHECK-NEXT: | [sizeof=12, align=4111// CHECK-NEXT: | nvsize=12, nvalign=4]112// CHECK-X64: *** Dumping AST Record Layout113// CHECK-X64-NEXT: 0 | struct D114// CHECK-X64-NEXT: 0 | struct X (base)115// CHECK-X64-NEXT: 0 | (X vbtable pointer)116// CHECK-X64-NEXT: 8 | char a117// CHECK-X64-NEXT: 16 | struct U (base)118// CHECK-X64-NEXT: 16 | char a119// CHECK-X64-NEXT: 17 | struct V (base) (empty)120// CHECK-X64-NEXT: 18 | struct W (base) (empty)121// CHECK-X64-NEXT: 18 | char a122// CHECK-X64-NEXT: 24 | struct V (virtual base) (empty)123// CHECK-X64-NEXT: | [sizeof=24, align=8124// CHECK-X64-NEXT: | nvsize=24, nvalign=8]125 126struct E : X, U, Y, V, W { char a; };127 128// CHECK: *** Dumping AST Record Layout129// CHECK: *** Dumping AST Record Layout130// CHECK-NEXT: 0 | struct E131// CHECK-NEXT: 0 | struct X (base)132// CHECK-NEXT: 0 | (X vbtable pointer)133// CHECK-NEXT: 4 | char a134// CHECK-NEXT: 8 | struct U (base)135// CHECK-NEXT: 8 | char a136// CHECK-NEXT: 12 | struct Y (base)137// CHECK-NEXT: 12 | (Y vbtable pointer)138// CHECK-NEXT: 16 | char a139// CHECK-NEXT: 21 | struct V (base) (empty)140// CHECK-NEXT: 22 | struct W (base) (empty)141// CHECK-NEXT: 22 | char a142// CHECK-NEXT: 24 | struct V (virtual base) (empty)143// CHECK-NEXT: | [sizeof=24, align=4144// CHECK-NEXT: | nvsize=24, nvalign=4]145// CHECK-X64: *** Dumping AST Record Layout146// CHECK-X64: *** Dumping AST Record Layout147// CHECK-X64-NEXT: 0 | struct E148// CHECK-X64-NEXT: 0 | struct X (base)149// CHECK-X64-NEXT: 0 | (X vbtable pointer)150// CHECK-X64-NEXT: 8 | char a151// CHECK-X64-NEXT: 16 | struct U (base)152// CHECK-X64-NEXT: 16 | char a153// CHECK-X64-NEXT: 24 | struct Y (base)154// CHECK-X64-NEXT: 24 | (Y vbtable pointer)155// CHECK-X64-NEXT: 32 | char a156// CHECK-X64-NEXT: 41 | struct V (base) (empty)157// CHECK-X64-NEXT: 42 | struct W (base) (empty)158// CHECK-X64-NEXT: 42 | char a159// CHECK-X64-NEXT: 48 | struct V (virtual base) (empty)160// CHECK-X64-NEXT: | [sizeof=48, align=8161// CHECK-X64-NEXT: | nvsize=48, nvalign=8]162 163struct F : Z, W { char a; };164 165// CHECK: *** Dumping AST Record Layout166// CHECK: *** Dumping AST Record Layout167// CHECK-NEXT: 0 | struct F168// CHECK-NEXT: 0 | struct Z (base)169// CHECK-NEXT: 0 | struct Y (base)170// CHECK-NEXT: 0 | (Y vbtable pointer)171// CHECK-NEXT: 4 | char a172// CHECK-NEXT: 9 | struct W (base) (empty)173// CHECK-NEXT: 9 | char a174// CHECK-NEXT: 12 | struct V (virtual base) (empty)175// CHECK-NEXT: | [sizeof=12, align=4176// CHECK-NEXT: | nvsize=12, nvalign=4]177// CHECK-X64: *** Dumping AST Record Layout178// CHECK-X64: *** Dumping AST Record Layout179// CHECK-X64-NEXT: 0 | struct F180// CHECK-X64-NEXT: 0 | struct Z (base)181// CHECK-X64-NEXT: 0 | struct Y (base)182// CHECK-X64-NEXT: 0 | (Y vbtable pointer)183// CHECK-X64-NEXT: 8 | char a184// CHECK-X64-NEXT: 17 | struct W (base) (empty)185// CHECK-X64-NEXT: 17 | char a186// CHECK-X64-NEXT: 24 | struct V (virtual base) (empty)187// CHECK-X64-NEXT: | [sizeof=24, align=8188// CHECK-X64-NEXT: | nvsize=24, nvalign=8]189 190struct G : X, W, Y, V { char a; };191 192// CHECK: *** Dumping AST Record Layout193// CHECK-NEXT: 0 | struct G194// CHECK-NEXT: 0 | struct X (base)195// CHECK-NEXT: 0 | (X vbtable pointer)196// CHECK-NEXT: 4 | char a197// CHECK-NEXT: 9 | struct W (base) (empty)198// CHECK-NEXT: 12 | struct Y (base)199// CHECK-NEXT: 12 | (Y vbtable pointer)200// CHECK-NEXT: 16 | char a201// CHECK-NEXT: 21 | struct V (base) (empty)202// CHECK-NEXT: 21 | char a203// CHECK-NEXT: 24 | struct V (virtual base) (empty)204// CHECK-NEXT: | [sizeof=24, align=4205// CHECK-NEXT: | nvsize=24, nvalign=4]206// CHECK-X64: *** Dumping AST Record Layout207// CHECK-X64-NEXT: 0 | struct G208// CHECK-X64-NEXT: 0 | struct X (base)209// CHECK-X64-NEXT: 0 | (X vbtable pointer)210// CHECK-X64-NEXT: 8 | char a211// CHECK-X64-NEXT: 17 | struct W (base) (empty)212// CHECK-X64-NEXT: 24 | struct Y (base)213// CHECK-X64-NEXT: 24 | (Y vbtable pointer)214// CHECK-X64-NEXT: 32 | char a215// CHECK-X64-NEXT: 41 | struct V (base) (empty)216// CHECK-X64-NEXT: 41 | char a217// CHECK-X64-NEXT: 48 | struct V (virtual base) (empty)218// CHECK-X64-NEXT: | [sizeof=48, align=8219// CHECK-X64-NEXT: | nvsize=48, nvalign=8]220 221int a[222sizeof(A)+223sizeof(B)+224sizeof(C)+225sizeof(D)+226sizeof(E)+227sizeof(F)+228sizeof(G)];229