Fix instantiation of implicit function template forward declarations.
* parser.c (cp_parser_init_declarator): Defer calling finish_fully_implicit_template for forward declarations until after other decl processing is complete. Cleanup for clarity: Extract 'else' case after 'if' containing unconditional return. From-SVN: r202850
This commit is contained in:
parent
1a4109b685
commit
7a9a6e2449
|
@ -1,3 +1,10 @@
|
|||
2013-09-23 Adam Butcher <adam@jessamine.co.uk>
|
||||
|
||||
* parser.c (cp_parser_init_declarator): Defer calling
|
||||
finish_fully_implicit_template for forward declarations until after
|
||||
other decl processing is complete. Cleanup for clarity: Extract 'else'
|
||||
case after 'if' containing unconditional return.
|
||||
|
||||
2013-09-23 Adam Butcher <adam@jessamine.co.uk>
|
||||
|
||||
* parser.c (make_generic_type_name): Spell generic type names '<autoN>'
|
||||
|
|
|
@ -16318,47 +16318,43 @@ cp_parser_init_declarator (cp_parser* parser,
|
|||
"a function-definition is not allowed here");
|
||||
return error_mark_node;
|
||||
}
|
||||
|
||||
location_t func_brace_location
|
||||
= cp_lexer_peek_token (parser->lexer)->location;
|
||||
|
||||
/* Neither attributes nor an asm-specification are allowed
|
||||
on a function-definition. */
|
||||
if (asm_specification)
|
||||
error_at (asm_spec_start_token->location,
|
||||
"an asm-specification is not allowed "
|
||||
"on a function-definition");
|
||||
if (attributes)
|
||||
error_at (attributes_start_token->location,
|
||||
"attributes are not allowed "
|
||||
"on a function-definition");
|
||||
/* This is a function-definition. */
|
||||
*function_definition_p = true;
|
||||
|
||||
/* Parse the function definition. */
|
||||
if (member_p)
|
||||
decl = cp_parser_save_member_function_body (parser,
|
||||
decl_specifiers,
|
||||
declarator,
|
||||
prefix_attributes);
|
||||
else
|
||||
decl =
|
||||
(cp_parser_function_definition_from_specifiers_and_declarator
|
||||
(parser, decl_specifiers, prefix_attributes, declarator));
|
||||
|
||||
if (decl != error_mark_node && DECL_STRUCT_FUNCTION (decl))
|
||||
{
|
||||
location_t func_brace_location
|
||||
= cp_lexer_peek_token (parser->lexer)->location;
|
||||
|
||||
/* Neither attributes nor an asm-specification are allowed
|
||||
on a function-definition. */
|
||||
if (asm_specification)
|
||||
error_at (asm_spec_start_token->location,
|
||||
"an asm-specification is not allowed "
|
||||
"on a function-definition");
|
||||
if (attributes)
|
||||
error_at (attributes_start_token->location,
|
||||
"attributes are not allowed "
|
||||
"on a function-definition");
|
||||
/* This is a function-definition. */
|
||||
*function_definition_p = true;
|
||||
|
||||
/* Parse the function definition. */
|
||||
if (member_p)
|
||||
decl = cp_parser_save_member_function_body (parser,
|
||||
decl_specifiers,
|
||||
declarator,
|
||||
prefix_attributes);
|
||||
else
|
||||
decl =
|
||||
(cp_parser_function_definition_from_specifiers_and_declarator
|
||||
(parser, decl_specifiers, prefix_attributes, declarator));
|
||||
|
||||
if (decl != error_mark_node && DECL_STRUCT_FUNCTION (decl))
|
||||
{
|
||||
/* This is where the prologue starts... */
|
||||
DECL_STRUCT_FUNCTION (decl)->function_start_locus
|
||||
= func_brace_location;
|
||||
}
|
||||
|
||||
return decl;
|
||||
/* This is where the prologue starts... */
|
||||
DECL_STRUCT_FUNCTION (decl)->function_start_locus
|
||||
= func_brace_location;
|
||||
}
|
||||
|
||||
return decl;
|
||||
}
|
||||
else if (parser->fully_implicit_function_template_p)
|
||||
decl = finish_fully_implicit_template (parser, decl);
|
||||
}
|
||||
|
||||
/* [dcl.dcl]
|
||||
|
@ -16581,6 +16577,15 @@ cp_parser_init_declarator (cp_parser* parser,
|
|||
if (!friend_p && pushed_scope)
|
||||
pop_scope (pushed_scope);
|
||||
|
||||
if (function_declarator_p (declarator)
|
||||
&& parser->fully_implicit_function_template_p)
|
||||
{
|
||||
if (member_p)
|
||||
decl = finish_fully_implicit_template (parser, decl);
|
||||
else
|
||||
finish_fully_implicit_template (parser, /*member_decl_opt=*/0);
|
||||
}
|
||||
|
||||
return decl;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue