diff options
author | Warren Hunt <whunt@google.com> | 2014-01-13 22:25:55 +0000 |
---|---|---|
committer | Warren Hunt <whunt@google.com> | 2014-01-13 22:25:55 +0000 |
commit | 4c73e594753f496e85159afdcb1c6323391c6d4b (patch) | |
tree | bfd63f3883e1adf2f75b2352145aef7f5eb11687 /clang/lib/AST/RecordLayoutBuilder.cpp | |
parent | 859422a867320f122ad15fe1dd1d9c5107f63639 (diff) | |
download | bcm5719-llvm-4c73e594753f496e85159afdcb1c6323391c6d4b.tar.gz bcm5719-llvm-4c73e594753f496e85159afdcb1c6323391c6d4b.zip |
[ms-abi] Reordering __declspec(align) pragma pack handling
This patch moves the check for pragma pack until after the application
of __declspec align to before pragma pack. This causes observable
changes in the use of tail padding for bases. A test case is included.
llvm-svn: 199154
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index e9289a0f055..fd0a4630125 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2186,9 +2186,6 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo( Context.getTypeInfoInChars(FD->getType()); if (FD->isBitField() && FD->getMaxAlignment() != 0) Info.Alignment = std::max(Info.Alignment, FieldRequiredAlignment); - // Respect pragma pack. - if (!MaxFieldAlignment.isZero()) - Info.Alignment = std::min(Info.Alignment, MaxFieldAlignment); } // Respect packed field attribute. if (FD->hasAttr<PackedAttr>()) @@ -2200,6 +2197,9 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo( // Capture required alignment as a side-effect. RequiredAlignment = std::max(RequiredAlignment, FieldRequiredAlignment); } + // Respect pragma pack. + if (!MaxFieldAlignment.isZero()) + Info.Alignment = std::min(Info.Alignment, MaxFieldAlignment); // TODO: Add a Sema warning that MS ignores bitfield alignment in unions. if (!(FD->isBitField() && IsUnion)) Alignment = std::max(Alignment, Info.Alignment); |