re PR c++/60311 ([c++1y] ICE with pointer-to-function with auto parameter)

Fix PR c++/60311.

	PR c++/60311
	* parser.c (function_being_declared_is_template_p): Return false when
	processing a template parameter list.
	(cp_parser_parameter_declaration_clause): Don't set
	auto_is_implicit_function_template_parm_p when processing a
	template parameter list.

	PR c++/60311
	* g++.dg/cpp1y/pr60311.C: New testcase.

From-SVN: r208111
This commit is contained in:
Adam Butcher 2014-02-25 06:44:53 +00:00 committed by Adam Butcher
parent 41b2d514d0
commit adbdb8c76e
4 changed files with 27 additions and 2 deletions

View File

@ -1,5 +1,12 @@
2014-02-25 Adam Butcher <adam@jessamine.co.uk>
PR c++/60311
* parser.c (function_being_declared_is_template_p): Return false when
processing a template parameter list.
(cp_parser_parameter_declaration_clause): Don't set
auto_is_implicit_function_template_parm_p when processing a
template parameter list.
* parser.c (synthesize_implicit_template_parm): Inject new template
argument list appropriately when a generic member function
of a class template is declared out-of-line.

View File

@ -18122,7 +18122,7 @@ cp_parser_type_specifier_seq (cp_parser* parser,
static bool
function_being_declared_is_template_p (cp_parser* parser)
{
if (!current_template_parms)
if (!current_template_parms || processing_template_parmlist)
return false;
if (parser->implicit_template_scope)
@ -18165,7 +18165,7 @@ cp_parser_parameter_declaration_clause (cp_parser* parser)
(void) cleanup;
if (!processing_specialization)
if (!processing_specialization && !processing_template_parmlist)
if (!current_function_decl
|| (current_class_type && LAMBDA_TYPE_P (current_class_type)))
parser->auto_is_implicit_function_template_parm_p = true;

View File

@ -1,5 +1,8 @@
2014-02-25 Adam Butcher <adam@jessamine.co.uk>
PR c++/60311
* g++.dg/cpp1y/pr60311.C: New testcase.
* g++.dg/cpp1y/fn-generic-member-ool.C: New testcase.
PR c++/60065

View File

@ -0,0 +1,15 @@
// PR c++/60311
// { dg-options -std=c++1y }
template<void(*)(auto)> struct A {}; // { dg-error "auto" }
struct B {
template<void(*)(auto)> struct A {}; // { dg-error "auto" }
};
template <typename T>
struct C {
template<void(*)(auto)> struct A {}; // { dg-error "auto" }
};
using D = C<int>;