r373553 - PR43519: don't inject a diagnostic when constant-evaulation of a
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 2 18:20:27 PDT 2019
Author: rsmith
Date: Wed Oct 2 18:20:27 2019
New Revision: 373553
URL: http://llvm.org/viewvc/llvm-project?rev=373553&view=rev
Log:
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.
Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=373553&r1=373552&r2=373553&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Wed Oct 2 18:20:27 2019
@@ -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;
Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp?rev=373553&r1=373552&r2=373553&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp (original)
+++ cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp Wed Oct 2 18:20:27 2019
@@ -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 {
More information about the cfe-commits
mailing list