re PR c++/67318 (Parsing error when using abbreviated integral type names in template...
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 10 Sep 2015 15:36:54 +0000 (15:36 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 10 Sep 2015 15:36:54 +0000 (15:36 +0000)
/cp
2015-09-10  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/67318
* parser.c (cp_parser_parameter_declaration): Consume the ellipsis
and set template_parameter_pack_p also when the type is null.

/testsuite
2015-09-10  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/67318
* g++.dg/cpp0x/variadic166.C: New.

From-SVN: r227650

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

index 339277339b7b64038d47a4261209c70b3f8144e7..a9952fcae755d2bc4da1f01e4029dfb78f790aeb 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-10  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/67318
+       * parser.c (cp_parser_parameter_declaration): Consume the ellipsis
+       and set template_parameter_pack_p also when the type is null.
+
 2015-09-09  Mark Wielaard  <mjw@redhat.com>
 
        * typeck.c (cp_build_binary_op): Check and warn when nonnull arg
index d96825b08af03784139edf53727796053a95ca1e..64eb5ea88038835ea5b32d19a8b14b6ecaeff2e7 100644 (file)
@@ -19613,11 +19613,12 @@ cp_parser_parameter_declaration (cp_parser *parser,
        }
     }
 
-  /* If the next token is an ellipsis, and we have not seen a
-     declarator name, and the type of the declarator contains parameter
-     packs but it is not a TYPE_PACK_EXPANSION, then we actually have
-     a parameter pack expansion expression. Otherwise, leave the
-     ellipsis for a C-style variadic function. */
+  /* If the next token is an ellipsis, and we have not seen a declarator
+     name, and if either the type of the declarator contains parameter
+     packs but it is not a TYPE_PACK_EXPANSION or is null (this happens
+     for, eg, abbreviated integral type names), then we actually have a
+     parameter pack expansion expression. Otherwise, leave the ellipsis
+     for a C-style variadic function. */
   token = cp_lexer_peek_token (parser->lexer);
   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
     {
@@ -19626,11 +19627,12 @@ cp_parser_parameter_declaration (cp_parser *parser,
       if (type && DECL_P (type))
         type = TREE_TYPE (type);
 
-      if (type
-         && TREE_CODE (type) != TYPE_PACK_EXPANSION
-         && declarator_can_be_parameter_pack (declarator)
-          && (template_parm_p || uses_parameter_packs (type)))
-        {
+      if (((type
+           && TREE_CODE (type) != TYPE_PACK_EXPANSION
+           && (template_parm_p || uses_parameter_packs (type)))
+          || (!type && template_parm_p))
+         && declarator_can_be_parameter_pack (declarator))
+       {
          /* Consume the `...'. */
          cp_lexer_consume_token (parser->lexer);
          maybe_warn_variadic_templates ();
index f99682cf352a64f50806e3f7e9d8d17173bfac3e..34ad00712ff6b0d5d59ea8ba9a02865b69e82e50 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-10  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/67318
+       * g++.dg/cpp0x/variadic166.C: New.
+
 2015-09-09  Mark Wielaard  <mjw@redhat.com>
 
        * c-c++-common/nonnull-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic166.C b/gcc/testsuite/g++.dg/cpp0x/variadic166.C
new file mode 100644 (file)
index 0000000..91455cb
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/67318
+// { dg-do compile { target c++11 } }
+
+template<signed...>
+struct MyStruct1;
+
+template<unsigned...>
+struct MyStruct2;
+
+template<short...>
+struct MyStruct3;
+
+template<long...>
+struct MyStruct4;