Fix another unnecessary-struct-padding issue.

llvm-svn: 121352
This commit is contained in:
Argyrios Kyrtzidis 2010-12-09 02:47:58 +00:00
parent 2a2e65c452
commit d62c9be4fc
2 changed files with 29 additions and 2 deletions

View File

@ -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 *

View File

@ -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];
}