From 815d67c2ffc40783b2f898c8d7b145a4b56c20b8 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 15 Oct 2014 12:46:23 -0400 Subject: [PATCH] re PR c++/56710 (Using reserved double underscore variable name in a lambda causes internal compiler error) PR c++/56710 * semantics.c (finish_member_declaration): Don't push closure members. From-SVN: r216275 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/semantics.c | 6 ++++-- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C | 9 +++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d289bba4f328..1dec9eced874 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2014-10-15 Jason Merrill + PR c++/56710 + * semantics.c (finish_member_declaration): Don't push closure + members. + PR c++/58624 * pt.c (tsubst_copy_and_build) [VAR_DECL]: Use TLS wrapper. * semantics.c (finish_id_expression): Don't call TLS wrapper in a diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index cc9c550e19cc..30ec7fcf5653 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2735,8 +2735,10 @@ finish_member_declaration (tree decl) /*friend_p=*/0); } } - /* Enter the DECL into the scope of the class. */ - else if (pushdecl_class_level (decl)) + /* Enter the DECL into the scope of the class, if the class + isn't a closure (whose fields are supposed to be unnamed). */ + else if (CLASSTYPE_LAMBDA_EXPR (current_class_type) + || pushdecl_class_level (decl)) { if (TREE_CODE (decl) == USING_DECL) { diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C new file mode 100644 index 000000000000..df2b03705aeb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C @@ -0,0 +1,9 @@ +// PR c++/56710 +// { dg-options "-std=c++11 -Wall" } + +int main() +{ + int t = 0; + return [&]() -> int {int __t; __t = t; return __t; }(); + return [&t]() -> int {int __t; __t = t; return __t; }(); +} -- 2.47.2