re PR c++/52824 ([C++11] expanding variadic template arguments into non-variadic...
authorJason Merrill <jason@redhat.com>
Fri, 13 Apr 2012 19:43:57 +0000 (15:43 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 13 Apr 2012 19:43:57 +0000 (15:43 -0400)
PR c++/52824
* pt.c (any_pack_expanson_args_p): New.
(coerce_template_parms): Use it.

From-SVN: r186434

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C
gcc/testsuite/g++.dg/cpp0x/variadic123.C [new file with mode: 0644]

index e8bcc377fc6c722cc847cca4716dc2567e276ec9..e7e9b7e8afbdd38a0892417ee047c972eea4ce96 100644 (file)
@@ -1,5 +1,9 @@
 2012-04-13  Jason Merrill  <jason@redhat.com>
 
+       PR c++/52824
+       * pt.c (any_pack_expanson_args_p): New.
+       (coerce_template_parms): Use it.
+
        PR c++/52905
        * call.c (joust): Handle comparing list and non-list ctors.
 
index ee38254bd8ceb4c94c6063572a69fccdd39ac453..07a2cc00bb222b5984924ecb71f1230225f0a0ba 100644 (file)
@@ -6725,6 +6725,20 @@ coerce_template_parameter_pack (tree parms,
   return argument_pack;
 }
 
+/* Returns true if the template argument vector ARGS contains
+   any pack expansions, false otherwise.  */
+
+static bool
+any_pack_expanson_args_p (tree args)
+{
+  int i;
+  if (args)
+    for (i = 0; i < TREE_VEC_LENGTH (args); ++i)
+      if (PACK_EXPANSION_P (TREE_VEC_ELT (args, i)))
+       return true;
+  return false;
+}
+
 /* Convert all template arguments to their appropriate types, and
    return a vector containing the innermost resulting template
    arguments.  If any error occurs, return error_mark_node. Error and
@@ -6790,6 +6804,7 @@ coerce_template_parms (tree parms,
   if ((nargs > nparms && !variadic_p)
       || (nargs < nparms - variadic_p
          && require_all_args
+         && !any_pack_expanson_args_p (inner_args)
          && (!use_default_args
              || (TREE_VEC_ELT (parms, nargs) != error_mark_node
                   && !TREE_PURPOSE (TREE_VEC_ELT (parms, nargs))))))
index e3ea64acfd27afa1981f1bd0acef20f5b24acc80..3a31797faebde644a738deb1de17ebc2ba0bc137 100644 (file)
@@ -1,5 +1,9 @@
 2012-04-13  Jason Merrill  <jason@redhat.com>
 
+       PR c++/52824
+       * g++.dg/cpp0x/variadic123.C: New.
+       * g++.dg/cpp0x/alias-decl-15.C: Remove dg-errors.
+
        PR c++/52905
        * g++.dg/cpp0x/initlist-ctor1.C: New.
 
index 2bc9b11843dcaa85d71048d8789fce6441c8a27f..b23e4029f79c160ba8fc443ff4f7dd89b447ee19 100644 (file)
@@ -2,7 +2,7 @@
 // { dg-options "-std=c++0x" }
 
 template<class U, class V> //#1
-struct foo {}; // { dg-error "provided for|foo" }
+struct foo {};
 
 template<class U, class V=char>
 struct P {};
@@ -10,8 +10,8 @@ struct P {};
 template<template<class... U> class... TT>
 struct bar {
     template<class... Args>
-    using mem = P<TT<Args...>...>;//#2 { dg-error "wrong number of|arguments" }
+    using mem = P<TT<Args...>...>;//#2
 };
 
-bar<foo>::mem<int, char> b;//#3 { dg-error "invalid type" }
+bar<foo>::mem<int, char> b;//#3
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic123.C b/gcc/testsuite/g++.dg/cpp0x/variadic123.C
new file mode 100644 (file)
index 0000000..f0ab9fc
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/52824
+// { dg-do compile { target c++11 } }
+
+template<typename G, typename H>
+struct foo
+{};
+
+template<typename... G>
+struct bar : foo<G...>
+{};
+
+int main() {
+  bar<int, float> f;
+}