re PR c++/61507 (GCC does not compile function with parameter pack.)
authorJason Merrill <jason@redhat.com>
Wed, 18 Jun 2014 22:13:40 +0000 (18:13 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 18 Jun 2014 22:13:40 +0000 (18:13 -0400)
PR c++/61507
* pt.c (resolve_overloaded_unification): Preserve
ARGUMENT_PACK_EXPLICIT_ARGS.

From-SVN: r211808

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

index 9b4818e..74eefea 100644 (file)
@@ -1,3 +1,9 @@
+2014-06-18  Jason Merrill  <jason@redhat.com>
+
+       PR c++/61507
+       * pt.c (resolve_overloaded_unification): Preserve
+       ARGUMENT_PACK_EXPLICIT_ARGS.
+
 2014-06-18  Jakub Jelinek  <jakub@redhat.com>
 
        * cp-gimplify.c (cxx_omp_finish_clause): Add a gimple_seq *
index d5cc257..f0a598b 100644 (file)
@@ -16838,7 +16838,16 @@ resolve_overloaded_unification (tree tparms,
       int i = TREE_VEC_LENGTH (targs);
       for (; i--; )
        if (TREE_VEC_ELT (tempargs, i))
-         TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (tempargs, i);
+         {
+           tree old = TREE_VEC_ELT (targs, i);
+           tree new_ = TREE_VEC_ELT (tempargs, i);
+           if (new_ && old && ARGUMENT_PACK_P (old)
+               && ARGUMENT_PACK_EXPLICIT_ARGS (old))
+             /* Don't forget explicit template arguments in a pack.  */
+             ARGUMENT_PACK_EXPLICIT_ARGS (new_)
+               = ARGUMENT_PACK_EXPLICIT_ARGS (old);
+           TREE_VEC_ELT (targs, i) = new_;
+         }
     }
   if (good)
     return true;
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic159.C b/gcc/testsuite/g++.dg/cpp0x/variadic159.C
new file mode 100644 (file)
index 0000000..2b14d30
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/61507
+// { dg-do compile { target c++11 } }
+
+struct A {
+  void foo(const int &);
+  void foo(float);
+};
+
+template <typename... Args>
+void bar(void (A::*memfun)(Args...), Args... args);
+
+void go(const int& i) {
+  bar<const int &>(&A::foo, i);
+}