From 559f2bbc362f311ab424232e72bb4f9f601b54eb Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sun, 13 Nov 2016 01:52:43 -0500 Subject: [PATCH] CWG 2233 - default arg and parameter pack * typeck.c (convert_arguments): Handle default arg followed by none. From-SVN: r242350 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/typeck.c | 9 +++++++-- gcc/testsuite/g++.dg/cpp0x/variadic169.C | 9 +++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic169.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b2195e4b687..8683744ad67 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2016-11-12 Jason Merrill + CWG 2233 + * typeck.c (convert_arguments): Handle default arg followed by none. + * constexpr.c (potential_constant_expression_1): REALPART_EXPR and IMAGPART_EXPR can be lvalues. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 211696cf029..24ca1b52410 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -3835,6 +3835,10 @@ convert_arguments (tree typelist, vec **values, tree fndecl, { for (; typetail != void_list_node; ++i) { + /* After DR777, with explicit template args we can end up with a + default argument followed by no default argument. */ + if (!TREE_PURPOSE (typetail)) + break; tree parmval = convert_default_arg (TREE_VALUE (typetail), TREE_PURPOSE (typetail), @@ -3850,9 +3854,10 @@ convert_arguments (tree typelist, vec **values, tree fndecl, break; } } - else + + if (typetail && typetail != void_list_node) { - if (complain & tf_error) + if (complain & tf_error) error_args_num (input_location, fndecl, /*too_many_p=*/false); return -1; } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic169.C b/gcc/testsuite/g++.dg/cpp0x/variadic169.C new file mode 100644 index 00000000000..6858973cd2e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic169.C @@ -0,0 +1,9 @@ +// DR 2233 +// { dg-do compile { target c++11 } } + +template void f(int n = 0, T ...t); + +int main() +{ + f(); // { dg-error "too few arguments" } +} -- 2.30.2