From 22ee1a7466ca57ecbab2af5469e95fcf11e91232 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Wed, 9 Sep 2015 20:57:59 +0000 Subject: [PATCH] [MS ABI] Don't crash on references to pointers to members in args 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. llvm-svn: 247188 --- clang/lib/CodeGen/CGCall.cpp | 4 ++-- clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index ef9095291cdf..b54264b5054f 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -1586,7 +1586,7 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, if (const auto *RefTy = RetTy->getAs()) { 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()) { 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) diff --git a/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp b/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp index 27a2a5fc9c16..25d7c7702da0 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp @@ -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"( +}