DR 2179
	* pt.c (process_partial_specialization): Handle error_mark_node
	from most_specialized_partial_spec.

From-SVN: r229395
This commit is contained in:
Jason Merrill 2015-10-26 17:17:50 -04:00 committed by Jason Merrill
parent 59010ede55
commit 6337bd75e2
3 changed files with 25 additions and 8 deletions

View File

@ -1,3 +1,9 @@
2015-10-25 Jason Merrill <jason@redhat.com>
DR 2179
* pt.c (process_partial_specialization): Handle error_mark_node
from most_specialized_partial_spec.
2015-10-23 Jason Merrill <jason@redhat.com>
DR 1518

View File

@ -4690,14 +4690,18 @@ process_partial_specialization (tree decl)
: DECL_TEMPLATE_INSTANTIATION (instance))
{
tree spec = most_specialized_partial_spec (instance, tf_none);
if (spec && TREE_VALUE (spec) == tmpl)
{
tree inst_decl = (DECL_P (instance)
? instance : TYPE_NAME (instance));
permerror (input_location,
"partial specialization of %qD after instantiation "
"of %qD", decl, inst_decl);
}
tree inst_decl = (DECL_P (instance)
? instance : TYPE_NAME (instance));
if (!spec)
/* OK */;
else if (spec == error_mark_node)
permerror (input_location,
"declaration of %qD ambiguates earlier template "
"instantiation for %qD", decl, inst_decl);
else if (TREE_VALUE (spec) == tmpl)
permerror (input_location,
"partial specialization of %qD after instantiation "
"of %qD", decl, inst_decl);
}
}

View File

@ -0,0 +1,7 @@
// DR 2179
template <class T1, class T2> class A;
template <class T> struct A<T, void> { void f(); };
template <class T> void g(T) { A<char, void>().f(); } // #1
template<typename T> struct A<char, T> {}; // { dg-error "" }
A<char, void> f; // #2