diff options
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 14 | ||||
-rw-r--r-- | clang/test/Layout/ms-x86-basic-layout.cpp | 17 |
2 files changed, 21 insertions, 10 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 731f197fe08..d27255ecc8d 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2261,6 +2261,8 @@ MicrosoftRecordLayoutBuilder::ElementInfo MicrosoftRecordLayoutBuilder::getAdjustedElementInfo( const FieldDecl *FD) { ElementInfo Info; + llvm::tie(Info.Size, Info.Alignment) = + Context.getTypeInfoInChars(FD->getType()); // Respect align attributes. CharUnits FieldRequiredAlignment = Context.toCharUnitsFromBits(FD->getMaxAlignment()); @@ -2269,19 +2271,11 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo( FD->getType()->getBaseElementTypeUnsafe()->getAs<RecordType>()) { const ASTRecordLayout &Layout = Context.getASTRecordLayout(RT->getDecl()); // 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. - 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(); + Info.Alignment = getAdjustedElementInfo(Layout, false).Alignment; // Capture required alignment as a side-effect. RequiredAlignment = std::max(RequiredAlignment, Layout.getRequiredAlignment()); - } - else { - llvm::tie(Info.Size, Info.Alignment) = - Context.getTypeInfoInChars(FD->getType()); + } else { if (FD->isBitField() && FD->getMaxAlignment() != 0) Info.Alignment = std::max(Info.Alignment, FieldRequiredAlignment); // Respect pragma pack. diff --git a/clang/test/Layout/ms-x86-basic-layout.cpp b/clang/test/Layout/ms-x86-basic-layout.cpp index c522de84b28..c7501a6cbb2 100644 --- a/clang/test/Layout/ms-x86-basic-layout.cpp +++ b/clang/test/Layout/ms-x86-basic-layout.cpp @@ -800,6 +800,22 @@ struct ArrayOfArrayFieldOfRecords { // CHECK-X64-NEXT: | [sizeof=16, align=4 // CHECK-X64-NEXT: | nvsize=16, nvalign=4] +struct RecordArrayTypedef { + typedef A4 ArrayTy[2]; + ArrayTy InlineElts[2]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct RecordArrayTypedef +// CHECK-NEXT: 0 | ArrayTy [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 RecordArrayTypedef +// CHECK-X64-NEXT: 0 | ArrayTy [2] InlineElts +// CHECK-X64-NEXT: | [sizeof=16, align=4 +// CHECK-X64-NEXT: | nvsize=16, nvalign=4] + int a[ sizeof(TestF0)+ sizeof(TestF1)+ @@ -823,4 +839,5 @@ sizeof(F5)+ sizeof(F6)+ sizeof(ArrayFieldOfRecords)+ sizeof(ArrayOfArrayFieldOfRecords)+ +sizeof(RecordArrayTypedef)+ 0]; |