From 077827189d358f788d062a1f504c99412a9de8fb Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Sun, 19 May 2002 10:11:50 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 7 +++++ gcc/cp/pt.c | 31 +++++++++++-------- .../g++.old-deja/g++.pt/explicit70.C | 8 ++--- gcc/testsuite/g++.old-deja/g++.pt/spec19.C | 4 +-- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 56f76633e99..edf3b81a2f6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2002-05-19 Kriang Lerdsuwanakij + + 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 * cp-tree.h (complete_type_or_diagnostic): Changed prototype, diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 58fe3c57369..e54ab8e3ebc 100644 --- a/gcc/cp/pt.c +++ b/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]. + + 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)) @@ -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)) diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit70.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit70.C index ade83fdc443..544faf7bdb2 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/explicit70.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit70.C @@ -28,14 +28,14 @@ template class S; // OK - explicit instantiation of partial // specialization template <> -struct S {}; // ERROR - explicit specialization +struct S {}; -template class S; // ERROR - explicit instantiation after +template class S; // 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 void g(T); diff --git a/gcc/testsuite/g++.old-deja/g++.pt/spec19.C b/gcc/testsuite/g++.old-deja/g++.pt/spec19.C index f9b601125b4..911c6933da4 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/spec19.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/spec19.C @@ -1,5 +1,5 @@ // Build don't link: template 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); -- 2.30.2