re PR c++/54416 (ICE (segv) in codegen)

PR c++/54416
	* pt.c (maybe_process_partial_specialization): Don't accept
	definition of a specialization without the appropriate header.

From-SVN: r194408
This commit is contained in:
Jason Merrill 2012-12-11 13:16:50 -05:00 committed by Jason Merrill
parent befd067c5a
commit df266ea5fe
4 changed files with 30 additions and 2 deletions

View File

@ -1,5 +1,9 @@
2012-12-11 Jason Merrill <jason@redhat.com>
PR c++/54416
* pt.c (maybe_process_partial_specialization): Don't accept
definition of a specialization without the appropriate header.
* pt.c (maybe_process_partial_specialization): Handle aliases first.
2012-12-11 Jakub Jelinek <jakub@redhat.com>

View File

@ -850,7 +850,13 @@ maybe_process_partial_specialization (tree type)
}
else if (CLASSTYPE_TEMPLATE_INSTANTIATION (type))
error ("specialization of %qT after instantiation", type);
else if (errorcount && !processing_specialization
&& CLASSTYPE_TEMPLATE_SPECIALIZATION (type)
&& !uses_template_parms (CLASSTYPE_TI_ARGS (type)))
/* Trying to define a specialization either without a template<> header
or in an inappropriate place. We've already given an error, so just
bail now so we don't actually define the specialization. */
return error_mark_node;
}
else if (CLASS_TYPE_P (type)
&& !CLASSTYPE_USE_TEMPLATE (type)

View File

@ -10,5 +10,8 @@ template < typename > struct S < int >
void
f ()
{
S < int >::f (); // { dg-error "cannot call" }
S < int >::f ();
}
// Don't be picky about error-recovery.
// { dg-prune-output "." }

View File

@ -0,0 +1,15 @@
// PR c++/54416
template < typename T > struct foo;
template <> struct foo < int >;
template < typename T > struct bar
{
template <> struct foo < int > // { dg-error "non-namespace scope" }
{
void baz ();
};
};
void foo < int >::baz () { }
// Don't be picky about error-recovery.
// { dg-prune-output "." }