On Tue, Sep 2, 2025 at 9:40 PM Jonathan Wakely <jwak...@redhat.com> wrote:

> The r16-3416-g806de30f51c8b9 change to use __cpp_lib_chrono in
> preprocessor conditions broke support for <chrono> for freestanding and
> the COW std::string ABI. That happened because __cpp_lib_chrono is only
> defined to the C++20 value for hosted and for the new ABI, because the
> full set of C++20 features are not defined for freestanding and tzdb is
> not defined for the old ABI.
>
> This introduces a new internal feature test macro that corresponds to
> the features that are always supported (e.g. chrono::local_time,
> chrono::year, chrono::weekday).
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/version.def (chrono_cxx20): Define.
>         * include/bits/version.h: Regenerate.  include/std/chrono: Check
>         __glibcxx_chrono_cxx20 instead of __cpp_lib_chrono for C++20
>         features that don't require the new std::string ABI and/or can
>         be used for freestanding.
>         * src/c++20/clock.cc: Adjust preprocessor condition.
> ---
>
LGTM. Thanks for preserving the feature test macro.

>
> Tested powerpc64-linux.
>
>  libstdc++-v3/include/bits/version.def | 10 ++++++++++
>  libstdc++-v3/include/bits/version.h   |  9 +++++++++
>  libstdc++-v3/include/std/chrono       | 13 ++++++++-----
>  libstdc++-v3/src/c++20/clock.cc       |  2 +-
>  4 files changed, 28 insertions(+), 6 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/version.def
> b/libstdc++-v3/include/bits/version.def
> index 84c755da10e2..8707a123109f 100644
> --- a/libstdc++-v3/include/bits/version.def
> +++ b/libstdc++-v3/include/bits/version.def
> @@ -594,6 +594,16 @@ ftms = {
>    };
>  };
>
> +ftms = {
> +  // Unofficial macro for C++20 chrono features supported for old string
> ABI.
> +  name = chrono_cxx20;
> +  values = {
> +    v = 201800;
> +    cxxmin = 20;
> +    no_stdname = yes;
> +  };
> +};
> +
>  ftms = {
>    name = execution;
>    values = {
> diff --git a/libstdc++-v3/include/bits/version.h
> b/libstdc++-v3/include/bits/version.h
> index 410e3205339d..c7569f42773c 100644
> --- a/libstdc++-v3/include/bits/version.h
> +++ b/libstdc++-v3/include/bits/version.h
> @@ -665,6 +665,15 @@
>  #endif /* !defined(__cpp_lib_chrono) && defined(__glibcxx_want_chrono) */
>  #undef __glibcxx_want_chrono
>
> +#if !defined(__cpp_lib_chrono_cxx20)
> +# if (__cplusplus >= 202002L)
> +#  define __glibcxx_chrono_cxx20 201800L
> +#  if defined(__glibcxx_want_all) || defined(__glibcxx_want_chrono_cxx20)
> +#  endif
> +# endif
> +#endif /* !defined(__cpp_lib_chrono_cxx20) &&
> defined(__glibcxx_want_chrono_cxx20) */
> +#undef __glibcxx_want_chrono_cxx20
> +
>  #if !defined(__cpp_lib_execution)
>  # if (__cplusplus >= 201703L) && _GLIBCXX_HOSTED
>  #  define __glibcxx_execution 201902L
> diff --git a/libstdc++-v3/include/std/chrono
> b/libstdc++-v3/include/std/chrono
> index d1a01fbdf0a8..f0207eaae8e0 100644
> --- a/libstdc++-v3/include/std/chrono
> +++ b/libstdc++-v3/include/std/chrono
> @@ -53,11 +53,14 @@
>  #if __cpp_lib_bitops >= 201907L
>  # include <bit> // __countr_zero
>  #endif
> -#if __cpp_lib_chrono >= 201803L && _GLIBCXX_HOSTED
> +#ifdef __glibcxx_chrono_cxx20
> +# include <bits/stl_algo.h>     // upper_bound
> +# include <bits/range_access.h> // begin/end for arrays
> +#endif
> +#if __cpp_lib_chrono >= 201803L // C++20 && HOSTED && USE_CXX11_ABI
>  # include <sstream>
>  # include <string>
>  # include <vector>
> -# include <bits/stl_algo.h> // upper_bound
>  # include <bits/shared_ptr.h>
>  # include <bits/unique_ptr.h>
>  #endif
> @@ -81,7 +84,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>     */
>    namespace chrono
>    {
> -#if __cpp_lib_chrono >= 201803L
> +#ifdef __glibcxx_chrono_cxx20
>      /// @addtogroup chrono
>      /// @{
>      struct local_t { };
> @@ -3319,7 +3322,7 @@ namespace __detail
>  #endif // C++20
>    } // namespace chrono
>
> -#if __cpp_lib_chrono >= 201803L
> +#ifdef __glibcxx_chrono_cxx20
>    inline namespace literals
>    {
>    inline namespace chrono_literals
> @@ -3348,7 +3351,7 @@ namespace __detail
>  _GLIBCXX_END_NAMESPACE_VERSION
>  } // namespace std
>
> -#if __cpp_lib_chrono >= 201803L && _GLIBCXX_HOSTED
> +#if defined __glibcxx_chrono_cxx20 && _GLIBCXX_HOSTED
>  # include <bits/chrono_io.h>
>  #endif
>
> diff --git a/libstdc++-v3/src/c++20/clock.cc
> b/libstdc++-v3/src/c++20/clock.cc
> index 9d674b0b46a2..4af65046e1f8 100644
> --- a/libstdc++-v3/src/c++20/clock.cc
> +++ b/libstdc++-v3/src/c++20/clock.cc
> @@ -35,7 +35,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>
>  namespace chrono
>  {
> -#if __cpp_lib_chrono >= 201803L && _GLIBCXX_HOSTED
> +#if defined __glibcxx_chrono_cxx20 && _GLIBCXX_HOSTED
>    // TODO use CLOCK_TAI on linux, add extension point.
>    time_point<tai_clock>
>    tai_clock::now()
> --
> 2.51.0
>
>

Reply via email to