Commit 9adf74a3 by Jason Merrill Committed by Jason Merrill

PR c++/87685 - generic lambda 'this' capture error.

The standard says that in a generic lambda we should speculatively capture
'this' if we see a call to an overload set that contains a non-static member
function, but it seems wrong to reject the program if we can't capture,
since it might not actually be needed.

	* lambda.c (lambda_expr_this_capture): Change add_capture_p to int.
	(maybe_generic_this_capture): Pass -1.

From-SVN: r269095
parent d36b4bf7
2019-02-21 Jason Merrill <jason@redhat.com> 2019-02-21 Jason Merrill <jason@redhat.com>
PR c++/87685 - generic lambda 'this' capture error.
* lambda.c (lambda_expr_this_capture): Change add_capture_p to int.
(maybe_generic_this_capture): Pass -1.
PR c++/88394 - ICE with VLA init-capture. PR c++/88394 - ICE with VLA init-capture.
* lambda.c (is_normal_capture_proxy): Check DECL_CAPTURED_VARIABLE. * lambda.c (is_normal_capture_proxy): Check DECL_CAPTURED_VARIABLE.
......
...@@ -7151,7 +7151,7 @@ extern bool is_capture_proxy (tree); ...@@ -7151,7 +7151,7 @@ extern bool is_capture_proxy (tree);
extern bool is_normal_capture_proxy (tree); extern bool is_normal_capture_proxy (tree);
extern bool is_constant_capture_proxy (tree); extern bool is_constant_capture_proxy (tree);
extern void register_capture_members (tree); extern void register_capture_members (tree);
extern tree lambda_expr_this_capture (tree, bool); extern tree lambda_expr_this_capture (tree, int);
extern void maybe_generic_this_capture (tree, tree); extern void maybe_generic_this_capture (tree, tree);
extern tree maybe_resolve_dummy (tree, bool); extern tree maybe_resolve_dummy (tree, bool);
extern tree current_nonlambda_function (void); extern tree current_nonlambda_function (void);
......
...@@ -730,10 +730,11 @@ add_default_capture (tree lambda_stack, tree id, tree initializer) ...@@ -730,10 +730,11 @@ add_default_capture (tree lambda_stack, tree id, tree initializer)
/* Return the capture pertaining to a use of 'this' in LAMBDA, in the /* Return the capture pertaining to a use of 'this' in LAMBDA, in the
form of an INDIRECT_REF, possibly adding it through default form of an INDIRECT_REF, possibly adding it through default
capturing, if ADD_CAPTURE_P is true. */ capturing, if ADD_CAPTURE_P is nonzero. If ADD_CAPTURE_P is negative,
try to capture but don't complain if we can't. */
tree tree
lambda_expr_this_capture (tree lambda, bool add_capture_p) lambda_expr_this_capture (tree lambda, int add_capture_p)
{ {
tree result; tree result;
...@@ -829,7 +830,7 @@ lambda_expr_this_capture (tree lambda, bool add_capture_p) ...@@ -829,7 +830,7 @@ lambda_expr_this_capture (tree lambda, bool add_capture_p)
result = this_capture; result = this_capture;
else if (!this_capture) else if (!this_capture)
{ {
if (add_capture_p) if (add_capture_p == 1)
{ {
error ("%<this%> was not captured for this lambda function"); error ("%<this%> was not captured for this lambda function");
result = error_mark_node; result = error_mark_node;
...@@ -934,7 +935,7 @@ maybe_generic_this_capture (tree object, tree fns) ...@@ -934,7 +935,7 @@ maybe_generic_this_capture (tree object, tree fns)
&& DECL_NONSTATIC_MEMBER_FUNCTION_P (*iter)) && DECL_NONSTATIC_MEMBER_FUNCTION_P (*iter))
{ {
/* Found a non-static member. Capture this. */ /* Found a non-static member. Capture this. */
lambda_expr_this_capture (lam, true); lambda_expr_this_capture (lam, /*maybe*/-1);
break; break;
} }
} }
......
// PR c++/87685
// { dg-do compile { target c++14 } }
struct A
{
template <typename T> static void f(T) {}
void f() {}
void foo()
{
[] (auto&& v) { A::f(v); }; // OK if parameter type is specified
}
};
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