]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/186, DR 259
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Sun, 19 May 2002 10:19:05 +0000 (10:19 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Sun, 19 May 2002 10:19:05 +0000 (10:19 +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: r53622

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 c04c30a3a8b2727d66a2f8bbebc9905032de02be..c2f10520929ce58621d4748281f9a28d81be71c6 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-09  Jason Merrill  <jason@redhat.com>
 
        * pt.c (tsubst_expr) [ASM_STMT]: Copy ASM_INPUT_P.
index 7b6581f8b3c5398fee058a4169c262aaf54ebdaa..6571c70638a0f41c63ef767b16458f942eeb0fac 100644 (file)
@@ -9502,12 +9502,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))
@@ -9637,15 +9641,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);