Commit 7a9a6e24 by Adam Butcher Committed by Adam Butcher

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
parent 1a4109b6
2013-09-23 Adam Butcher <adam@jessamine.co.uk> 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>' * parser.c (make_generic_type_name): Spell generic type names '<autoN>'
rather than '__GenN'. rather than '__GenN'.
......
...@@ -16318,47 +16318,43 @@ cp_parser_init_declarator (cp_parser* parser, ...@@ -16318,47 +16318,43 @@ cp_parser_init_declarator (cp_parser* parser,
"a function-definition is not allowed here"); "a function-definition is not allowed here");
return error_mark_node; return error_mark_node;
} }
else
{
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;
/* This is where the prologue starts... */
DECL_STRUCT_FUNCTION (decl)->function_start_locus
= func_brace_location;
}
return decl; /* 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;
} }
else if (parser->fully_implicit_function_template_p)
decl = finish_fully_implicit_template (parser, decl);
} }
/* [dcl.dcl] /* [dcl.dcl]
...@@ -16581,6 +16577,15 @@ cp_parser_init_declarator (cp_parser* parser, ...@@ -16581,6 +16577,15 @@ cp_parser_init_declarator (cp_parser* parser,
if (!friend_p && pushed_scope) if (!friend_p && pushed_scope)
pop_scope (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; return decl;
} }
......
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