On Fri, 6 Jun 2025, 08:34 Tomasz Kamiński, <tkami...@redhat.com> wrote:

> Formatting sys_info as wchar_t require widening of the abbrev (zone)
> member.
> To support that we reuse the existing code in support for '%Z' specifier,
> for
> local_time_format, and produce output using singe format call with
> "[{0:%F %T},{1:%F %T},{2:%T},{3:%Q%q},{0:%Z}]" format string.
> As noted in the comment, produced output is localled independed, as it does
> not contain decimal separtors.
>
> For sys_info, the outputed literals are widended using _GLIBCXX_WIDEN,
> except
> opening and closing brackets, that are fetched from __format::_Separators.
>
>         PR libstdc++/120565
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/chrono_io.h
>         (operator<<(basic_ostream<_CharT, _Traits>&, const sys_info&))
>         (operator<<(basic_ostream<_CharT, _Traits>&, const local_info&)):
>         Support wchar_t as _CharT.
>         * testsuite/std/time/format/empty_spec.cc: Instantiated test_infos
> for
>         wchar_t and increase timeout.
> ---
> This patch is on top of following patch that add test cases covering
> local_info:
> "[PATCH v2] libstdc++: Test for formatting with empty spec for local_info
> and sys_info."
> The test timeout-factor is now 5, so perfect test for testing compile-time
> reduction
> for chrono. This is why I haven't separated it in multiple-files.
>
> Tested both combined on x86_64-linux. OK for trunk?
>

OK thanks

>
>  libstdc++-v3/include/bits/chrono_io.h         | 23 +++++++++++--------
>  .../testsuite/std/time/format/empty_spec.cc   |  6 ++---
>  2 files changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/chrono_io.h
> b/libstdc++-v3/include/bits/chrono_io.h
> index 9711a83cebe..c5c5e4bae53 100644
> --- a/libstdc++-v3/include/bits/chrono_io.h
> +++ b/libstdc++-v3/include/bits/chrono_io.h
> @@ -2944,9 +2944,14 @@ namespace __detail
>      basic_ostream<_CharT, _Traits>&
>      operator<<(basic_ostream<_CharT, _Traits>& __os, const sys_info& __i)
>      {
> -      __os << '[' << __i.begin << ',' << __i.end
> -          << ',' << hh_mm_ss(__i.offset) << ',' << __i.save
> -          << ',' << __i.abbrev << ']';
> +      // n.b. only decimal separator is locale dependent for specifiers
> +      // used below, as sys_info uses seconds and minutes duration, the
> +      // output is locale-independent.
> +      constexpr auto* __fs
> +       = _GLIBCXX_WIDEN("[{0:%F %T},{1:%F %T},{2:%T},{3:%Q%q},{0:%Z}]");
> +      local_seconds __lb(__i.begin.time_since_epoch());
> +      __os << std::format(__fs, local_time_format(__lb, &__i.abbrev),
> +                         __i.end, __i.offset, __i.save);
>        return __os;
>      }
>
> @@ -2955,19 +2960,19 @@ namespace __detail
>      basic_ostream<_CharT, _Traits>&
>      operator<<(basic_ostream<_CharT, _Traits>& __os, const local_info&
> __li)
>      {
> -      __os << '[';
> +      __os << __format::_Separators<_CharT>::_S_squares()[0];
>        if (__li.result == local_info::unique)
>         __os << __li.first;
>        else
>         {
>           if (__li.result == local_info::nonexistent)
> -           __os << "nonexistent";
> +           __os << _GLIBCXX_WIDEN("nonexistent");
>           else
> -           __os << "ambiguous";
> -         __os << " local time between " << __li.first;
> -         __os << " and " << __li.second;
> +           __os << _GLIBCXX_WIDEN("ambiguous");
> +         __os << _GLIBCXX_WIDEN(" local time between ") << __li.first;
> +         __os << _GLIBCXX_WIDEN(" and ") << __li.second;
>         }
> -      __os << ']';
> +      __os << __format::_Separators<_CharT>::_S_squares()[1];
>        return __os;
>      }
>
> diff --git a/libstdc++-v3/testsuite/std/time/format/empty_spec.cc
> b/libstdc++-v3/testsuite/std/time/format/empty_spec.cc
> index 661712f1238..7af00e46861 100644
> --- a/libstdc++-v3/testsuite/std/time/format/empty_spec.cc
> +++ b/libstdc++-v3/testsuite/std/time/format/empty_spec.cc
> @@ -842,14 +842,14 @@ test_all()
>    test_durations<CharT>();
>    test_calendar<CharT>();
>    test_time_points<CharT>();
> +#if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI
> +  test_infos<CharT>();
> +#endif
>  }
>
>  int main()
>  {
>    test_all<char>();
> -#if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI
> -  test_infos<char>();
> -#endif
>
>  #ifdef _GLIBCXX_USE_WCHAR_T
>    test_all<wchar_t>();
> --
> 2.49.0
>
>

Reply via email to