if (FD->hasAttr<PackedAttr>())
Info.Alignment = CharUnits::One();
Info.Alignment = std::max(Info.Alignment, FieldRequiredAlignment);
- // TODO: Add a Sema warning that MS ignores bitfield alignment in unions.
- if (!(FD->isBitField() && IsUnion))
- Alignment = std::max(Alignment, Info.Alignment);
return Info;
}
}
LastFieldIsNonZeroWidthBitfield = false;
ElementInfo Info = getAdjustedElementInfo(FD);
+ Alignment = std::max(Alignment, Info.Alignment);
if (IsUnion) {
placeFieldAtOffset(CharUnits::Zero());
Size = std::max(Size, Info.Size);
if (IsUnion) {
placeFieldAtOffset(CharUnits::Zero());
Size = std::max(Size, Info.Size);
+ // TODO: Add a Sema warning that MS ignores bitfield alignment in unions.
} else {
// Allocate a new block of memory and place the bitfield in it.
CharUnits FieldOffset = Size.RoundUpToAlignment(Info.Alignment);
placeFieldAtOffset(FieldOffset);
Size = FieldOffset + Info.Size;
+ Alignment = std::max(Alignment, Info.Alignment);
RemainingBitsInField = Context.toBits(Info.Size) - Width;
}
}
if (IsUnion) {
placeFieldAtOffset(CharUnits::Zero());
Size = std::max(Size, Info.Size);
+ // TODO: Add a Sema warning that MS ignores bitfield alignment in unions.
} else {
// Round up the current record size to the field's alignment boundary.
CharUnits FieldOffset = Size.RoundUpToAlignment(Info.Alignment);
placeFieldAtOffset(FieldOffset);
Size = FieldOffset;
+ Alignment = std::max(Alignment, Info.Alignment);
}
}
-// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts %s 2>/dev/null \\r
+// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \\r
// RUN: | FileCheck %s\r
-// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts %s 2>/dev/null \\r
+// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \\r
// RUN: | FileCheck %s\r
\r
typedef struct A {\r
// CHECK: Alignment:16\r
// CHECK: FieldOffsets: [0, 16, 16, 16]>\r
\r
+typedef struct I {\r
+ short : 8;\r
+ __declspec(align(16)) short : 8;\r
+} I;\r
+\r
+// CHECK: Type: struct I\r
+// CHECK: Size:16\r
+// CHECK: Alignment:16\r
+// CHECK: FieldOffsets: [0, 8]\r
+\r
#pragma pack(push, 1)\r
\r
typedef struct A1 {\r
// CHECK: Alignment:8\r
// CHECK: FieldOffsets: [0, 32, 32, 32]>\r
\r
+typedef struct I1 {\r
+ short : 8;\r
+ __declspec(align(16)) short : 8;\r
+} I1;\r
+\r
+// CHECK: Type: struct I1\r
+// CHECK: Size:16\r
+// CHECK: Alignment:8\r
+// CHECK: FieldOffsets: [0, 8]\r
+\r
#pragma pack(pop)\r
\r
int x[\r
sizeof(F ) +\r
sizeof(G ) +\r
sizeof(H ) +\r
+sizeof(I ) +\r
sizeof(A1) +\r
sizeof(B1) +\r
sizeof(C1) +\r
sizeof(F1) +\r
sizeof(G1) +\r
sizeof(H1) +\r
+sizeof(I1) +\r
0];\r