Commit e9f389f0 by Jason Merrill Committed by Jason Merrill

re PR c++/44160 ([C++0x] a mysterious error on __func__ in a lambda expression)

	PR c++/44160
	* parser.c (cp_parser_lambda_body): Share code between
	simple and complex cases instead of using cp_parser_function_body.

From-SVN: r175123
parent fa54bbb7
2011-06-16 Jason Merrill <jason@redhat.com> 2011-06-16 Jason Merrill <jason@redhat.com>
PR c++/44160
* parser.c (cp_parser_lambda_body): Share code between
simple and complex cases instead of using cp_parser_function_body.
PR c++/45378 PR c++/45378
* decl.c (check_initializer): Check narrowing. * decl.c (check_initializer): Check narrowing.
......
...@@ -7731,6 +7731,7 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr) ...@@ -7731,6 +7731,7 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
tree fco = lambda_function (lambda_expr); tree fco = lambda_function (lambda_expr);
tree body; tree body;
bool done = false; bool done = false;
tree compound_stmt;
/* Let the front end know that we are going to be defining this /* Let the front end know that we are going to be defining this
function. */ function. */
...@@ -7741,6 +7742,11 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr) ...@@ -7741,6 +7742,11 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
start_lambda_scope (fco); start_lambda_scope (fco);
body = begin_function_body (); body = begin_function_body ();
if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
goto out;
compound_stmt = begin_compound_stmt (0);
/* 5.1.1.4 of the standard says: /* 5.1.1.4 of the standard says:
If a lambda-expression does not include a trailing-return-type, it If a lambda-expression does not include a trailing-return-type, it
is as if the trailing-return-type denotes the following type: is as if the trailing-return-type denotes the following type:
...@@ -7757,11 +7763,9 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr) ...@@ -7757,11 +7763,9 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
in the body. Since we used void as the placeholder return type, parsing in the body. Since we used void as the placeholder return type, parsing
the body as usual will give such desired behavior. */ the body as usual will give such desired behavior. */
if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr) if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr)
&& cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE) && cp_lexer_peek_nth_token (parser->lexer, 1)->keyword == RID_RETURN
&& cp_lexer_peek_nth_token (parser->lexer, 2)->keyword == RID_RETURN && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SEMICOLON)
&& cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_SEMICOLON)
{ {
tree compound_stmt;
tree expr = NULL_TREE; tree expr = NULL_TREE;
cp_id_kind idk = CP_ID_KIND_NONE; cp_id_kind idk = CP_ID_KIND_NONE;
...@@ -7769,7 +7773,6 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr) ...@@ -7769,7 +7773,6 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
statement. */ statement. */
cp_parser_parse_tentatively (parser); cp_parser_parse_tentatively (parser);
cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
cp_parser_require_keyword (parser, RID_RETURN, RT_RETURN); cp_parser_require_keyword (parser, RID_RETURN, RT_RETURN);
expr = cp_parser_expression (parser, /*cast_p=*/false, &idk); expr = cp_parser_expression (parser, /*cast_p=*/false, &idk);
...@@ -7781,10 +7784,8 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr) ...@@ -7781,10 +7784,8 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
{ {
apply_lambda_return_type (lambda_expr, lambda_return_type (expr)); apply_lambda_return_type (lambda_expr, lambda_return_type (expr));
compound_stmt = begin_compound_stmt (0);
/* Will get error here if type not deduced yet. */ /* Will get error here if type not deduced yet. */
finish_return_stmt (expr); finish_return_stmt (expr);
finish_compound_stmt (compound_stmt);
done = true; done = true;
} }
...@@ -7794,12 +7795,16 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr) ...@@ -7794,12 +7795,16 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
{ {
if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr)) if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr))
LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = true; LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = true;
/* TODO: does begin_compound_stmt want BCS_FN_BODY? while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
cp_parser_compound_stmt does not pass it. */ cp_parser_label_declaration (parser);
cp_parser_function_body (parser); cp_parser_statement_seq_opt (parser, NULL_TREE);
cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = false; LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = false;
} }
finish_compound_stmt (compound_stmt);
out:
finish_function_body (body); finish_function_body (body);
finish_lambda_scope (); finish_lambda_scope ();
......
2011-06-16 Jason Merrill <jason@redhat.com> 2011-06-16 Jason Merrill <jason@redhat.com>
PR c++/44160
* g++.dg/cpp0x/lambda/lambda-__func__.C: New.
PR c++/45378 PR c++/45378
* g++.dg/cpp0x/initlist52.C New. * g++.dg/cpp0x/initlist52.C New.
......
// PR c++/44160
// { dg-options -std=c++0x }
// { dg-do link }
int main()
{
const char *p = []() { return __func__; }();
return p == 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment