pt.c (check_explicit_specialization): Don't abort on bogus explicit instantiations.

* pt.c (check_explicit_specialization): Don't abort on bogus
	explicit instantiations.

From-SVN: r21643
This commit is contained in:
Mark Mitchell 1998-08-09 15:20:40 +00:00 committed by Mark Mitchell
parent b86c2124e2
commit 8ec2ac347f
3 changed files with 33 additions and 14 deletions

View File

@ -1,3 +1,8 @@
1998-08-09 Mark Mitchell <mark@markmitchell.com>
* pt.c (check_explicit_specialization): Don't abort on bogus
explicit instantiations.
1998-08-07 Mark Mitchell <mark@markmitchell.com>
* typeck.c (require_complete_type): Use complete_type_or_else.

View File

@ -1205,19 +1205,33 @@ check_explicit_specialization (declarator, decl, template_count, flags)
if (ctype != NULL_TREE && TYPE_BEING_DEFINED (ctype))
{
/* Since finish_struct_1 has not been called yet, we
can't call lookup_fnfields. We note that this
template is a specialization, and proceed, letting
finish_struct fix this up later. */
tree ti = perm_tree_cons (NULL_TREE,
TREE_OPERAND (declarator, 1),
NULL_TREE);
TI_PENDING_SPECIALIZATION_FLAG (ti) = 1;
DECL_TEMPLATE_INFO (decl) = ti;
/* This should not be an instantiation; explicit
instantiation directives can only occur at the top
level. */
my_friendly_assert (!explicit_instantiation, 0);
if (!explicit_instantiation)
{
/* Since finish_struct_1 has not been called yet, we
can't call lookup_fnfields. We note that this
template is a specialization, and proceed, letting
finish_struct fix this up later. */
tree ti = perm_tree_cons (NULL_TREE,
TREE_OPERAND (declarator, 1),
NULL_TREE);
TI_PENDING_SPECIALIZATION_FLAG (ti) = 1;
DECL_TEMPLATE_INFO (decl) = ti;
}
else
/* It's not legal to write an explicit instantiation in
class scope, e.g.:
class C { template void f(); }
This case is caught by the parser. However, on
something like:
template class C { void f(); };
(which is illegal) we can get here. The error will be
issued later. */
;
return decl;
}
else if (ctype != NULL_TREE

View File

@ -1,2 +1,2 @@
//Build don't link:
template class x {}; // ERROR - not a template instantiation XFAIL *-*-*
template class x {}; // ERROR - not a template instantiation