PR c++/69743
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 20 Feb 2016 04:31:16 +0000 (04:31 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 20 Feb 2016 04:31:16 +0000 (04:31 +0000)
* call.c (remaining_arguments): No longer static.
* cp-tree.h: Declare it.
* pt.c (more_specialized_fn): Use it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233579 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/cp-tree.h
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/variadic167.C [new file with mode: 0644]

index 571c416..ca3b14b 100644 (file)
@@ -1,3 +1,10 @@
+2016-02-19  Jason Merrill  <jason@redhat.com>
+
+       PR c++/69743
+       * call.c (remaining_arguments): No longer static.
+       * cp-tree.h: Declare it.
+       * pt.c (more_specialized_fn): Use it.
+
 2016-02-19  Jakub Jelinek  <jakub@redhat.com>
            Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
index cb71176..4226094 100644 (file)
@@ -1905,7 +1905,7 @@ add_candidate (struct z_candidate **candidates,
 /* Return the number of remaining arguments in the parameter list
    beginning with ARG.  */
 
-static int
+int
 remaining_arguments (tree arg)
 {
   int n;
index 7800ae8..3c23a83 100644 (file)
@@ -5612,6 +5612,7 @@ extern tree make_temporary_var_for_ref_to_temp    (tree, tree);
 extern bool type_has_extended_temps            (tree);
 extern tree strip_top_quals                    (tree);
 extern bool reference_related_p                        (tree, tree);
+extern int remaining_arguments                 (tree);
 extern tree perform_implicit_conversion                (tree, tree, tsubst_flags_t);
 extern tree perform_implicit_conversion_flags  (tree, tree, tsubst_flags_t, int);
 extern tree build_integral_nontype_arg_conv    (tree, tree, tsubst_flags_t);
index 7308389..65edfa7 100644 (file)
@@ -20288,7 +20288,7 @@ more_specialized_fn (tree pat1, tree pat2, int len)
 
       if (TREE_CODE (arg1) == TYPE_PACK_EXPANSION)
         {
-          int i, len2 = list_length (args2);
+          int i, len2 = remaining_arguments (args2);
           tree parmvec = make_tree_vec (1);
           tree argvec = make_tree_vec (len2);
           tree ta = args2;
@@ -20312,7 +20312,7 @@ more_specialized_fn (tree pat1, tree pat2, int len)
         }
       else if (TREE_CODE (arg2) == TYPE_PACK_EXPANSION)
         {
-          int i, len1 = list_length (args1);
+          int i, len1 = remaining_arguments (args1);
           tree parmvec = make_tree_vec (1);
           tree argvec = make_tree_vec (len1);
           tree ta = args1;
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic167.C b/gcc/testsuite/g++.dg/cpp0x/variadic167.C
new file mode 100644 (file)
index 0000000..cada972
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/69743
+// { dg-do compile { target c++11 } }
+
+template <typename D, typename... T>
+void f(int, T... d)
+{
+}
+
+template <typename D, typename... T>
+void f(T... d)
+{
+  f<D>(1, d...);
+}
+
+void g(void)
+{
+  f<long>(1.0);
+}