]> granicus.if.org Git - clang/commitdiff
[MS ABI] Don't crash on references to pointers to members in args
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 9 Sep 2015 20:57:59 +0000 (20:57 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 9 Sep 2015 20:57:59 +0000 (20:57 +0000)
We know that a reference can always be dereferenced.  However, we don't
always know the number of bytes if the reference's pointee type is
incomplete.  This case was correctly handled but we didn't consider the
case where the type is complete but we cannot calculate its size for ABI
specific reasons.  In this specific case, a member pointer's size is
available only under certain conditions.

This fixes PR24703.

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

lib/CodeGen/CGCall.cpp
test/CodeGenCXX/microsoft-abi-member-pointers.cpp

index ef9095291cdf8c6ac9cae83384b864e0acc86b6b..b54264b5054f98a2e23198605d6ab77db2a66bb5 100644 (file)
@@ -1586,7 +1586,7 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
 
   if (const auto *RefTy = RetTy->getAs<ReferenceType>()) {
     QualType PTy = RefTy->getPointeeType();
-    if (!PTy->isIncompleteType() && PTy->isConstantSizeType())
+    if (getCXXABI().isTypeInfoCalculable(PTy) && PTy->isConstantSizeType())
       RetAttrs.addDereferenceableAttr(getContext().getTypeSizeInChars(PTy)
                                         .getQuantity());
     else if (getContext().getTargetAddressSpace(PTy) == 0)
@@ -1698,7 +1698,7 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
 
     if (const auto *RefTy = ParamType->getAs<ReferenceType>()) {
       QualType PTy = RefTy->getPointeeType();
-      if (!PTy->isIncompleteType() && PTy->isConstantSizeType())
+      if (getCXXABI().isTypeInfoCalculable(PTy) && PTy->isConstantSizeType())
         Attrs.addDereferenceableAttr(getContext().getTypeSizeInChars(PTy)
                                        .getQuantity());
       else if (getContext().getTargetAddressSpace(PTy) == 0)
index 27a2a5fc9c16924d0a9de6358b543c82533156ec..25d7c7702da027fa9f17b0ec1eb7bad76f9085e4 100644 (file)
@@ -745,4 +745,10 @@ void foo_fun() {
   // CHECK: store i8* bitcast (void (%class.CA*)* @"\01?OnHelp@CA@@QAEXXZ" to i8*), i8**
   f func = (f)&CA::OnHelp;
 }
+namespace PR24703 {
+struct S;
+
+void f(int S::*&p) {}
+// CHECK-LABEL: define void @"\01?f@PR24703@@YAXAAPQS@1@H@Z"(
+}