summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.cpp6
-rw-r--r--clang/test/Layout/ms-x86-basic-layout.cpp18
2 files changed, 19 insertions, 5 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index ff6b950474d..885d4ff5fb6 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2176,16 +2176,14 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo(
Info = getAdjustedElementInfo(Layout);
// Nomally getAdjustedElementInfo returns the non-virtual size, which is
// correct for bases but not for fields.
- Info.Size = Layout.getSize();
+ Info.Size = Context.getTypeInfoInChars(FD->getType()).first;
// Capture required alignment as a side-effect.
RequiredAlignment = std::max(RequiredAlignment,
Layout.getRequiredAlignment());
}
else {
- std::pair<CharUnits, CharUnits> FieldInfo =
+ llvm::tie(Info.Size, Info.Alignment) =
Context.getTypeInfoInChars(FD->getType());
- Info.Size = FieldInfo.first;
- Info.Alignment = FieldInfo.second;
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 f509f2938cb..fc57ec9f33c 100644
--- a/clang/test/Layout/ms-x86-basic-layout.cpp
+++ b/clang/test/Layout/ms-x86-basic-layout.cpp
@@ -770,6 +770,21 @@ struct F6 : virtual A16f, A4, virtual B {
// CHECK-X64-NEXT: | [sizeof=96, align=16
// CHECK-X64-NEXT: | nvsize=32, nvalign=16]
+struct ArrayFieldOfRecords {
+ A4 InlineElts[2];
+};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct ArrayFieldOfRecords
+// CHECK-NEXT: 0 | struct A4 [2] InlineElts
+// CHECK-NEXT: | [sizeof=8, align=4
+// CHECK-NEXT: | nvsize=8, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct ArrayFieldOfRecords
+// CHECK-X64-NEXT: 0 | struct A4 [2] InlineElts
+// CHECK-X64-NEXT: | [sizeof=8, align=4
+// CHECK-X64-NEXT: | nvsize=8, nvalign=4]
+
int a[
sizeof(TestF0)+
sizeof(TestF1)+
@@ -790,4 +805,5 @@ sizeof(F2)+
sizeof(F3)+
sizeof(F4)+
sizeof(F5)+
-sizeof(F6)];
+sizeof(F6)+
+sizeof(ArrayFieldOfRecords)];
OpenPOWER on IntegriCloud