From b9f4d0f4bcb51fead6d62dafef5cfab023af7414 Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 17 Oct 2011 18:59:41 +0000 Subject: [PATCH] PR c++/50736 * parser.c (cp_parser_lambda_introducer): Check for more invalid captures. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180105 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 +++++ gcc/cp/parser.c | 29 +++++++++++++++++++--- gcc/testsuite/ChangeLog | 5 ++++ .../g++.dg/cpp0x/lambda/lambda-capture-neg.C | 15 +++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 453dce15d48..ed7d832c936 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-10-17 Jason Merrill + + PR c++/50736 + * parser.c (cp_parser_lambda_introducer): Check for more + invalid captures. + 2011-10-17 Paolo Carlini PR c++/44524 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index ea0c4dc2ab6..bf362f23d18 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -7630,6 +7630,31 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr) /*ambiguous_decls=*/NULL, capture_token->location); + if (capture_init_expr == error_mark_node) + { + unqualified_name_lookup_error (capture_id); + continue; + } + else if (DECL_P (capture_init_expr) + && (TREE_CODE (capture_init_expr) != VAR_DECL + && TREE_CODE (capture_init_expr) != PARM_DECL)) + { + error_at (capture_token->location, + "capture of non-variable %qD ", + capture_init_expr); + inform (0, "%q+#D declared here", capture_init_expr); + continue; + } + if (TREE_CODE (capture_init_expr) == VAR_DECL + && decl_storage_duration (capture_init_expr) != dk_auto) + { + pedwarn (capture_token->location, 0, "capture of variable " + "%qD with non-automatic storage duration", + capture_init_expr); + inform (0, "%q+#D declared here", capture_init_expr); + continue; + } + capture_init_expr = finish_id_expression (capture_id, @@ -7647,10 +7672,6 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr) capture_token->location); } - if (TREE_CODE (capture_init_expr) == IDENTIFIER_NODE) - capture_init_expr - = unqualified_name_lookup_error (capture_init_expr); - if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) != CPLD_NONE && !explicit_init_p) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3a6edad480e..3a3cef9199d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-10-17 Jason Merrill + + PR c++/50736 + * g++.dg/cpp0x/lambda/lambda-capture-neg.C: New. + 2011-10-17 Paolo Carlini PR c++/44524 diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C new file mode 100644 index 00000000000..82cc98423ee --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C @@ -0,0 +1,15 @@ +// PR c++/50736 +// { dg-options "-std=c++0x -pedantic-errors" } + +int i; +void f(); +typedef int T; + +int main() +{ + [i]{}; // { dg-error "non-automatic" } + [f]{}; // { dg-error "non-variable" } + [T]{}; // { dg-error "non-variable" } +} + +struct A { }; -- 2.11.4.GIT