]> granicus.if.org Git - clang/commitdiff
[CodeGen] Correctly handle base classes which are passed in memory
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 8 Jul 2015 05:14:29 +0000 (05:14 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 8 Jul 2015 05:14:29 +0000 (05:14 +0000)
We didn't correctly process the case where a base class is classified as
MEMORY.  This would cause us to trip over an assertion.

This fixes PR24020.

Differential Revision: http://reviews.llvm.org/D10907

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241667 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/TargetInfo.cpp
test/CodeGenCXX/x86_64-arguments.cpp

index dbb9e8d9039c426ba36889b99829b9097066ba3d..300d3c909f78b314cbfe137f1e8cafad34ff62bd 100644 (file)
@@ -2073,8 +2073,10 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
         classify(I.getType(), Offset, FieldLo, FieldHi, isNamedArg);
         Lo = merge(Lo, FieldLo);
         Hi = merge(Hi, FieldHi);
-        if (Lo == Memory || Hi == Memory)
-          break;
+        if (Lo == Memory || Hi == Memory) {
+          postMerge(Size, Lo, Hi);
+          return;
+        }
       }
     }
 
index 815ef6111a9ae1e4ce6bc39d6cb0330434c89c63..64202b4d02c64533425c765aead9775ea3b588a9 100644 (file)
@@ -196,3 +196,19 @@ namespace test9 {
     return sret;
   }
 }
+
+namespace test10 {
+#pragma pack(1)
+struct BasePacked {
+  char one;
+  short two;
+};
+#pragma pack()
+struct DerivedPacked : public BasePacked {
+  int three;
+};
+// CHECK-LABEL: define i32 @_ZN6test1020FuncForDerivedPackedENS_13DerivedPackedE({{.*}}* byval align 8
+int FuncForDerivedPacked(DerivedPacked d) {
+  return d.three;
+}
+}