]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/69743 (function overload with variadic arguments - template instantiation...
authorJason Merrill <jason@redhat.com>
Sat, 20 Feb 2016 04:31:16 +0000 (23:31 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 20 Feb 2016 04:31:16 +0000 (23:31 -0500)
PR c++/69743
* call.c (remaining_arguments): No longer static.
* cp-tree.h: Declare it.
* pt.c (more_specialized_fn): Use it.

From-SVN: r233579

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 571c4168bd29e49164e22207d98766d3b8d00685..ca3b14bff1fce49c569ba827e4ccf990e3882c60 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 cb71176c6ca148ecaf49b24f2e16238d3653685a..4226094969a1addee3081a7b14c7aa987ea6d8c0 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 7800ae8316dfae10f76557e1b0fbcf38c24fbbf9..3c23a83a824b5f5ebca4e93e01c0e48977af7db8 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 730838922c7c481b2cdfcf81539a83b6f541a074..65edfa79d3ab027a493147996606e69bd7aad103 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);
+}