aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-09-22 15:22:11 -0400
committerJason Merrill <jason@gcc.gnu.org>2014-09-22 15:22:11 -0400
commita546927c6a9a06b25ae85f8206b2c7afc53f4a45 (patch)
treec400f29d211f1ef321ecdd015d159c8337af81b3 /gcc
parent05424ee6ec0d20b028649cce108ed442863f1063 (diff)
downloadgcc-a546927c6a9a06b25ae85f8206b2c7afc53f4a45.zip
gcc-a546927c6a9a06b25ae85f8206b2c7afc53f4a45.tar.gz
gcc-a546927c6a9a06b25ae85f8206b2c7afc53f4a45.tar.bz2
re PR c++/63320 (bogus ‘this’ was not captured for this lambda function error)
PR c++/63320 PR c++/60463 PR c++/60755 * lambda.c (maybe_resolve_dummy, lambda_expr_this_capture): Handle not finding 'this'. From-SVN: r215478
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/lambda.c8
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this19.C11
4 files changed, 26 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7d23a77..f209e15 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2014-09-22 Jason Merrill <jason@redhat.com>
+
+ PR c++/63320
+ PR c++/60463
+ PR c++/60755
+ * lambda.c (maybe_resolve_dummy, lambda_expr_this_capture): Handle
+ not finding 'this'.
+
2014-09-22 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/62219
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index 0d8d455..17fd037 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -724,7 +724,8 @@ lambda_expr_this_capture (tree lambda, bool add_capture_p)
if (!this_capture)
{
- error ("%<this%> was not captured for this lambda function");
+ if (add_capture_p)
+ error ("%<this%> was not captured for this lambda function");
result = error_mark_node;
}
else
@@ -768,8 +769,9 @@ maybe_resolve_dummy (tree object, bool add_capture_p)
/* In a lambda, need to go through 'this' capture. */
tree lam = CLASSTYPE_LAMBDA_EXPR (current_class_type);
tree cap = lambda_expr_this_capture (lam, add_capture_p);
- object = build_x_indirect_ref (EXPR_LOCATION (object), cap,
- RO_NULL, tf_warning_or_error);
+ if (cap != error_mark_node)
+ object = build_x_indirect_ref (EXPR_LOCATION (object), cap,
+ RO_NULL, tf_warning_or_error);
}
return object;
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C
index 03a7a4b..9c76d34 100644
--- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C
@@ -3,7 +3,7 @@
class Klass
{
- unsigned int local;
+ unsigned int local; // { dg-error "non-static" }
public:
bool dostuff();
};
@@ -11,7 +11,7 @@ public:
bool Klass::dostuff()
{
auto f = []() -> bool {
- if (local & 1) { return true; } // { dg-error "not captured" }
+ if (local & 1) { return true; } // { dg-error "not captured|this location" }
return false;
};
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this19.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this19.C
new file mode 100644
index 0000000..c4c041f8b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this19.C
@@ -0,0 +1,11 @@
+// PR c++/63320
+// { dg-do compile { target c++11 } }
+
+class A {
+ static void addWindow();
+ static void activateWindow(void *);
+};
+void A::addWindow() {
+ int* action {};
+ [action] { activateWindow(action); };
+}