Commit f1ad7bac by Jason Merrill

c++: Fix invalid pointer-to-member in requires [PR67825]

A recent change to cmcstl2 led to two tests failing due to this bug: our
valid expression checking in the context of a requires-expression wasn't
catching that an expression of member function type can only appear as the
function operand of a call expression.  Fixed by using convert_to_void to do
the same checking as a discarded-value expression.

This patch also fixes 67825, which already had a testcase, but the testcase
was testing for the wrong behavior.

gcc/cp/ChangeLog
2020-04-04  Jason Merrill  <jason@redhat.com>

	PR c++/67825
	* constraint.cc (tsubst_valid_expression_requirement): Call
	convert_to_void.
parent 9f143008
2020-04-04 Jason Merrill <jason@redhat.com>
PR c++/67825
* constraint.cc (tsubst_valid_expression_requirement): Call
convert_to_void.
2020-04-04 Jason Merrill <jason@redhat.com>
PR c++/94453
* constexpr.c (maybe_constant_value): Use break_out_target_exprs.
* expr.c (mark_use) [VIEW_CONVERT_EXPR]: Don't wrap a TARGET_EXPR in
......
......@@ -1864,7 +1864,10 @@ hash_placeholder_constraint (tree c)
static tree
tsubst_valid_expression_requirement (tree t, tree args, subst_info info)
{
return tsubst_expr (t, args, info.complain, info.in_decl, false);
tree r = tsubst_expr (t, args, info.complain, info.in_decl, false);
if (convert_to_void (r, ICV_STATEMENT, info.complain) == error_mark_node)
return error_mark_node;
return r;
}
......
// Make sure that the requirement fails because a .* expression of function
// type can only be used in a call.
// { dg-do compile { target concepts } }
template<class D, class T>
constexpr decltype(auto) invoke(D (T::*pmd), T&& t)
noexcept(noexcept(t.*pmd))
requires requires { t.*pmd; }
{ return t.*pmd; }
char invoke(...);
struct A
{
int f();
};
int main()
{
static_assert(sizeof(invoke (&A::f, A())) == 1);
}
......@@ -15,6 +15,6 @@ template <class X> concept bool C() {
}
int main() {
static_assert(C<A>());
static_assert(!C<A>());
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment