From 174ebf656274b6119c13a730294241fd5c0efb55 Mon Sep 17 00:00:00 2001 From: Ville Voutilainen Date: Wed, 21 May 2014 20:23:07 +0300 Subject: [PATCH] re PR c++/61133 (g++ doesn't implement DR1760) PR c++/61133 * lambda.c (build_capture_proxy, add_capture): Treat normal captures and init-captures identically. From-SVN: r210720 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/lambda.c | 21 ++++++------------ gcc/testsuite/g++.dg/cpp1y/lambda-init6.C | 6 ++---- gcc/testsuite/g++.dg/cpp1y/lambda-init8.C | 26 +++++++++++++++++++++++ 4 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-init8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b0a06b1df83..d90e6e3bf90 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-05-21 Ville Voutilainen + + PR c++/61133 + * lambda.c (build_capture_proxy, add_capture): Treat normal + captures and init-captures identically. + 2014-05-21 Mark Wielaard PR debug/16063 diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 3ce9ebb7f1f..bb6014b23d0 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -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. */ diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init6.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init6.C index 2b82bca4578..e2530004f5c 100644 --- a/gcc/testsuite/g++.dg/cpp1y/lambda-init6.C +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-init6.C @@ -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 index 00000000000..3a61b74eaed --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-init8.C @@ -0,0 +1,26 @@ +// DR1760: "no additional copy and destruction is performed" +// { dg-do run { target c++1y } } + +#include + +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); +}