diff options
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic105.C | 24 |
4 files changed, 33 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 428ec29b..22f5bf0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2011-01-14 Jason Merrill <jason@redhat.com> + PR c++/47289 + * pt.c (coerce_template_parms): Fix error recovery. + PR c++/46903 * typeck2.c (check_narrowing): Only check arithmetic types. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 54c1a59..16bd2a0 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6410,7 +6410,7 @@ coerce_template_parms (tree parms, sorry ("cannot expand %<%T%> into a fixed-length " "argument list", arg); } - return error_mark_node; + ++lost; } } else if (require_all_args) @@ -6438,7 +6438,7 @@ coerce_template_parms (tree parms, reported) that we are trying to recover from, e.g., a class template with a parameter list such as template<typename..., typename>. */ - return error_mark_node; + ++lost; else arg = convert_template_argument (TREE_VALUE (parm), arg, new_args, complain, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b5cbdf5..ae33ad5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-01-14 Jason Merrill <jason@redhat.com> + + * g++.dg/cpp0x/variadic105.C: New. + 2011-01-08 Dominique d'Humieres <dominiq@lps.ens.fr> Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic105.C b/gcc/testsuite/g++.dg/cpp0x/variadic105.C new file mode 100644 index 0000000..24d7e15 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic105.C @@ -0,0 +1,24 @@ +// PR c++/47289 +// { dg-options -std=c++0x } +// { dg-prune-output "note" } + +template <template <typename... __ARGS> class _F, typename... _ARGS> +auto reverse (_ARGS... args) -> decltype(_F<_ARGS...>::call_function(args...)) { + return _F<_ARGS...>::call_function(args...); +} + +template <typename _T> +_T sum(_T x) { return x; } + +template <typename _T, typename... _ARGS> +_T sum(_T x, _ARGS... args) { return x + sum(args...); } + +template <typename _T, typename... _ARGS> +struct call_sum { + static _T call_function(_T x1, _ARGS... args) { return sum(x1, args...); } +}; + +int main() { + // This shouldn't be an error; this is bug 35722. + reverse<call_sum>(1,2); // { dg-bogus "no match" "" { xfail *-*-* } } +} |