diff options
| author | Warren Hunt <whunt@google.com> | 2014-02-22 00:40:37 +0000 |
|---|---|---|
| committer | Warren Hunt <whunt@google.com> | 2014-02-22 00:40:37 +0000 |
| commit | c85942038af58dbce643b44fe2160f60b137fd53 (patch) | |
| tree | 15e30e03865b09c1527c821370d672ddd0ed3535 /clang | |
| parent | 324eee45a74c13f60e3ef23cfa0990e937996551 (diff) | |
| download | bcm5719-llvm-c85942038af58dbce643b44fe2160f60b137fd53.tar.gz bcm5719-llvm-c85942038af58dbce643b44fe2160f60b137fd53.zip | |
[MS-ABI] Fix MSRecordLayout to handel MultiDimensionalArrays
A recent change caused multi-dimensional arrays not to be handled
correctly, this patch fixes that. Also, it adds a lit test for
multi-dimensional arrays.
llvm-svn: 201917
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 5 | ||||
| -rw-r--r-- | clang/test/Layout/ms-x86-basic-layout.cpp | 19 |
2 files changed, 21 insertions, 3 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index a038e2dc6a5..731f197fe08 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2271,8 +2271,9 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo( // Get the element info for a layout, respecting pack. Info = getAdjustedElementInfo(Layout, false); // If the field is an array type, scale it's size properly. - if (const ConstantArrayType *CAT = - dyn_cast<ConstantArrayType>(FD->getType())) + for (const ConstantArrayType *CAT = + dyn_cast<ConstantArrayType>(FD->getType()); CAT; + CAT = dyn_cast<ConstantArrayType>(CAT->getElementType())) Info.Size = Info.Size * (int64_t)CAT->getSize().getZExtValue(); // Capture required alignment as a side-effect. RequiredAlignment = std::max(RequiredAlignment, diff --git a/clang/test/Layout/ms-x86-basic-layout.cpp b/clang/test/Layout/ms-x86-basic-layout.cpp index f4fd34a2658..c522de84b28 100644 --- a/clang/test/Layout/ms-x86-basic-layout.cpp +++ b/clang/test/Layout/ms-x86-basic-layout.cpp @@ -785,6 +785,21 @@ struct ArrayFieldOfRecords { // CHECK-X64-NEXT: | [sizeof=8, align=4 // CHECK-X64-NEXT: | nvsize=8, nvalign=4] +struct ArrayOfArrayFieldOfRecords { + A4 InlineElts[2][2]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct ArrayOfArrayFieldOfRecords +// CHECK-NEXT: 0 | struct A4 [2][2] InlineElts +// CHECK-NEXT: | [sizeof=16, align=4 +// CHECK-NEXT: | nvsize=16, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct ArrayOfArrayFieldOfRecords +// CHECK-X64-NEXT: 0 | struct A4 [2][2] InlineElts +// CHECK-X64-NEXT: | [sizeof=16, align=4 +// CHECK-X64-NEXT: | nvsize=16, nvalign=4] + int a[ sizeof(TestF0)+ sizeof(TestF1)+ @@ -806,4 +821,6 @@ sizeof(F3)+ sizeof(F4)+ sizeof(F5)+ sizeof(F6)+ -sizeof(ArrayFieldOfRecords)]; +sizeof(ArrayFieldOfRecords)+ +sizeof(ArrayOfArrayFieldOfRecords)+ +0]; |

