Commit 8ec2ac34 by Mark Mitchell Committed by Mark Mitchell

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
parent b86c2124
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> 1998-08-07 Mark Mitchell <mark@markmitchell.com>
* typeck.c (require_complete_type): Use complete_type_or_else. * typeck.c (require_complete_type): Use complete_type_or_else.
......
...@@ -1205,6 +1205,8 @@ check_explicit_specialization (declarator, decl, template_count, flags) ...@@ -1205,6 +1205,8 @@ check_explicit_specialization (declarator, decl, template_count, flags)
if (ctype != NULL_TREE && TYPE_BEING_DEFINED (ctype)) if (ctype != NULL_TREE && TYPE_BEING_DEFINED (ctype))
{ {
if (!explicit_instantiation)
{
/* Since finish_struct_1 has not been called yet, we /* Since finish_struct_1 has not been called yet, we
can't call lookup_fnfields. We note that this can't call lookup_fnfields. We note that this
template is a specialization, and proceed, letting template is a specialization, and proceed, letting
...@@ -1214,10 +1216,22 @@ check_explicit_specialization (declarator, decl, template_count, flags) ...@@ -1214,10 +1216,22 @@ check_explicit_specialization (declarator, decl, template_count, flags)
NULL_TREE); NULL_TREE);
TI_PENDING_SPECIALIZATION_FLAG (ti) = 1; TI_PENDING_SPECIALIZATION_FLAG (ti) = 1;
DECL_TEMPLATE_INFO (decl) = ti; DECL_TEMPLATE_INFO (decl) = ti;
/* This should not be an instantiation; explicit }
instantiation directives can only occur at the top else
level. */ /* It's not legal to write an explicit instantiation in
my_friendly_assert (!explicit_instantiation, 0); 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; return decl;
} }
else if (ctype != NULL_TREE else if (ctype != NULL_TREE
......
//Build don't link: //Build don't link:
template class x {}; // ERROR - not a template instantiation XFAIL *-*-* template class x {}; // ERROR - not a template instantiation
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment