On Mon, May 12, 2025 at 12:06 PM Jonathan Wakely <jwak...@redhat.com> wrote:

> Although <ciso646> was removed from C++20, it was not formally
> deprecated in C++17. In contrast, <ctgmath>, <cstdalign>, etc. were
> formally deprecated in C++17 before being removed in C++20.
>
> Due to the widespread convention of including <ciso646> to detect
> implementation-specific macros (such as _GLIBCXX_RELEASE) it causes
> quite a lot of noise to issue deprecation warnings in C++17 mode. The
> recommendation to include <version> instead does work for recent
> compilers, even in C++17 mode, but isn't portable to older compilers
> that don't provide <version> yet (e.g. GCC 8).
>
> There are also potential objections to including <version> pre-C++20
> when it wasn't defined by the standard. I don't have much sympathy for
> this position, because including <ciso646> for implementation-specific
> macros wasn't part of the C++17 standard either. It's no more
> non-standard to rely on <version> being present and defining those
> macros than to rely on <ciso646> defining them, and __has_include can be
> used to detect whether <version> is present. However, <ciso646> is being
> used in the wild by popular libraries like Abseil and we can't change
> versions of those that have already been released.
>
> This removes the #warning in <ciso646> for C++17 mode, so that we only
> emit diagnostics for C++20 and later. With this change, including
> <ciso646> in C++20 or later gives an error if _GLIBCXX_USE_DEPRECATED is
> defined to zero, otherwise a warning if -Wdeprecated is enabled,
> otherwise no diagnostic is given.
>
> This also adds "@since C++11 (removed in C++20)" to the Doxygen @file
> comments in all the relevant headers.
>
> The test for <ciso646> needs to be updated to no longer expect a warning
> for c++17_only. A new test is added to ensure that we get a warning
> instead of an error when -D_GLIBCXX_USE_DEPRECATED=0 is not used.
>
> libstdc++-v3/ChangeLog:
>
>         PR libstdc++/120187
>         * include/c_global/ciso646: Only give deprecated warning for
>         C++20 and later.
>         * include/c_global/ccomplex: Add @since to Doxygen comment.
>         * include/c_global/cstdalign: Likewise.
>         * include/c_global/cstdbool: Likewise.
>         * include/c_global/ctgmath: Likewise.
>         * testsuite/18_support/headers/ciso646/macros.cc: Remove
>         dg-warning for c++17_only effective target.
>         * testsuite/18_support/headers/ciso646/macros-2.cc: New test.
> ---
>
> Tested x86_64-linux.
>
LGTM.

>
>  libstdc++-v3/include/c_global/ccomplex         |  2 ++
>  libstdc++-v3/include/c_global/ciso646          | 18 +++++++++++-------
>  libstdc++-v3/include/c_global/cstdalign        |  2 ++
>  libstdc++-v3/include/c_global/cstdbool         |  2 ++
>  libstdc++-v3/include/c_global/ctgmath          |  2 ++
>  .../18_support/headers/ciso646/macros-2.cc     |  7 +++++++
>  .../18_support/headers/ciso646/macros.cc       |  1 -
>  7 files changed, 26 insertions(+), 8 deletions(-)
>  create mode 100644
> libstdc++-v3/testsuite/18_support/headers/ciso646/macros-2.cc
>
> diff --git a/libstdc++-v3/include/c_global/ccomplex
> b/libstdc++-v3/include/c_global/ccomplex
> index 7044cf74f6c7..a39273f4a8a2 100644
> --- a/libstdc++-v3/include/c_global/ccomplex
> +++ b/libstdc++-v3/include/c_global/ccomplex
> @@ -24,6 +24,8 @@
>
>  /** @file include/ccomplex
>   *  This is a Standard C++ Library header.
> + *
> + *  @since C++11 (removed in C++20)
>   */
>
>  #ifndef _GLIBCXX_CCOMPLEX
> diff --git a/libstdc++-v3/include/c_global/ciso646
> b/libstdc++-v3/include/c_global/ciso646
> index a663e04caf08..6dec7df1631f 100644
> --- a/libstdc++-v3/include/c_global/ciso646
> +++ b/libstdc++-v3/include/c_global/ciso646
> @@ -28,6 +28,8 @@
>   *
>   *  This is the C++ version of the Standard C Library header @c iso646.h,
>   *  which is empty in C++.
> + *
> + *  @since C++11 (removed in C++20)
>   */
>  #ifndef _GLIBCXX_CISO646
>  #define _GLIBCXX_CISO646
> @@ -38,13 +40,15 @@
>
>  #include <bits/c++config.h>
>
> -#if __cplusplus >= 202002L && ! _GLIBCXX_USE_DEPRECATED
> -#  error "<ciso646> is not a standard header in C++20, use <version> to
> detect implementation-specific macros"
> -#elif __cplusplus >= 201703L && defined __DEPRECATED
> -#  pragma GCC diagnostic push
> -#  pragma GCC diagnostic ignored "-Wc++23-extensions"
> -#  warning "<ciso646> is deprecated in C++17, use <version> to detect
> implementation-specific macros"
> -#  pragma GCC diagnostic pop
> +#if __cplusplus >= 202002L
> +#  if ! _GLIBCXX_USE_DEPRECATED
> +#    error "<ciso646> is not a standard header since C++20, use <version>
> to detect implementation-specific macros"
> +#  elif defined __DEPRECATED
> +#    pragma GCC diagnostic push
> +#    pragma GCC diagnostic ignored "-Wc++23-extensions"
> +#    warning "<ciso646> is not a standard header since C++20, use
> <version> to detect implementation-specific macros"
> +#    pragma GCC diagnostic pop
> +#  endif
>  #endif
>
>  #endif
> diff --git a/libstdc++-v3/include/c_global/cstdalign
> b/libstdc++-v3/include/c_global/cstdalign
> index 92e0ad633089..41ce5065ca08 100644
> --- a/libstdc++-v3/include/c_global/cstdalign
> +++ b/libstdc++-v3/include/c_global/cstdalign
> @@ -24,6 +24,8 @@
>
>  /** @file include/cstdalign
>   *  This is a Standard C++ Library header.
> + *
> + *  @since C++11 (removed in C++20)
>   */
>
>  #ifndef _GLIBCXX_CSTDALIGN
> diff --git a/libstdc++-v3/include/c_global/cstdbool
> b/libstdc++-v3/include/c_global/cstdbool
> index e75f56cd5a12..5933d7d96945 100644
> --- a/libstdc++-v3/include/c_global/cstdbool
> +++ b/libstdc++-v3/include/c_global/cstdbool
> @@ -24,6 +24,8 @@
>
>  /** @file include/cstdbool
>   *  This is a Standard C++ Library header.
> + *
> + *  @since C++11 (removed in C++20)
>   */
>
>  #ifndef _GLIBCXX_CSTDBOOL
> diff --git a/libstdc++-v3/include/c_global/ctgmath
> b/libstdc++-v3/include/c_global/ctgmath
> index 0a5a0e79b297..b708878ef127 100644
> --- a/libstdc++-v3/include/c_global/ctgmath
> +++ b/libstdc++-v3/include/c_global/ctgmath
> @@ -24,6 +24,8 @@
>
>  /** @file include/ctgmath
>   *  This is a Standard C++ Library header.
> + *
> + *  @since C++11 (removed in C++20)
>   */
>
>  #ifndef _GLIBCXX_CTGMATH
> diff --git a/libstdc++-v3/testsuite/18_support/headers/ciso646/macros-2.cc
> b/libstdc++-v3/testsuite/18_support/headers/ciso646/macros-2.cc
> new file mode 100644
> index 000000000000..a49292408a33
> --- /dev/null
> +++ b/libstdc++-v3/testsuite/18_support/headers/ciso646/macros-2.cc
> @@ -0,0 +1,7 @@
> +// { dg-options " -Wdeprecated -fno-operator-names" }
> +// { dg-do preprocess }
> +
> +// Should get a warning for C++20 and up without
> -D_GLIBCXX_USE_DEPRECATED=0
> +// { dg-warning "not a standard header" "" { target c++20 } 0 }
> +
> +#include "macros.cc"
> diff --git a/libstdc++-v3/testsuite/18_support/headers/ciso646/macros.cc
> b/libstdc++-v3/testsuite/18_support/headers/ciso646/macros.cc
> index ab3a041de062..0cb5168d5ec9 100644
> --- a/libstdc++-v3/testsuite/18_support/headers/ciso646/macros.cc
> +++ b/libstdc++-v3/testsuite/18_support/headers/ciso646/macros.cc
> @@ -3,7 +3,6 @@
>
>  #include <ciso646>
>
> -// { dg-warning "deprecated" "" { target c++17_only } 0 }
>  // { dg-error "not a standard header" "" { target c++20 } 0 }
>
>  #ifdef and
> --
> 2.49.0
>
>

Reply via email to