Commit 82a926bf by Jason Merrill Committed by Jason Merrill

PR c++/64095 - auto... parameter pack.

	* parser.c (cp_parser_parameter_declaration): Handle turning autos
	into packs here.
	(cp_parser_parameter_declaration_list): Not here.

From-SVN: r259015
parent 078c5aff
2018-04-02 Jason Merrill <jason@redhat.com>
PR c++/64095 - auto... parameter pack.
* parser.c (cp_parser_parameter_declaration): Handle turning autos
into packs here.
(cp_parser_parameter_declaration_list): Not here.
2018-03-31 Alexandre Oliva <aoliva@redhat.com> 2018-03-31 Alexandre Oliva <aoliva@redhat.com>
PR c++/85027 PR c++/85027
......
...@@ -21320,9 +21320,6 @@ cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error) ...@@ -21320,9 +21320,6 @@ cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error)
cp_parameter_declarator *parameter; cp_parameter_declarator *parameter;
tree decl = error_mark_node; tree decl = error_mark_node;
bool parenthesized_p = false; bool parenthesized_p = false;
int template_parm_idx = (function_being_declared_is_template_p (parser)?
TREE_VEC_LENGTH (INNERMOST_TEMPLATE_PARMS
(current_template_parms)) : 0);
/* Parse the parameter. */ /* Parse the parameter. */
parameter parameter
...@@ -21336,22 +21333,6 @@ cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error) ...@@ -21336,22 +21333,6 @@ cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error)
if (parameter) if (parameter)
{ {
/* If a function parameter pack was specified and an implicit template
parameter was introduced during cp_parser_parameter_declaration,
change any implicit parameters introduced into packs. */
if (parser->implicit_template_parms
&& parameter->declarator
&& parameter->declarator->parameter_pack_p)
{
int latest_template_parm_idx = TREE_VEC_LENGTH
(INNERMOST_TEMPLATE_PARMS (current_template_parms));
if (latest_template_parm_idx != template_parm_idx)
parameter->decl_specifiers.type = convert_generic_types_to_packs
(parameter->decl_specifiers.type,
template_parm_idx, latest_template_parm_idx);
}
decl = grokdeclarator (parameter->declarator, decl = grokdeclarator (parameter->declarator,
&parameter->decl_specifiers, &parameter->decl_specifiers,
PARM, PARM,
...@@ -21511,6 +21492,10 @@ cp_parser_parameter_declaration (cp_parser *parser, ...@@ -21511,6 +21492,10 @@ cp_parser_parameter_declaration (cp_parser *parser,
parser->type_definition_forbidden_message parser->type_definition_forbidden_message
= G_("types may not be defined in parameter types"); = G_("types may not be defined in parameter types");
int template_parm_idx = (function_being_declared_is_template_p (parser) ?
TREE_VEC_LENGTH (INNERMOST_TEMPLATE_PARMS
(current_template_parms)) : 0);
/* Parse the declaration-specifiers. */ /* Parse the declaration-specifiers. */
cp_token *decl_spec_token_start = cp_lexer_peek_token (parser->lexer); cp_token *decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
cp_parser_decl_specifier_seq (parser, cp_parser_decl_specifier_seq (parser,
...@@ -21600,6 +21585,23 @@ cp_parser_parameter_declaration (cp_parser *parser, ...@@ -21600,6 +21585,23 @@ cp_parser_parameter_declaration (cp_parser *parser,
parameter pack expansion expression. Otherwise, leave the ellipsis parameter pack expansion expression. Otherwise, leave the ellipsis
for a C-style variadic function. */ for a C-style variadic function. */
token = cp_lexer_peek_token (parser->lexer); token = cp_lexer_peek_token (parser->lexer);
/* If a function parameter pack was specified and an implicit template
parameter was introduced during cp_parser_parameter_declaration,
change any implicit parameters introduced into packs. */
if (parser->implicit_template_parms
&& (token->type == CPP_ELLIPSIS
|| (declarator && declarator->parameter_pack_p)))
{
int latest_template_parm_idx = TREE_VEC_LENGTH
(INNERMOST_TEMPLATE_PARMS (current_template_parms));
if (latest_template_parm_idx != template_parm_idx)
decl_specifiers.type = convert_generic_types_to_packs
(decl_specifiers.type,
template_parm_idx, latest_template_parm_idx);
}
if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)) if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
{ {
tree type = decl_specifiers.type; tree type = decl_specifiers.type;
// PR c++/64095
// { dg-do compile { target c++14 } }
void f()
{
[](auto...){}();
[](auto&&...){}();
}
...@@ -85,4 +85,4 @@ void Baz () ...@@ -85,4 +85,4 @@ void Baz ()
// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlPT_PT0_E4_Z3FoovEUlS1_S3_E5_EvRS0_RS2_:" } } // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlPT_PT0_E4_Z3FoovEUlS1_S3_E5_EvRS0_RS2_:" } }
// { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPfS3_E_EvRT_RT0_:" } } // { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPfS3_E_EvRT_RT0_:" } }
// { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPT_PT0_E0_EvRS3_RS5_:" } } // { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPT_PT0_E0_EvRS3_RS5_:" } }
// { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPT_zE1_EvRS3_RT0_:" } } // { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsDpPT_E1_EvRT_RT0_:" } }
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