diff options
author | Warren Hunt <whunt@google.com> | 2014-01-10 23:32:32 +0000 |
---|---|---|
committer | Warren Hunt <whunt@google.com> | 2014-01-10 23:32:32 +0000 |
commit | 87c2b0400d0675ad68d7e3d5b4e7e81508ba3c51 (patch) | |
tree | 90b7422ab1b650eeccfbafb01902d6c628532de0 /clang/lib/AST/RecordLayoutBuilder.cpp | |
parent | b8912b4f28393cef48d149ccd1b5ea5be09a13bf (diff) | |
download | bcm5719-llvm-87c2b0400d0675ad68d7e3d5b4e7e81508ba3c51.tar.gz bcm5719-llvm-87c2b0400d0675ad68d7e3d5b4e7e81508ba3c51.zip |
[ms-abi] Adjusting Rules for Padding Between Bases
The presence of a VBPtr suppresses the presence of zero sized
sub-objects in the non-virtual portion of the object in the context of
determining if two base objects need alias-avoidance padding placed
between them.
Test cases included.
llvm-svn: 198975
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 30293c27c17..6a708a7e8d7 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2477,6 +2477,9 @@ void MicrosoftRecordLayoutBuilder::injectVBPtr(const CXXRecordDecl *RD) { i->second += Offset; // Update the object alignment. updateAlignment(PointerInfo.Alignment); + // The presence of a vbptr suppresses zero sized objects that are not in + // virtual bases. + HasZeroSizedSubObject = false; } void MicrosoftRecordLayoutBuilder::injectVFPtr(const CXXRecordDecl *RD) { @@ -2566,6 +2569,9 @@ void MicrosoftRecordLayoutBuilder::injectVPtrs(const CXXRecordDecl *RD) { } } layoutFields(RD); + // The presence of a vbptr suppresses zero sized objects that are not in + // virtual bases. + HasZeroSizedSubObject = false; } void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) { |