This is done in https://gcc.gnu.org/pipermail/libstdc++/2025-September/063601.html. (Patch 1/2 is another small cleanup).
On Mon, Sep 22, 2025 at 9:47 AM Tomasz Kaminski <tkami...@redhat.com> wrote: > The formatter for chrono::local_time needs to also be updated, to reflect > that operator<< is not > always available, thus "{}" format spec should not be supported. > Essentially a same approach of for sys_time specialization needs to be > taken: > * __defSec should have empty _M_chrono_spec if the local time is not > stream instertable > * parse function should throw an if _M_chrono_spec is empty, this check > an be be omitted for __stream_insertable > types. > > > > On Fri, Sep 19, 2025 at 3:23 PM Jonathan Wakely <jwak...@redhat.com> > wrote: > >> This was reported as LWG 4257 and moved to Tentatively Ready status. >> >> libstdc++-v3/ChangeLog: >> >> * include/bits/chrono_io.h: Remove unused <iomanip> header. >> (operator<<): Constrain overload for chrono::local_time. >> * testsuite/std/time/clock/local/io.cc: Check constraints. >> --- >> >> Tested powerpc64le-linux. >> >> libstdc++-v3/include/bits/chrono_io.h | 4 +++- >> libstdc++-v3/testsuite/std/time/clock/local/io.cc | 8 ++++++++ >> 2 files changed, 11 insertions(+), 1 deletion(-) >> >> diff --git a/libstdc++-v3/include/bits/chrono_io.h >> b/libstdc++-v3/include/bits/chrono_io.h >> index 809d795cbf2b..593a927811a6 100644 >> --- a/libstdc++-v3/include/bits/chrono_io.h >> +++ b/libstdc++-v3/include/bits/chrono_io.h >> @@ -37,7 +37,6 @@ >> #if __cplusplus >= 202002L >> >> #include <sstream> // ostringstream >> -#include <iomanip> // setw, setfill >> #include <format> >> #include <charconv> // from_chars >> #include <stdexcept> // __sso_string >> @@ -4014,6 +4013,9 @@ namespace __detail >> inline basic_ostream<_CharT, _Traits>& >> operator<<(basic_ostream<_CharT, _Traits>& __os, >> const local_time<_Duration>& __lt) >> + // _GLIBCXX_RESOLVE_LIB_DEFECTS >> + // 4257. Stream insertion for chrono::local_time should be >> constrained >> + requires requires(const sys_time<_Duration>& __st) { __os << __st; } >> { >> __os << sys_time<_Duration>{__lt.time_since_epoch()}; >> return __os; >> diff --git a/libstdc++-v3/testsuite/std/time/clock/local/io.cc >> b/libstdc++-v3/testsuite/std/time/clock/local/io.cc >> index 67818e876497..6efd81a87c2a 100644 >> --- a/libstdc++-v3/testsuite/std/time/clock/local/io.cc >> +++ b/libstdc++-v3/testsuite/std/time/clock/local/io.cc >> @@ -125,6 +125,14 @@ test_parse() >> VERIFY( tp.time_since_epoch() == 0s ); >> } >> >> +// LWG 4257. Stream insertion for chrono::local_time should be >> constrained >> +template<typename T> >> +concept ostream_insertable = requires (std::ostream& o, const T& t) { o >> << t; }; >> +using D = std::chrono::duration<double>; >> +static_assert( ostream_insertable<std::chrono::local_days> ); >> +static_assert( ostream_insertable<std::chrono::local_seconds> ); >> +static_assert( ! ostream_insertable<std::chrono::local_time<D>> ); >> + >> int main() >> { >> test_ostream(); >> -- >> 2.51.0 >> >>