On Fri, May 16, 2025 at 7:33 PM Jonathan Wakely <jwak...@redhat.com> wrote:

> Formatting of chrono::local_days with an empty chrono-specs should be
> equivalent to inserting it into an ostream, which should use the
> overload for inserting chrono::sys_days into an ostream. The
> implementation of empty chrono-specs in _M_format_to_ostream takes some
> short cuts, and that wasn't being done correctly for chrono::local_days.
>
> libstdc++-v3/ChangeLog:
>
>         PR libstdc++/120293
>         * include/bits/chrono_io.h (_M_format_to_ostream): Add special
>         case for local_time convertible to local_days.
>         * testsuite/std/time/clock/local/io.cc: Check formatting of
>         chrono::local_days.
> ---
>
> Tested x86_64-linux.
>
LGTM, thanks.

>
>  libstdc++-v3/include/bits/chrono_io.h             | 3 +++
>  libstdc++-v3/testsuite/std/time/clock/local/io.cc | 3 +++
>  2 files changed, 6 insertions(+)
>
> diff --git a/libstdc++-v3/include/bits/chrono_io.h
> b/libstdc++-v3/include/bits/chrono_io.h
> index ace8b9f26292..92a3098e808c 100644
> --- a/libstdc++-v3/include/bits/chrono_io.h
> +++ b/libstdc++-v3/include/bits/chrono_io.h
> @@ -766,6 +766,9 @@ namespace __format
>                   // sys_time with period greater or equal to days:
>                   if constexpr (is_convertible_v<_Tp, chrono::sys_days>)
>                     __os << _S_date(__t);
> +                 // Or a local_time with period greater or equal to days:
> +                 else if constexpr (is_convertible_v<_Tp,
> chrono::local_days>)
> +                   __os << _S_date(__t);
>                   else // Or it's formatted as "{:L%F %T}":
>                     {
>                       auto __days = chrono::floor<chrono::days>(__t);
> diff --git a/libstdc++-v3/testsuite/std/time/clock/local/io.cc
> b/libstdc++-v3/testsuite/std/time/clock/local/io.cc
> index b4d562f36d12..67818e876497 100644
> --- a/libstdc++-v3/testsuite/std/time/clock/local/io.cc
> +++ b/libstdc++-v3/testsuite/std/time/clock/local/io.cc
> @@ -89,6 +89,9 @@ test_format()
>
>    s = std::format("{}", local_seconds{});
>    VERIFY( s == "1970-01-01 00:00:00" );
> +
> +  s = std::format("{}", local_days{}); // PR libstdc++/120293
> +  VERIFY( s == "1970-01-01" );
>  }
>
>  void
> --
> 2.49.0
>
>

Reply via email to