]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/69392 (G++ can't capture 'this' pointer to templated type using init-capture)
authorJason Merrill <jason@redhat.com>
Fri, 22 Jan 2016 20:36:30 +0000 (15:36 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 22 Jan 2016 20:36:30 +0000 (15:36 -0500)
PR c++/69392
* lambda.c (lambda_capture_field_type): Handle 'this' specially
for init-capture, too.

From-SVN: r232746

gcc/cp/ChangeLog
gcc/cp/lambda.c
gcc/testsuite/g++.dg/cpp1y/lambda-init14.C [new file with mode: 0644]

index af5c907713e7967f434b323fa4c7f51298fc2462..05ca52a2cbc7e4fe6a24b3976b62ca169028851c 100644 (file)
@@ -1,5 +1,9 @@
 2016-01-21  Jason Merrill  <jason@redhat.com>
 
+       PR c++/69392
+       * lambda.c (lambda_capture_field_type): Handle 'this' specially
+       for init-capture, too.
+
        PR c++/65687
        * decl.c (type_is_deprecated): Don't look into a typedef.
 
index 3b0ea182b2a55331f63d6d679e195eaf1528ce20..93b192c46f17249acb9bf5727251a57b5d0f8b49 100644 (file)
@@ -207,15 +207,8 @@ tree
 lambda_capture_field_type (tree expr, bool explicit_init_p)
 {
   tree type;
-  if (explicit_init_p)
-    {
-      type = make_auto ();
-      type = do_auto_deduction (type, expr, type);
-    }
-  else
-    type = non_reference (unlowered_expr_type (expr));
-  if (type_dependent_expression_p (expr)
-      && !is_this_parameter (tree_strip_nop_conversions (expr)))
+  bool is_this = is_this_parameter (tree_strip_nop_conversions (expr));
+  if (!is_this && type_dependent_expression_p (expr))
     {
       type = cxx_make_type (DECLTYPE_TYPE);
       DECLTYPE_TYPE_EXPR (type) = expr;
@@ -223,6 +216,13 @@ lambda_capture_field_type (tree expr, bool explicit_init_p)
       DECLTYPE_FOR_INIT_CAPTURE (type) = explicit_init_p;
       SET_TYPE_STRUCTURAL_EQUALITY (type);
     }
+  else if (!is_this && explicit_init_p)
+    {
+      type = make_auto ();
+      type = do_auto_deduction (type, expr, type);
+    }
+  else
+    type = non_reference (unlowered_expr_type (expr));
   return type;
 }
 
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init14.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init14.C
new file mode 100644 (file)
index 0000000..f7fffc5
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/69392
+// { dg-do compile { target c++14 } }
+
+template <typename T>
+class Foo {
+  public:
+    void foo(void) {}
+    auto getCallableFoo(void) {
+      return
+        [ptr = this]() { ptr->foo(); };
+    }
+};
+
+int main()
+{
+  Foo<int> f;
+  auto callable = f.getCallableFoo();
+  callable();
+}