re PR c++/50736 ([C++0x] ISO_IEC_14882-2011-5.1.2/10 - bug)

PR c++/50736
	* parser.c (cp_parser_lambda_introducer): Check for more
	invalid captures.

From-SVN: r180105
This commit is contained in:
Jason Merrill 2011-10-17 14:59:41 -04:00 committed by Jason Merrill
parent 7c3297ce40
commit c6334ca906
4 changed files with 51 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2011-10-17 Jason Merrill <jason@redhat.com>
PR c++/50736
* parser.c (cp_parser_lambda_introducer): Check for more
invalid captures.
2011-10-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/44524

View File

@ -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)
{

View File

@ -1,3 +1,8 @@
2011-10-17 Jason Merrill <jason@redhat.com>
PR c++/50736
* g++.dg/cpp0x/lambda/lambda-capture-neg.C: New.
2011-10-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/44524

View File

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