The fix for 60463 didn't handle properly the case where we don't find a 'this' at all.

Tested x86_64-pc-linux-gnu, applying to trunk.
commit 7ef1880eec81f1c3914f6e018e709224a64fefc1
Author: Jason Merrill <ja...@redhat.com>
Date:   Mon Sep 22 13:21:16 2014 -0400

    	PR c++/63320
    	PR c++/60463
    	PR c++/60755
    	* lambda.c (maybe_resolve_dummy, lambda_expr_this_capture): Handle
    	not finding 'this'.

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); };
+}

Reply via email to