+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-19 Alexandre Oliva <aoliva@redhat.com>
* cp-tree.h (complete_type_or_diagnostic): Changed prototype,
if (DECL_TEMPLATE_SPECIALIZATION (result))
{
- /* [temp.spec]
+ /* DR 259 [temp.spec].
+
+ 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.
- 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);
+ 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))
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))
// 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);