OSDN Git Service

Fix PR c++/43953
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 May 2010 09:49:45 +0000 (09:49 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 May 2010 09:49:45 +0000 (09:49 +0000)
gcc/cp/ChangeLog:
PR c++/43953
* pt.c (most_specialized_class): Pretend we are processing
a template decl during the call to coerce_template_parms.

gcc/testsuite/ChangeLog:
PR c++/43953
* g++.dg/other/crash-12.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159019 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/crash-12.C [new file with mode: 0644]

index 23e5556..026abe8 100644 (file)
@@ -1,3 +1,9 @@
+2010-05-03  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/43953
+       * pt.c (most_specialized_class): Pretend we are processing
+       a template decl during the call to coerce_template_parms.
+
 2010-05-03  Jason Merrill  <jason@redhat.com>
 
        PR c++/42810
index 29489b6..fbf9b90 100644 (file)
@@ -15941,12 +15941,13 @@ most_specialized_class (tree type, tree tmpl)
       tree parms = TREE_VALUE (t);
 
       partial_spec_args = CLASSTYPE_TI_ARGS (TREE_TYPE (t));
+
+      ++processing_template_decl;
+
       if (outer_args)
        {
          int i;
 
-         ++processing_template_decl;
-
          /* Discard the outer levels of args, and then substitute in the
             template args from the enclosing class.  */
          partial_spec_args = INNERMOST_TEMPLATE_ARGS (partial_spec_args);
@@ -15963,7 +15964,6 @@ most_specialized_class (tree type, tree tmpl)
            TREE_VEC_ELT (parms, i) =
              tsubst (TREE_VEC_ELT (parms, i), outer_args, tf_none, NULL_TREE);
 
-         --processing_template_decl;
        }
 
       partial_spec_args =
@@ -15974,6 +15974,8 @@ most_specialized_class (tree type, tree tmpl)
                                 /*require_all_args=*/true,
                                 /*use_default_args=*/true);
 
+      --processing_template_decl;
+
       if (partial_spec_args == error_mark_node)
        return error_mark_node;
 
index d3d168f..4c7f13d 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-03  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/43953
+       * g++.dg/other/crash-12.C: New test.
+
 2010-05-03  H.J. Lu  <hongjiu.lu@intel.com>
 
        * g++.dg/cdce3.C: Add a space.  Updated.
diff --git a/gcc/testsuite/g++.dg/other/crash-12.C b/gcc/testsuite/g++.dg/other/crash-12.C
new file mode 100644 (file)
index 0000000..6612ff2
--- /dev/null
@@ -0,0 +1,25 @@
+// Origin: PR c++/43953
+
+template<typename T,
+         typename U,
+        typename T::type V> class bad;
+
+// partial specialization
+// for T = U
+template<typename T, typename T::type V>
+class bad<T, T, V>
+{
+public:
+  static void foo() {}
+};
+
+struct dummy
+{
+  typedef int type;
+};
+
+int main()
+{
+  bad<dummy, dummy, 0>::foo();
+}
+