From 2207c59959535b8b513126335e3317d59bd58ce2 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 19 Feb 2016 23:31:16 -0500 Subject: [PATCH] re PR c++/69743 (function overload with variadic arguments - template instantiation depth exceeds maximum (gcc4, clang - no problem)) 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 | 7 +++++++ gcc/cp/call.c | 2 +- gcc/cp/cp-tree.h | 1 + gcc/cp/pt.c | 4 ++-- gcc/testsuite/g++.dg/cpp0x/variadic167.C | 18 ++++++++++++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic167.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 571c4168bd2..ca3b14bff1f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2016-02-19 Jason Merrill + + 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 Bernd Edlinger diff --git a/gcc/cp/call.c b/gcc/cp/call.c index cb71176c6ca..4226094969a 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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; diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 7800ae8316d..3c23a83a824 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 730838922c7..65edfa79d3a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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 index 00000000000..cada9725090 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic167.C @@ -0,0 +1,18 @@ +// PR c++/69743 +// { dg-do compile { target c++11 } } + +template +void f(int, T... d) +{ +} + +template +void f(T... d) +{ + f(1, d...); +} + +void g(void) +{ + f(1.0); +} -- 2.30.2