diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-04-13 08:15:50 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-04-13 08:15:50 +0000 |
commit | adc45bb77b13cb62176cd9c9a3bedd245c5981b1 (patch) | |
tree | e036eb21fc4abee8503ded7bb064527e884677a0 /clang/lib/AST/RecordLayoutBuilder.cpp | |
parent | 269e0fb2e49385039bf0eb4c8a35bd4499be1694 (diff) | |
download | bcm5719-llvm-adc45bb77b13cb62176cd9c9a3bedd245c5981b1.tar.gz bcm5719-llvm-adc45bb77b13cb62176cd9c9a3bedd245c5981b1.zip |
MS ABI: Bitfields FielDecls only align if they allocate
Don't consider a __declspec(align) on a bitfield's declaration if it didn't
allocate any underlying storage.
This fixes PR19414.
llvm-svn: 206132
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 04a0fab737a..5eb87e7fc75 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2291,9 +2291,6 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo( 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; } @@ -2472,6 +2469,7 @@ void MicrosoftRecordLayoutBuilder::layoutField(const FieldDecl *FD) { } LastFieldIsNonZeroWidthBitfield = false; ElementInfo Info = getAdjustedElementInfo(FD); + Alignment = std::max(Alignment, Info.Alignment); if (IsUnion) { placeFieldAtOffset(CharUnits::Zero()); Size = std::max(Size, Info.Size); @@ -2507,11 +2505,13 @@ void MicrosoftRecordLayoutBuilder::layoutBitField(const FieldDecl *FD) { 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; } } @@ -2531,11 +2531,13 @@ MicrosoftRecordLayoutBuilder::layoutZeroWidthBitField(const FieldDecl *FD) { 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); } } |