https://gcc.gnu.org/g:dc78d691c5e5f72cd05113c4734985aa4e70cc47
commit r16-3996-gdc78d691c5e5f72cd05113c4734985aa4e70cc47 Author: Jonathan Wakely <[email protected]> Date: Thu Aug 28 13:59:09 2025 +0100 libstdc++: Constrain operator<< for chrono::local_type 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. Reviewed-by: Patrick Palka <[email protected]> Diff: --- 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();
