re PR c++/61133 (g++ doesn't implement DR1760)
authorVille Voutilainen <ville.voutilainen@gmail.com>
Wed, 21 May 2014 17:23:07 +0000 (20:23 +0300)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 21 May 2014 17:23:07 +0000 (13:23 -0400)
PR c++/61133
* lambda.c (build_capture_proxy, add_capture): Treat normal
captures and init-captures identically.

From-SVN: r210720

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

index b0a06b1..d90e6e3 100644 (file)
@@ -1,3 +1,9 @@
+2014-05-21  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       PR c++/61133
+       * lambda.c (build_capture_proxy, add_capture): Treat normal
+       captures and init-captures identically.
+
 2014-05-21  Mark Wielaard  <mjw@redhat.com>
 
        PR debug/16063
index 3ce9ebb..bb6014b 100644 (file)
@@ -367,10 +367,7 @@ build_capture_proxy (tree member)
     object = TREE_OPERAND (object, 0);
 
   /* Remove the __ inserted by add_capture.  */
-  if (DECL_NORMAL_CAPTURE_P (member))
-    name = get_identifier (IDENTIFIER_POINTER (DECL_NAME (member)) + 2);
-  else
-    name = DECL_NAME (member);
+  name = get_identifier (IDENTIFIER_POINTER (DECL_NAME (member)) + 2);
 
   type = lambda_proxy_type (object);
 
@@ -500,17 +497,11 @@ add_capture (tree lambda, tree id, tree orig_init, bool by_reference_p,
      won't find the field with name lookup.  We can't just leave the name
      unset because template instantiation uses the name to find
      instantiated fields.  */
-  if (!explicit_init_p)
-    {
-      buf = (char *) alloca (IDENTIFIER_LENGTH (id) + 3);
-      buf[1] = buf[0] = '_';
-      memcpy (buf + 2, IDENTIFIER_POINTER (id),
-             IDENTIFIER_LENGTH (id) + 1);
-      name = get_identifier (buf);
-    }
-  else
-    /* But captures with explicit initializers are named.  */
-    name = id;
+  buf = (char *) alloca (IDENTIFIER_LENGTH (id) + 3);
+  buf[1] = buf[0] = '_';
+  memcpy (buf + 2, IDENTIFIER_POINTER (id),
+         IDENTIFIER_LENGTH (id) + 1);
+  name = get_identifier (buf);
 
   /* If TREE_TYPE isn't set, we're still in the introducer, so check
      for duplicates.  */
index 2b82bca..e253000 100644 (file)
@@ -1,12 +1,10 @@
-// Test that simple captures are not named in the closure type, but
-// initialized captures are named.
+// Test that captures are not named in the closure type.
 // { dg-do compile { target c++1y } }
 
 int main()
 {
   int i;
   auto lam = [i,j=42]{};
-  lam.j;
-  lam.j.foo;                   // { dg-error "::j" }
+  lam.j;                        // { dg-error "no member" }
   lam.i;                       // { dg-error "no member" }
 }
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init8.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init8.C
new file mode 100644 (file)
index 0000000..3a61b74
--- /dev/null
@@ -0,0 +1,26 @@
+// DR1760: "no additional copy and destruction is performed"
+// { dg-do run { target c++1y } }
+
+#include <cassert>
+
+int copy_count = 0;
+int dtor_count = 0;
+
+struct X
+{
+  X() = default;
+  X(const X&) { ++copy_count; }
+  ~X() { ++dtor_count; }
+};
+
+int main()
+{
+  {
+    X x;
+    auto z = [y = x](){};
+    X x2;
+    auto z2 = [x2](){};
+    assert(copy_count == 2);
+  }
+  assert(dtor_count == 4);
+}