On Thu, Oct 3, 2024 at 12:41 PM Jason Merrill <ja...@redhat.com> wrote:
>
> Tested x86_64-pc-linux-gnu, applying to trunk.
>
> -- 8< --
>
> By default -Wdeprecated warns about deprecations in the active standard.
> When specified explicitly, let's also warn about deprecations in later
> standards.
>
> gcc/c-family/ChangeLog:
>
>         * c-opts.cc (c_common_post_options): Explicit -Wdeprecated enables
>         deprecations from later standards.
>
> gcc/ChangeLog:
>
>         * doc/invoke.texi: Explicit -Wdeprecated enables more warnings.
> ---

This strikes me as slightly dangerous. At the very least this should
get a note in the "Caveats" and/or "Porting To" section of the release
notes, as I can see the change breaking some builds that also use
-Werror.

>  gcc/doc/invoke.texi    | 22 ++++++++++++++++------
>  gcc/c-family/c-opts.cc | 17 ++++++++++++-----
>  2 files changed, 28 insertions(+), 11 deletions(-)
>
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index c90f5b4d58e..d38c1feb86f 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -3864,8 +3864,10 @@ for code that is not valid in C++23 but used to be 
> valid but deprecated
>  in C++20 with a pedantic warning that can be disabled with
>  @option{-Wno-comma-subscript}.
>
> -Enabled by default with @option{-std=c++20} unless @option{-Wno-deprecated},
> -and with @option{-std=c++23} regardless of @option{-Wno-deprecated}.
> +Enabled by default with @option{-std=c++20} unless
> +@option{-Wno-deprecated}, and after @option{-std=c++23} regardless of
> +@option{-Wno-deprecated}.  Before @option{-std=c++20}, enabled with
> +explicit @option{-Wdeprecated}.
>
>  This warning is upgraded to an error by @option{-pedantic-errors} in
>  C++23 mode or later.
> @@ -4012,7 +4014,7 @@ int k = f - e;
>
>  @option{-Wdeprecated-enum-enum-conversion} is enabled by default with
>  @option{-std=c++20}.  In pre-C++20 dialects, this warning can be enabled
> -by @option{-Wenum-conversion}.
> +by @option{-Wenum-conversion} or @option{-Wdeprecated}.
>
>  @opindex Wdeprecated-enum-float-conversion
>  @opindex Wno-deprecated-enum-float-conversion
> @@ -4030,14 +4032,14 @@ bool b = e <= 3.7;
>
>  @option{-Wdeprecated-enum-float-conversion} is enabled by default with
>  @option{-std=c++20}.  In pre-C++20 dialects, this warning can be enabled
> -by @option{-Wenum-conversion}.
> +by @option{-Wenum-conversion} or @option{-Wdeprecated}.
>
>  @opindex Wdeprecated-literal-operator
>  @opindex Wno-deprecated-literal-operator
>  @item -Wdeprecated-literal-operator @r{(C++ and Objective-C++ only)}
>  Warn that the declaration of a user-defined literal operator with a
>  space before the suffix is deprecated.  This warning is enabled by
> -default in C++23.
> +default in C++23, or with explicit @option{-Wdeprecated}.
>
>  @smallexample
>  string operator "" _i18n(const char*, std::size_t); // deprecated
> @@ -4740,7 +4742,8 @@ non-class type, @code{volatile}-qualified function 
> return type,
>  @code{volatile}-qualified parameter type, and structured bindings of a
>  @code{volatile}-qualified type.  This usage was deprecated in C++20.
>
> -Enabled by default with @option{-std=c++20}.
> +Enabled by default with @option{-std=c++20}.  Before
> +@option{-std=c++20}, enabled with explicit @option{-Wdeprecated}.
>
>  @opindex Wzero-as-null-pointer-constant
>  @opindex Wno-zero-as-null-pointer-constant
> @@ -10389,6 +10392,13 @@ disable the error when compiled with 
> @option{-Werror} flag.
>  @item -Wno-deprecated
>  Do not warn about usage of deprecated features.  @xref{Deprecated Features}.
>
> +In C++, explicitly specifying @option{-Wdeprecated} also enables
> +warnings about some features that are deprecated in later language
> +standards, specifically @option{-Wcomma-subscript},
> +@option{-Wvolatile}, @option{-Wdeprecated-enum-float-conversion},
> +@option{-Wdeprecated-enum-enum-conversion}, and
> +@option{-Wdeprecated-literal-operator}.
> +
>  @opindex Wno-deprecated-declarations
>  @opindex Wdeprecated-declarations
>  @item -Wno-deprecated-declarations
> diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
> index 8ff3d966bb6..510e0870140 100644
> --- a/gcc/c-family/c-opts.cc
> +++ b/gcc/c-family/c-opts.cc
> @@ -996,30 +996,37 @@ c_common_post_options (const char **pfilename)
>    SET_OPTION_IF_UNSET (&global_options, &global_options_set, warn_register,
>                        cxx_dialect >= cxx17);
>
> +  /* Explicit -Wdeprecated turns on warnings from later standards.  */
> +  auto deprecated_in = [&](enum cxx_dialect d)
> +  {
> +    if (OPTION_SET_P (warn_deprecated)) return !!warn_deprecated;
> +    return (warn_deprecated && cxx_dialect >= d);
> +  };
> +
>    /* -Wcomma-subscript is enabled by default in C++20.  */
>    SET_OPTION_IF_UNSET (&global_options, &global_options_set,
>                        warn_comma_subscript,
>                        cxx_dialect >= cxx23
> -                      || (cxx_dialect == cxx20 && warn_deprecated));
> +                      || deprecated_in (cxx20));
>
>    /* -Wvolatile is enabled by default in C++20.  */
>    SET_OPTION_IF_UNSET (&global_options, &global_options_set, warn_volatile,
> -                      cxx_dialect >= cxx20 && warn_deprecated);
> +                      deprecated_in (cxx20));
>
>    /* -Wdeprecated-enum-enum-conversion is enabled by default in C++20.  */
>    SET_OPTION_IF_UNSET (&global_options, &global_options_set,
>                        warn_deprecated_enum_enum_conv,
> -                      cxx_dialect >= cxx20 && warn_deprecated);
> +                      deprecated_in (cxx20));
>
>    /* -Wdeprecated-enum-float-conversion is enabled by default in C++20.  */
>    SET_OPTION_IF_UNSET (&global_options, &global_options_set,
>                        warn_deprecated_enum_float_conv,
> -                      cxx_dialect >= cxx20 && warn_deprecated);
> +                      deprecated_in (cxx20));
>
>    /* -Wdeprecated-literal-operator is enabled by default in C++23.  */
>    SET_OPTION_IF_UNSET (&global_options, &global_options_set,
>                        warn_deprecated_literal_operator,
> -                      cxx_dialect >= cxx23 && warn_deprecated);
> +                      deprecated_in (cxx23));
>
>    /* -Wtemplate-id-cdtor is enabled by default in C++20.  */
>    SET_OPTION_IF_UNSET (&global_options, &global_options_set,
> --
> 2.46.2
>

Reply via email to