diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 31 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/explicit70.C | 8 | ||||
-rw-r--r-- | 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 56f7663..edf3b81 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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, diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 58fe3c5..e54ab8e 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 ade83fd..544faf7 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<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); diff --git a/gcc/testsuite/g++.old-deja/g++.pt/spec19.C b/gcc/testsuite/g++.old-deja/g++.pt/spec19.C index f9b6011..911c693 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<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); |