PR43519: don't inject a diagnostic when constant-evaulation of a

pointer-to-member call can't determine a callee.

We will have produced a diagnostic already if the callee is known to be
unevaluatable, and diagnosing here rejects valid code during potential
constant expression checking.

llvm-svn: 373553
This commit is contained in:
Richard Smith 2019-10-03 01:20:27 +00:00
parent 30c8df02ba
commit 5258202a81
2 changed files with 10 additions and 2 deletions

View File

@ -6845,8 +6845,11 @@ public:
HasQualifier = ME->hasQualifier();
} else if (const BinaryOperator *BE = dyn_cast<BinaryOperator>(Callee)) {
// Indirect bound member calls ('.*' or '->*').
Member = dyn_cast_or_null<CXXMethodDecl>(
HandleMemberPointerAccess(Info, BE, ThisVal, false));
const ValueDecl *D =
HandleMemberPointerAccess(Info, BE, ThisVal, false);
if (!D)
return false;
Member = dyn_cast<CXXMethodDecl>(D);
if (!Member)
return Error(Callee);
This = &ThisVal;

View File

@ -1108,6 +1108,11 @@ namespace MemberPointer {
static_assert((int Derived::*)(int Mid<0>::*)&Mid<0>::n !=
(int Derived::*)(int Mid<1>::*)&Mid<1>::n, "");
static_assert(&Mid<0>::n == (int Mid<0>::*)&Base::n, "");
constexpr int apply(const A &a, int (A::*f)() const) {
return (a.*f)();
}
static_assert(apply(A(2), &A::f) == 5, "");
}
namespace ArrayBaseDerived {