aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/pt.c31
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit70.C8
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/spec19.C4
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);