210 lines · cpp
1// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -emit-llvm -fdump-record-layouts -std=c++17 %s -o %t | FileCheck %s2 3// CHECK-LABEL: 0 | class Empty (empty)4// CHECK-NEXT: | [sizeof=1, dsize=1, align=1,5// CHECK-NEXT: | nvsize=1, nvalign=1]6// CHECK-LABEL: 0 | class Second7// CHECK-NEXT: 0 | class Empty (base) (empty)8// CHECK-NEXT: 0:0-0 | short A9// CHECK-NEXT: | [sizeof=2, dsize=1, align=2,10// CHECK-NEXT: | nvsize=1, nvalign=2]11// CHECK-LABEL: 0 | class Foo12// CHECK-NEXT: 0 | class Empty (base) (empty)13// CHECK-NEXT: 2 | class Second NZNoUnique14// CHECK-NEXT: 2 | class Empty (base) (empty)15// CHECK-NEXT: 2:0-0 | short A16// CHECK-NEXT: 3 | char B17// CHECK-NEXT: | [sizeof=4, dsize=4, align=2,18// CHECK-NEXT: | nvsize=4, nvalign=2]19 20class Empty {};21 22// CHECK-LABEL: LLVMType:%class.Second = type { i8, i8 }23// CHECK-NEXT: NonVirtualBaseLLVMType:%class.Second.base = type { i8 }24class Second : Empty {25 short A : 1;26};27 28// CHECK-LABEL: LLVMType:%class.Foo = type { [2 x i8], %class.Second.base, i8 }29// CHECK-NEXT: NonVirtualBaseLLVMType:%class.Foo = type { [2 x i8], %class.Second.base, i8 }30class Foo : Empty {31 [[no_unique_address]] Second NZNoUnique;32 char B;33};34Foo I;35 36// CHECK-LABEL: 0 | class SecondEmpty (empty)37// CHECK-NEXT: 0 | class Empty (base) (empty)38// CHECK-NEXT: | [sizeof=1, dsize=0, align=1,39// CHECK-NEXT: | nvsize=1, nvalign=1]40class SecondEmpty: Empty {41};42 43// CHECK-LABEL: 0 | class Bar44// CHECK-NEXT: 0 | class Empty (base) (empty)45// CHECK-NEXT: 1 | class SecondEmpty ZNoUnique (empty)46// CHECK-NEXT: 1 | class Empty (base) (empty)47// CHECK-NEXT: 0 | char C48// CHECK-NEXT: | [sizeof=2, dsize=1, align=1,49// CHECK-NEXT: | nvsize=2, nvalign=1]50 51// CHECK-LABEL: LLVMType:%class.Bar = type { i8, i8 }52// CHECK-NEXT: NonVirtualBaseLLVMType:%class.Bar = type { i8, i8 }53class Bar : Empty {54 [[no_unique_address]] SecondEmpty ZNoUnique;55 char C;56};57Bar J;58 59// CHECK-LABEL: 0 | class IntFieldClass60// CHECK-NEXT: 0 | class Empty (base) (empty)61// CHECK-NEXT: 2 | class Second Field62// CHECK-NEXT: 2 | class Empty (base) (empty)63// CHECK-NEXT: 2:0-0 | short A64// CHECK-NEXT: 4 | int C65// CHECK-NEXT: | [sizeof=8, dsize=8, align=4,66// CHECK-NEXT: | nvsize=8, nvalign=4]67 68// CHECK-LABEL: LLVMType:%class.IntFieldClass = type { [2 x i8], %class.Second.base, i32 }69// CHECK-NEXT: NonVirtualBaseLLVMType:%class.IntFieldClass = type { [2 x i8], %class.Second.base, i32 }70class IntFieldClass : Empty {71 [[no_unique_address]] Second Field;72 int C;73};74IntFieldClass K;75 76// CHECK-LABEL: 0 | class UnionClass77// CHECK-NEXT: 0 | class Empty (base) (empty)78// CHECK-NEXT: 0 | union UnionClass79// CHECK-NEXT: 0 | int I80// CHECK-NEXT: 0 | char C81// CHECK-NEXT: 4 | int C82// CHECK-NEXT: | [sizeof=8, dsize=8, align=4,83// CHECK-NEXT: | nvsize=8, nvalign=4]84 85// CHECK-LABEL: LLVMType:%class.UnionClass = type { %union.anon, i32 }86// CHECK-NEXT: NonVirtualBaseLLVMType:%class.UnionClass = type { %union.anon, i32 }87// CHECK-NEXT: IsZeroInitializable:188// CHECK-NEXT: BitFields:[89// CHECK-NEXT: ]>90class UnionClass : Empty {91 [[no_unique_address]] union {92 int I;93 char C;94 } U;95 int C;96};97UnionClass L;98 99// CHECK-LABEL: 0 | class EnumClass100// CHECK-NEXT: 0 | class Empty (base) (empty)101// CHECK-NEXT: 0 | enum E A102// CHECK-NEXT: 4 | int C103// CHECK-NEXT: | [sizeof=8, dsize=8, align=4,104// CHECK-NEXT: | nvsize=8, nvalign=4]105 106// CHECK-LABEL: LLVMType:%class.EnumClass = type { i32, i32 }107// CHECK-NEXT: NonVirtualBaseLLVMType:%class.EnumClass = type { i32, i32 }108// CHECK-NEXT: IsZeroInitializable:1109// CHECK-NEXT: BitFields:[110// CHECK-NEXT: ]>111class EnumClass : Empty {112 [[no_unique_address]] enum class E { X, Y, Z } A;113 int C;114};115EnumClass M;116 117// CHECK-LABEL: 0 | class NoBaseField118// CHECK-NEXT: 0 | class Empty (base) (empty)119// CHECK-NEXT: 1 | class Empty A (empty)120// CHECK-NEXT: 0 | int B121// CHECK-NEXT: | [sizeof=4, dsize=4, align=4,122// CHECK-NEXT: | nvsize=4, nvalign=4]123 124// CHECK-LABEL: LLVMType:%class.NoBaseField = type { i32 }125// CHECK-NEXT: NonVirtualBaseLLVMType:%class.NoBaseField = type { i32 }126// CHECK-NEXT: IsZeroInitializable:1127// CHECK-NEXT: BitFields:[128// CHECK-NEXT: ]>129class NoBaseField : Empty {130 [[no_unique_address]] Empty A;131 int B;132};133NoBaseField N;134 135// CHECK-LABEL: 0 | class FinalEmpty (empty)136// CHECK-NEXT: | [sizeof=1, dsize=1, align=1,137// CHECK-NEXT: | nvsize=1, nvalign=1]138 139// CHECK-LABEL: 0 | class FinalClass140// CHECK-NEXT: 0 | class Empty (base) (empty)141// CHECK-NEXT: 0 | class FinalEmpty A (empty)142// CHECK-NEXT: 0 | int B143// CHECK-NEXT: | [sizeof=4, dsize=4, align=4,144// CHECK-NEXT: | nvsize=4, nvalign=4]145class FinalEmpty final {};146class FinalClass final : Empty {147 [[no_unique_address]] FinalEmpty A;148 int B;149} O;150 151 152// CHECK-LABEL: 0 | union Union2Class::PaddedUnion153// CHECK-NEXT: 0 | class Empty A (empty)154// CHECK-NEXT: 0 | char B155// CHECK-NEXT: | [sizeof=2, dsize=1, align=2,156// CHECK-NEXT: | nvsize=1, nvalign=2]157 158// CHECK-LABEL: 0 | class Union2Class159// CHECK-NEXT: 0 | class Empty (base) (empty)160// CHECK-NEXT: 2 | union Union2Class::PaddedUnion U161// CHECK-NEXT: 2 | class Empty A (empty)162// CHECK-NEXT: 2 | char B163// CHECK-NEXT: 3 | char C164// CHECK-NEXT: | [sizeof=4, dsize=4, align=2,165// CHECK-NEXT: | nvsize=4, nvalign=2]166class Union2Class : Empty {167 [[no_unique_address]] union PaddedUnion {168 private:169 Empty A;170 alignas(2) char B;171 } U;172 char C;173} P;174 175// CHECK-LABEL: 0 | struct NotEmptyWithBitfield176// CHECK-NEXT: 0 | class Empty (base) (empty)177// CHECK-NEXT: 0 | char[2] A178// CHECK-NEXT: 2:0-0 | int B179// CHECK-NEXT: | [sizeof=4, dsize=3, align=4,180// CHECK-NEXT: | nvsize=3, nvalign=4]181 182// CHECK-LABEL: 0 | union C::183// CHECK-NEXT: 0 | short C184// CHECK-NEXT: 0 | struct NotEmptyWithBitfield A185// CHECK-NEXT: 0 | class Empty (base) (empty)186// CHECK-NEXT: 0 | char[2] A187// CHECK-NEXT: 2:0-0 | int B188// CHECK-NEXT: | [sizeof=4, dsize=3, align=4,189// CHECK-NEXT: | nvsize=3, nvalign=4]190 191// CHECK-LABEL: 0 | struct C192// CHECK-NEXT: 0 | union C::193// CHECK-NEXT: 0 | short C194// CHECK-NEXT: 0 | struct NotEmptyWithBitfield A195// CHECK-NEXT: 0 | class Empty (base) (empty)196// CHECK-NEXT: 0 | char[2] A197// CHECK-NEXT: 2:0-0 | int B198// CHECK-NEXT: | [sizeof=4, dsize=3, align=4,199// CHECK-NEXT: | nvsize=3, nvalign=4]200struct NotEmptyWithBitfield : Empty {201 char A[2];202 int B : 1;203};204struct C {205 [[no_unique_address]] union {206 short C;207 [[no_unique_address]] NotEmptyWithBitfield A;208 } U;209} Q;210