PR c++/186, DR 259

PR c++/186, DR 259
	* pt.c (do_decl_instantiation): Don't complain explicit
	instantiation after explicit specialization.
	(do_type_instantiation): Likewise.

From-SVN: r53622
This commit is contained in:
Kriang Lerdsuwanakij 2002-05-19 10:19:05 +00:00 committed by Kriang Lerdsuwanakij
parent 3366297b1f
commit 90840cc8a5
4 changed files with 31 additions and 19 deletions

View File

@ -1,3 +1,10 @@
2002-05-19 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/186, DR 259
* pt.c (do_decl_instantiation): Don't complain explicit
instantiation after explicit specialization.
(do_type_instantiation): Likewise.
2002-05-09 Jason Merrill <jason@redhat.com>
* pt.c (tsubst_expr) [ASM_STMT]: Copy ASM_INPUT_P.

View File

@ -9502,12 +9502,16 @@ do_decl_instantiation (declspecs, declarator, storage)
if (DECL_TEMPLATE_SPECIALIZATION (result))
{
/* [temp.spec]
/* DR 259 [temp.spec].
No program shall both explicitly instantiate and explicitly
specialize a template. */
pedwarn ("explicit instantiation of `%#D' after", result);
cp_pedwarn_at ("explicit specialization here", result);
Both an explicit instantiation and a declaration of an explicit
specialization shall not appear in a program unless the explicit
instantiation follows a declaration of the explicit specialization.
For a given set of template parameters, if an explicit
instantiation of a template appears after a declaration of an
explicit specialization for that template, the explicit
instantiation has no effect. */
return;
}
else if (DECL_EXPLICIT_INSTANTIATION (result))
@ -9637,15 +9641,16 @@ do_type_instantiation (t, storage, complain)
if (CLASSTYPE_TEMPLATE_SPECIALIZATION (t))
{
/* [temp.spec]
/* DR 259 [temp.spec].
No program shall both explicitly instantiate and explicitly
specialize a template. */
if (complain & tf_error)
{
error ("explicit instantiation of `%#T' after", t);
cp_error_at ("explicit specialization here", t);
}
Both an explicit instantiation and a declaration of an explicit
specialization shall not appear in a program unless the explicit
instantiation follows a declaration of the explicit specialization.
For a given set of template parameters, if an explicit
instantiation of a template appears after a declaration of an
explicit specialization for that template, the explicit
instantiation has no effect. */
return;
}
else if (CLASSTYPE_EXPLICIT_INSTANTIATION (t))

View File

@ -28,14 +28,14 @@ template class S<void*>; // OK - explicit instantiation of partial
// specialization
template <>
struct S<long double> {}; // ERROR - explicit specialization
struct S<long double> {};
template class S<long double>; // ERROR - explicit instantiation after
template class S<long double>; // OK - explicit instantiation after
template <>
void f(long double) {} // ERROR - explicit specialization
void f(long double) {}
template void f(long double); // ERROR - explicit instantiation after
template void f(long double); // OK - explicit instantiation after
template <class T>
void g(T);

View File

@ -1,5 +1,5 @@
// Build don't link:
template<class T> T f(T o) { return o; }
template<> int f(int o) { return o; } // ERROR - after specialization
template int f(int); // ERROR - explicit instantiation
template<> int f(int o) { return o; }
template int f(int);