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());
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.
// 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)+
sizeof(F6)+
sizeof(ArrayFieldOfRecords)+
sizeof(ArrayOfArrayFieldOfRecords)+
+sizeof(RecordArrayTypedef)+
0];