diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-12-09 02:47:58 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-12-09 02:47:58 +0000 |
commit | 5a821198203bdd469175408c4c4c805cc3240159 (patch) | |
tree | b02a63dc1573d8e7b6e97d61a482a28dcbc67d65 | |
parent | e8b3de090b9de3c27c5d381e767217ddb849d5d8 (diff) |
Fix another unnecessary-struct-padding issue.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@121352 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/RecordLayoutBuilder.cpp | 11 | ||||
-rw-r--r-- | test/SemaCXX/pragma-pack.cpp | 20 |
2 files changed, 29 insertions, 2 deletions
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index b1114253fc..34d4a7e586 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -807,8 +807,17 @@ void RecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) { Size += GetVirtualPointersSize(RD); DataSize = Size; + unsigned UnpackedBaseAlign = Context.Target.getPointerAlign(0); + unsigned BaseAlign = (Packed) ? 8 : UnpackedBaseAlign; + + // The maximum field alignment overrides base align. + if (MaxFieldAlignment) { + BaseAlign = std::min(BaseAlign, MaxFieldAlignment); + UnpackedBaseAlign = std::min(UnpackedBaseAlign, MaxFieldAlignment); + } + // Update the alignment. - UpdateAlignment(Context.Target.getPointerAlign(0)); + UpdateAlignment(BaseAlign, UnpackedBaseAlign); } BaseSubobjectInfo * diff --git a/test/SemaCXX/pragma-pack.cpp b/test/SemaCXX/pragma-pack.cpp index c388bd41af..1bc738b087 100644 --- a/test/SemaCXX/pragma-pack.cpp +++ b/test/SemaCXX/pragma-pack.cpp @@ -6,11 +6,29 @@ struct Base { int i; }; -#pragma pack(1) +#pragma pack(push, 1) struct Sub : public Base { char c; }; +#pragma pack(pop) int check[sizeof(Sub) == 5 ? 1 : -1]; } + +namespace check2 { + +struct Base { + virtual ~Base(); + int x; +}; + +#pragma pack(push, 1) +struct Sub : virtual Base { + char c; +}; +#pragma pack(pop) + +int check[sizeof(Sub) == 13 ? 1 : -1]; + +} |