aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/lambda.c9
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-generic-this3.C13
4 files changed, 23 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a410446..e7780e7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
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.
* lambda.c (is_normal_capture_proxy): Check DECL_CAPTURED_VARIABLE.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 879712f..91bc82b 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -7151,7 +7151,7 @@ extern bool is_capture_proxy (tree);
extern bool is_normal_capture_proxy (tree);
extern bool is_constant_capture_proxy (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 tree maybe_resolve_dummy (tree, bool);
extern tree current_nonlambda_function (void);
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index 7032168..d178f15 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -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
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
-lambda_expr_this_capture (tree lambda, bool add_capture_p)
+lambda_expr_this_capture (tree lambda, int add_capture_p)
{
tree result;
@@ -829,7 +830,7 @@ lambda_expr_this_capture (tree lambda, bool add_capture_p)
result = this_capture;
else if (!this_capture)
{
- if (add_capture_p)
+ if (add_capture_p == 1)
{
error ("%<this%> was not captured for this lambda function");
result = error_mark_node;
@@ -934,7 +935,7 @@ maybe_generic_this_capture (tree object, tree fns)
&& DECL_NONSTATIC_MEMBER_FUNCTION_P (*iter))
{
/* Found a non-static member. Capture this. */
- lambda_expr_this_capture (lam, true);
+ lambda_expr_this_capture (lam, /*maybe*/-1);
break;
}
}
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-this3.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-this3.C
new file mode 100644
index 0000000..2bd287c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-this3.C
@@ -0,0 +1,13 @@
+// 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
+ }
+};