re PR c++/37650 (ICE with broken default template parameter)
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 14 Oct 2008 17:51:55 +0000 (17:51 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 14 Oct 2008 17:51:55 +0000 (17:51 +0000)
/cp
2008-10-14  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/37650
* pt.c (push_template_decl_real): Check that current_template_parms
is not null.
(process_partial_specialization): Assert current_template_parms not
null.

/testsuite
2008-10-14  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/37650
* g++.dg/template/crash83.C: New.

From-SVN: r141115

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

index 1b38209a3a1db6b815f43071ffb39e2205df00fe..73a1656522d265bf6037d4813cac5380e3148fa7 100644 (file)
@@ -1,3 +1,11 @@
+2008-10-14  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/37650
+       * pt.c (push_template_decl_real): Check that current_template_parms
+       is not null.
+       (process_partial_specialization): Assert current_template_parms not
+       null.
+
 2008-10-13  Doug Evans  <dje@google.com>
 
        * cp-tree.h (DECL_MAIN_P): Fix parentheses around expression.
index 67b6dc68ab56937cbcaf1679b9bac7f5203ff666..13a236101b524f8eb363f36224667b9cc3f4fe9b 100644 (file)
@@ -3292,15 +3292,20 @@ process_partial_specialization (tree decl)
   tree maintmpl = CLASSTYPE_TI_TEMPLATE (type);
   tree specargs = CLASSTYPE_TI_ARGS (type);
   tree inner_args = INNERMOST_TEMPLATE_ARGS (specargs);
-  tree inner_parms = INNERMOST_TEMPLATE_PARMS (current_template_parms);
   tree main_inner_parms = DECL_INNERMOST_TEMPLATE_PARMS (maintmpl);
+  tree inner_parms;
   int nargs = TREE_VEC_LENGTH (inner_args);
-  int ntparms = TREE_VEC_LENGTH (inner_parms);
+  int ntparms;
   int  i;
   int did_error_intro = 0;
   struct template_parm_data tpd;
   struct template_parm_data tpd2;
 
+  gcc_assert (current_template_parms);
+
+  inner_parms = INNERMOST_TEMPLATE_PARMS (current_template_parms);
+  ntparms = TREE_VEC_LENGTH (inner_parms);
+
   /* We check that each of the template parameters given in the
      partial specialization is used in the argument list to the
      specialization.  For example:
@@ -3749,8 +3754,8 @@ push_template_decl_real (tree decl, bool is_friend)
      [temp.mem].  */
   bool member_template_p = false;
 
-  if (decl == error_mark_node)
-    return decl;
+  if (decl == error_mark_node || !current_template_parms)
+    return error_mark_node;
 
   /* See if this is a partial specialization.  */
   is_partial = (DECL_IMPLICIT_TYPEDEF_P (decl)
index e4f3da8c6fed354b66e677a977fd1eed2b0a82a0..8f3e7b4ae4f923d3c8201cd075c82f1fb7537965 100644 (file)
@@ -1,3 +1,8 @@
+2008-10-14  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/37650
+       * g++.dg/template/crash83.C: New.
+
 2008-10-14  Douglas Gregor  <doug.gregor@gmail.com>
 
        PR c++/37553
diff --git a/gcc/testsuite/g++.dg/template/crash83.C b/gcc/testsuite/g++.dg/template/crash83.C
new file mode 100644 (file)
index 0000000..b83dd21
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/37650
+
+template<int> struct A {};
+
+template<typename = class A<0>: > struct B {}; // { dg-error "explicit specialization|expected" }