From: Jason Merrill Date: Sun, 13 Nov 2016 06:52:43 +0000 (-0500) Subject: CWG 2233 - default arg and parameter pack X-Git-Tag: basepoints/gcc-8~3210 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=559f2bbc362f311ab424232e72bb4f9f601b54eb;p=thirdparty%2Fgcc.git CWG 2233 - default arg and parameter pack * typeck.c (convert_arguments): Handle default arg followed by none. From-SVN: r242350 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b2195e4b687c..8683744ad677 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 211696cf0295..24ca1b52410b 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 000000000000..6858973cd2eb --- /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" } +}