summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorWarren Hunt <whunt@google.com>2014-01-13 22:25:55 +0000
committerWarren Hunt <whunt@google.com>2014-01-13 22:25:55 +0000
commit4c73e594753f496e85159afdcb1c6323391c6d4b (patch)
treebfd63f3883e1adf2f75b2352145aef7f5eb11687 /clang/lib/AST/RecordLayoutBuilder.cpp
parent859422a867320f122ad15fe1dd1d9c5107f63639 (diff)
downloadbcm5719-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.cpp6
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);
OpenPOWER on IntegriCloud