]> granicus.if.org Git - clang/commitdiff
Fix another unnecessary-struct-padding issue.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 9 Dec 2010 02:47:58 +0000 (02:47 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 9 Dec 2010 02:47:58 +0000 (02:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@121352 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/RecordLayoutBuilder.cpp
test/SemaCXX/pragma-pack.cpp

index b1114253fc82ead80481eff966a6fa40dd805199..34d4a7e5865b6f3fb9df9b63275a588c56a23d9c 100644 (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 *
index c388bd41af68b9401b4a17513580a4b0f6ae62ab..1bc738b087a94c1d15f72e58fc6df868277a72d2 100644 (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];
+
+}