Hi Jason,
I noticed that, although implicit function template declarations were
accepted. They weren't setup correctly and didn't instantiate properly.
The following patch fixes this by moving finish_fully_implicit_template
to the end of cp_parser_init_declarator. OK to go with the others?
Cheers,
Adam
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.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 82abf7c..f3133f3 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -16318,8 +16318,7 @@ cp_parser_init_declarator (cp_parser* parser,
"a function-definition is not allowed here");
return error_mark_node;
}
- else
- {
+
location_t func_brace_location
= cp_lexer_peek_token (parser->lexer)->location;
@@ -16357,9 +16356,6 @@ cp_parser_init_declarator (cp_parser* parser,
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;
}