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: r53621
This commit is contained in:
parent
47754fd548
commit
077827189d
4 changed files with 31 additions and 19 deletions
|
@ -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-19 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* cp-tree.h (complete_type_or_diagnostic): Changed prototype,
|
||||
|
|
31
gcc/cp/pt.c
31
gcc/cp/pt.c
|
@ -9524,12 +9524,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))
|
||||
|
@ -9659,15 +9663,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))
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue