re PR c++/34892 (ICE with ellipsis in default template argument)
authorPaolo Carlini <paolo@gcc.gnu.org>
Thu, 25 Oct 2012 09:12:22 +0000 (09:12 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 25 Oct 2012 09:12:22 +0000 (09:12 +0000)
/cp
2012-10-25  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/34892
* parser.c (cp_parser_template_parameter): When
cp_parser_parameter_declaration parsed a default argument don't
see if *is_parameter_pack needs setting.

/testsuite
2012-10-25  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/34892
* g++.dg/template/crash114.C: New.

From-SVN: r192802

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

index 9e8d933e7459bfde355d53164d080eb0eff31a62..9d5dde7ba92da2f134dd59fb91684e69a01d3cf1 100644 (file)
@@ -1,3 +1,10 @@
+2012-10-25  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/34892
+       * parser.c (cp_parser_template_parameter): When
+       cp_parser_parameter_declaration parsed a default argument don't
+       see if *is_parameter_pack needs setting.
+
 2012-10-23  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/54922
index 853d789f987f412331fd4736e9386bc64b229cb9..940356377a0c53a61cdc8533eda7849f349280ae 100644 (file)
@@ -12258,12 +12258,21 @@ cp_parser_template_parameter (cp_parser* parser, bool *is_non_type,
       parameter_declarator->declarator->parameter_pack_p = false;
     }
 
+  if (parameter_declarator
+      && parameter_declarator->default_argument)
+    {
+      /* Can happen in some cases of erroneous input (c++/34892).  */
+      if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
+       /* Consume the `...' for better error recovery.  */
+       cp_lexer_consume_token (parser->lexer);
+    }
   /* If the next token is an ellipsis, and we don't already have it
      marked as a parameter pack, then we have a parameter pack (that
      has no declarator).  */
-  if (!*is_parameter_pack
-      && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
-      && declarator_can_be_parameter_pack (parameter_declarator->declarator))
+  else if (!*is_parameter_pack
+          && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
+          && (declarator_can_be_parameter_pack
+              (parameter_declarator->declarator)))
     {
       /* Consume the `...'.  */
       cp_lexer_consume_token (parser->lexer);
index b41a4dce82df39a47d61878515d5a34578a4ecec..bcbc0f28c83b390c9d6cd25c25fc02d8b86d8896 100644 (file)
@@ -1,7 +1,12 @@
+2012-10-25  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/34892
+       * g++.dg/template/crash114.C: New.
+
 2012-10-24  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR bootstrap/55049
-       * gcc.target/i386/pr55049-1.c: New test. 
+       * gcc.target/i386/pr55049-1.c: New test.
 
 2012-10-24  Janus Weil  <janus@gcc.gnu.org>
 
diff --git a/gcc/testsuite/g++.dg/template/crash114.C b/gcc/testsuite/g++.dg/template/crash114.C
new file mode 100644 (file)
index 0000000..cf894ba
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/34892
+
+template<int=..., int=0> struct A {};  // { dg-error "expected primary" }
+
+A<0> a;