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:
parent
2acb102792
commit
174ebf6562
@ -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
|
||||
|
@ -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. */
|
||||
|
@ -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" }
|
||||
}
|
||||
|
26
gcc/testsuite/g++.dg/cpp1y/lambda-init8.C
Normal file
26
gcc/testsuite/g++.dg/cpp1y/lambda-init8.C
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user