From: Argyrios Kyrtzidis Date: Thu, 9 Dec 2010 02:47:58 +0000 (+0000) Subject: Fix another unnecessary-struct-padding issue. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a821198203bdd469175408c4c4c805cc3240159;p=clang Fix another unnecessary-struct-padding issue. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@121352 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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]; + +}