diff options
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r-- | gcc/cp/parser.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 75b7bdb..eac60f1 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -8416,9 +8416,8 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr) if (LAMBDA_EXPR_RETURN_TYPE (lambda_expr)) return_type_specs.type = LAMBDA_EXPR_RETURN_TYPE (lambda_expr); else - /* Maybe we will deduce the return type later, but we can use void - as a placeholder return type anyways. */ - return_type_specs.type = void_type_node; + /* Maybe we will deduce the return type later. */ + return_type_specs.type = make_auto (); p = obstack_alloc (&declarator_obstack, 0); @@ -8539,7 +8538,8 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr) if (cp_parser_parse_definitely (parser)) { - apply_lambda_return_type (lambda_expr, lambda_return_type (expr)); + if (!processing_template_decl) + apply_deduced_return_type (fco, lambda_return_type (expr)); /* Will get error here if type not deduced yet. */ finish_return_stmt (expr); @@ -8550,13 +8550,10 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr) if (!done) { - if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr)) - LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = true; while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL)) cp_parser_label_declaration (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; } finish_compound_stmt (compound_stmt); @@ -11275,8 +11272,14 @@ cp_parser_conversion_type_id (cp_parser* parser) if (! cp_parser_uncommitted_to_tentative_parse_p (parser) && type_uses_auto (type_specified)) { - error ("invalid use of %<auto%> in conversion operator"); - return error_mark_node; + if (cxx_dialect < cxx1y) + { + error ("invalid use of %<auto%> in conversion operator"); + return error_mark_node; + } + else if (template_parm_scope_p ()) + warning (0, "use of %<auto%> in member template " + "conversion operator can never be deduced"); } return type_specified; |