diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2014-09-30 06:45:43 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2014-09-30 06:45:43 +0000 |
| commit | 00a061dccc6671c96412d7b28ab2012963208579 (patch) | |
| tree | b8de3d4202a7fd311d0b424a6e167eaee41e5de2 /clang/test | |
| parent | 09184fedc0491328ff287d7049578c6ca1443b9b (diff) | |
| download | bcm5719-llvm-00a061dccc6671c96412d7b28ab2012963208579.tar.gz bcm5719-llvm-00a061dccc6671c96412d7b28ab2012963208579.zip | |
MS ABI: Correct layout for empty records
Empty records do not always have size equivalent to their alignment.
They only do so when their alignment is at least as large as the minimum
empty struct size: 1 byte in C++ and 4 bytes in C.
llvm-svn: 218661
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Layout/ms-x86-basic-layout.cpp | 32 | ||||
| -rw-r--r-- | clang/test/Layout/ms-x86-pack-and-align.cpp | 34 |
2 files changed, 66 insertions, 0 deletions
diff --git a/clang/test/Layout/ms-x86-basic-layout.cpp b/clang/test/Layout/ms-x86-basic-layout.cpp index b6ffeee7114..aac7aed0601 100644 --- a/clang/test/Layout/ms-x86-basic-layout.cpp +++ b/clang/test/Layout/ms-x86-basic-layout.cpp @@ -816,6 +816,36 @@ struct RecordArrayTypedef { // CHECK-X64-NEXT: | [sizeof=16, align=4 // CHECK-X64-NEXT: | nvsize=16, nvalign=4] +struct EmptyIntMemb { + int FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyIntMemb +// CHECK-NEXT: 0 | int [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=1, align=4 +// CHECK-NEXT: | nvsize=0, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyIntMemb +// CHECK-X64-NEXT: 0 | int [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=0, nvalign=4] + +struct EmptyLongLongMemb { + long long FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyLongLongMemb +// CHECK-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=1, align=8 +// CHECK-NEXT: | nvsize=0, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyLongLongMemb +// CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=8, align=8 +// CHECK-X64-NEXT: | nvsize=0, nvalign=8] + int a[ sizeof(TestF0)+ sizeof(TestF1)+ @@ -840,4 +870,6 @@ sizeof(F6)+ sizeof(ArrayFieldOfRecords)+ sizeof(ArrayOfArrayFieldOfRecords)+ sizeof(RecordArrayTypedef)+ +sizeof(EmptyIntMemb)+ +sizeof(EmptyLongLongMemb)+ 0]; diff --git a/clang/test/Layout/ms-x86-pack-and-align.cpp b/clang/test/Layout/ms-x86-pack-and-align.cpp index e2f03d782e5..9783233d66a 100644 --- a/clang/test/Layout/ms-x86-pack-and-align.cpp +++ b/clang/test/Layout/ms-x86-pack-and-align.cpp @@ -769,6 +769,38 @@ struct QD { // CHECK-X64-NEXT: | [sizeof=8, align=4 // CHECK-X64-NEXT: | nvsize=8, nvalign=4] +struct __declspec(align(4)) EmptyAlignedLongLongMemb { + long long FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyAlignedLongLongMemb +// CHECK-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=8, align=8 +// CHECK-NEXT: | nvsize=0, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyAlignedLongLongMemb +// CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=8, align=8 +// CHECK-X64-NEXT: | nvsize=0, nvalign=8] + +#pragma pack(1) +struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb { + long long FlexArrayMemb[0]; +}; +#pragma pack() + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb +// CHECK-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=0, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb +// CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=0, nvalign=4] + int a[ sizeof(X)+ sizeof(Y)+ @@ -800,4 +832,6 @@ sizeof(PE)+ sizeof(QB)+ sizeof(QC)+ sizeof(QD)+ +sizeof(EmptyAlignedLongLongMemb)+ +sizeof(EmptyPackedAlignedLongLongMemb)+ 0]; |

