re PR c++/13635 (ICE in register_specialization for specific order of template specia...
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Sat, 14 Feb 2004 11:29:01 +0000 (11:29 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Sat, 14 Feb 2004 11:29:01 +0000 (11:29 +0000)
PR c++/13635
* pt.c (push_template_decl_real): Make sure DECL_TI_ARGS of DECL
has full set of arguments.

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

From-SVN: r77796

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

index 64018ad..9117cdf 100644 (file)
@@ -1,3 +1,9 @@
+2004-02-14  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/13635
+       * pt.c (push_template_decl_real): Make sure DECL_TI_ARGS of DECL
+       has full set of arguments.
+
 2004-02-13  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
 
        PR c++/13927
index 085fdbd..779347b 100644 (file)
@@ -1035,7 +1035,7 @@ register_specialization (tree spec, tree tmpl, tree args)
        the default argument expression is not substituted for in an
        instantiation unless and until it is actually needed.  */
     return spec;
-    
+
   /* There should be as many levels of arguments as there are
      levels of parameters.  */
   my_friendly_assert (TMPL_ARGS_DEPTH (args) 
@@ -3001,6 +3001,13 @@ push_template_decl_real (tree decl, int is_friend)
        }
     }
 
+  /* The DECL_TI_ARGS of DECL contains full set of arguments refering
+     back to its most general template.  If TMPL is a specialization,
+     ARGS may only have the innermost set of arguments.  Add the missing
+     argument levels if necessary.  */
+  if (DECL_TEMPLATE_INFO (tmpl))
+    args = add_outermost_template_args (DECL_TI_ARGS (tmpl), args);
+
   info = tree_cons (tmpl, args, NULL_TREE);
 
   if (DECL_IMPLICIT_TYPEDEF_P (decl))
index 4b29491..e0ff48e 100644 (file)
@@ -1,3 +1,8 @@
+2004-02-14  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/13635
+       * g++.dg/template/spec11.C: New test.
+
 2004-02-13  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
 
        PR c++/13927
diff --git a/gcc/testsuite/g++.dg/template/spec11.C b/gcc/testsuite/g++.dg/template/spec11.C
new file mode 100644 (file)
index 0000000..36d93a9
--- /dev/null
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: jhbrown@bluefinrobotics.com
+
+// PR c++/13635: ICE explicit specialization of member function template
+
+template <class foo>
+class bar {
+public:
+        template <class baz>
+        int func(baz *x);
+};
+
+template <>
+template <class baz>
+int bar<double>::func(baz *x) { return 5;}
+
+template <>
+template <>
+int bar<double>::func(int *x) { return 5;}