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 > >