PR c++/186, DR 259
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Sun, 19 May 2002 10:11:50 +0000 (10:11 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Sun, 19 May 2002 10:11:50 +0000 (10:11 +0000)
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
gcc/cp/pt.c
gcc/testsuite/g++.old-deja/g++.pt/explicit70.C
gcc/testsuite/g++.old-deja/g++.pt/spec19.C

index 56f76633e999688711142d9c3ba96574228a9726..edf3b81a2f63a142647c40df6bd05a6d6091dfb8 100644 (file)
@@ -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,
index 58fe3c57369fa453f85b7fcb8e3ed1f7f82bd9fd..e54ab8e3ebc93d1cae48c776e29f7b5e55e7353b 100644 (file)
@@ -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))
index ade83fdc443010cbf203f09d89b500f0527da0c2..544faf7bdb2368b83b43cf8b9872e5327b432766 100644 (file)
@@ -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);
index f9b601125b4cc39eb86ad6bbfe542220fa226a18..911c6933da4a1988f8f7f08e52f9566a07a57100 100644 (file)
@@ -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);