brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · c1e84f1 Raw
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