re PR c++/10940 (Bad code with explicit specialization)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Tue, 3 Jun 2003 13:01:44 +0000 (13:01 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Tue, 3 Jun 2003 13:01:44 +0000 (13:01 +0000)
PR c++/10940
* pt.c (check_explicit_specialization): Check for 'static'
earlier.

* g++.dg/template/spec10.C: New test.

From-SVN: r67373

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/spec10.C [new file with mode: 0644]

index 85c5062451de40ca4f7d68327494b3fde3149643..158db739a84235b4bfd36531f9e67b186b4b2962 100644 (file)
@@ -1,3 +1,9 @@
+2003-06-03  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/10940
+       * pt.c (check_explicit_specialization): Check for 'static'
+       earlier.
+
 2003-05-31  Diego Novillo  <dnovillo@redhat.com>
 
        * class.c (dump_array): Call CONSTRUCTOR_ELTS to access
index 2e163c840a95243776baaba31069beb6aa68c449..52bbc51990f809454b320fd0faf2f7e4c16a5a63 100644 (file)
@@ -1849,6 +1849,18 @@ check_explicit_specialization (declarator, decl, template_count, flags)
              return instantiate_template (tmpl, targs, tf_error);
            }
 
+         /* If we thought that the DECL was a member function, but it
+            turns out to be specializing a static member function,
+            make DECL a static member function as well.  We also have
+            to adjust last_function_parms to avoid confusing
+            start_function later.  */
+         if (DECL_STATIC_FUNCTION_P (tmpl)
+             && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+           {
+             revert_static_member_fn (decl);
+             last_function_parms = TREE_CHAIN (last_function_parms);
+           }
+
          /* If this is a specialization of a member template of a
             template class.  In we want to return the TEMPLATE_DECL,
             not the specialization of it.  */
@@ -1865,16 +1877,6 @@ check_explicit_specialization (declarator, decl, template_count, flags)
              return tmpl;
            }
 
-         /* If we thought that the DECL was a member function, but it
-            turns out to be specializing a static member function,
-            make DECL a static member function as well.  */
-         if (DECL_STATIC_FUNCTION_P (tmpl)
-             && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
-           {
-             revert_static_member_fn (decl);
-             last_function_parms = TREE_CHAIN (last_function_parms);
-           }
-
          /* Set up the DECL_TEMPLATE_INFO for DECL.  */
          DECL_TEMPLATE_INFO (decl) = tree_cons (tmpl, targs, NULL_TREE);
 
index a7da74f4c8c0098e62c9ee8077f67092a6b57270..a5602f2f4e25ed5196e34b80182e0b8ecdc84d92 100644 (file)
@@ -1,3 +1,8 @@
+2003-06-03  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/10940
+       * g++.dg/template/spec10.C: New test.
+
 2003-06-03  Roger Sayle  <roger@eyesopen.com>
 
        * gcc.dg/builtins-16.c: New test case.
diff --git a/gcc/testsuite/g++.dg/template/spec10.C b/gcc/testsuite/g++.dg/template/spec10.C
new file mode 100644 (file)
index 0000000..f790155
--- /dev/null
@@ -0,0 +1,27 @@
+// { dg-do run }
+
+// Origin: Lynn Akers <lakers@peachtree.com>
+
+// PR c++/10940: Problem handling parameter list for static member
+// that is a specialization of a member template of a template class.
+
+template<int b>
+class o
+{
+public:
+       template<typename T> static void do_add(T* p, T v);
+};
+
+template<>
+template<typename T>
+inline void o<32>::do_add(T* p, T v)
+{
+       *p += v;
+}
+
+int main()
+{
+       int a = 0x1000;
+       o<32>().do_add<int>(&a, 0x2000);
+       return a;
+}