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
This commit is contained in:
Ville Voutilainen 2014-05-21 20:23:07 +03:00 committed by Jason Merrill
parent 2acb102792
commit 174ebf6562
4 changed files with 40 additions and 19 deletions

View 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

View 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. */

View 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" }
}

View File

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