aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-12-09 02:47:58 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-12-09 02:47:58 +0000
commit5a821198203bdd469175408c4c4c805cc3240159 (patch)
treeb02a63dc1573d8e7b6e97d61a482a28dcbc67d65
parente8b3de090b9de3c27c5d381e767217ddb849d5d8 (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.cpp11
-rw-r--r--test/SemaCXX/pragma-pack.cpp20
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];
+
+}