On Mon, Nov 25, 2024 at 03:40:18PM -0500, Marek Polacek wrote:
Just "omitting a comma", I think.
"of a function parameter list"
I suppose we should also test -Wno-deprecated and/or
-Wno-deprecated-variadic-comma-omission in C++26.
Thanks, I've made those changes including adding more copies
of variadic-comma*.C with different options and diagnostics
expectations.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2024-11-26 Jakub Jelinek <ja...@redhat.com>
gcc/c-family/
* c.opt: Implement C++26 P3176R1 - The Oxford variadic comma.
(Wdeprecated-variadic-comma-omission): New option.
* c.opt.urls: Regenerate.
* c-opts.cc (c_common_post_options): Default to
-Wdeprecated-variadic-comma-omission for C++26 or -Wpedantic.
gcc/cp/
* parser.cc (cp_parser_parameter_declaration_clause): Emit
-Wdeprecated-variadic-comma-omission warnings.
gcc/
* doc/invoke.texi (-Wdeprecated-variadic-comma-omission): Document.
gcc/testsuite/
* g++.dg/cpp26/variadic-comma1.C: New test.
* g++.dg/cpp26/variadic-comma2.C: New test.
* g++.dg/cpp26/variadic-comma3.C: New test.
* g++.dg/cpp26/variadic-comma4.C: New test.
* g++.dg/cpp26/variadic-comma5.C: New test.
* g++.dg/cpp1z/fold10.C: Expect a warning for C++26.
* g++.dg/ext/attrib33.C: Likewise.
* g++.dg/cpp1y/lambda-generic-variadic19.C: Likewise.
* g++.dg/cpp2a/lambda-generic10.C: Likewise.
* g++.dg/cpp0x/lambda/lambda-const3.C: Likewise.
* g++.dg/cpp0x/variadic164.C: Likewise.
* g++.dg/cpp0x/variadic17.C: Likewise.
* g++.dg/cpp0x/udlit-args-neg.C: Likewise.
* g++.dg/cpp0x/variadic28.C: Likewise.
* g++.dg/cpp0x/gen-attrs-33.C: Likewise.
* g++.dg/cpp23/explicit-obj-diagnostics3.C: Likewise.
* g++.old-deja/g++.law/operators15.C: Likewise.
* g++.old-deja/g++.mike/p811.C: Likewise.
* g++.old-deja/g++.mike/p12306.C (printf): Add , before ... .
* g++.dg/analyzer/fd-bind-pr107783.C (bind): Likewise.
* g++.dg/cpp0x/vt-65790.C (printf): Likewise.
libstdc++-v3/
* include/std/functional (_Bind_check_arity): Add , before ... .
* include/bits/refwrap.h (_Mem_fn_traits, _Weak_result_type_impl):
Likewise.
* include/tr1/type_traits (is_function): Likewise.
--- gcc/c-family/c.opt.jj 2024-11-22 19:52:19.477579338 +0100
+++ gcc/c-family/c.opt 2024-11-25 16:22:11.325028058 +0100
@@ -672,6 +672,10 @@ Wdeprecated-non-prototype
C ObjC Var(warn_deprecated_non_prototype) Init(-1) Warning
Warn about calls with arguments to functions declared without parameters.
+Wdeprecated-variadic-comma-omission
+C++ ObjC++ Var(warn_deprecated_variadic_comma_omission) Warning
+Warn about deprecated omission of comma before ... in variadic function
declaration.
+
Wdesignated-init
C ObjC Var(warn_designated_init) Init(1) Warning
Warn about positional initialization of structs requiring designated
initializers.
--- gcc/c-family/c.opt.urls.jj 2024-11-18 21:59:35.872150269 +0100
+++ gcc/c-family/c.opt.urls 2024-11-25 17:38:25.396693802 +0100
@@ -310,6 +310,9 @@ UrlSuffix(gcc/C_002b_002b-Dialect-Option
Wdeprecated-non-prototype
UrlSuffix(gcc/Warning-Options.html#index-Wdeprecated-non-prototype)
+Wdeprecated-variadic-comma-omission
+UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-Wdeprecated-variadic-comma-omission)
+
Wdesignated-init
UrlSuffix(gcc/Warning-Options.html#index-Wdesignated-init)
--- gcc/c-family/c-opts.cc.jj 2024-11-23 13:00:28.188030262 +0100
+++ gcc/c-family/c-opts.cc 2024-11-25 16:23:36.569829016 +0100
@@ -1051,6 +1051,11 @@ c_common_post_options (const char **pfil
warn_deprecated_literal_operator,
deprecated_in (cxx23));
+ /* -Wdeprecated-variadic-comma-omission is enabled by default in C++26. */
+ SET_OPTION_IF_UNSET (&global_options, &global_options_set,
+ warn_deprecated_variadic_comma_omission,
+ deprecated_in (cxx26));
+
/* -Wtemplate-id-cdtor is enabled by default in C++20. */
SET_OPTION_IF_UNSET (&global_options, &global_options_set,
warn_template_id_cdtor,
--- gcc/cp/parser.cc.jj 2024-11-23 13:00:29.060017680 +0100
+++ gcc/cp/parser.cc 2024-11-25 17:02:24.551059305 +0100
@@ -25667,6 +25667,16 @@ cp_parser_parameter_declaration_clause (
omitted. */
else if (token->type == CPP_ELLIPSIS)
{
+ /* Deprecated by P3176R1 in C++26. */
+ if (warn_deprecated_variadic_comma_omission)
+ {
+ gcc_rich_location richloc (token->location);
+ richloc.add_fixit_insert_before (", ");
+ warning_at (&richloc, OPT_Wdeprecated_variadic_comma_omission,
+ "omitting of %<,%> before variadic %<...%> is "
+ "deprecated in C++26");