From: Jonathan Wakely Date: Thu, 28 Aug 2025 12:59:09 +0000 (+0100) Subject: libstdc++: Constrain operator<< for chrono::local_type X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dc78d691c5e5f72cd05113c4734985aa4e70cc47;p=thirdparty%2Fgcc.git 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 header. (operator<<): Constrain overload for chrono::local_time. * testsuite/std/time/clock/local/io.cc: Check constraints. Reviewed-by: Patrick Palka --- diff --git a/libstdc++-v3/include/bits/chrono_io.h b/libstdc++-v3/include/bits/chrono_io.h index 809d795cbf2..593a927811a 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 // ostringstream -#include // setw, setfill #include #include // from_chars #include // __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 67818e87649..6efd81a87c2 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 +concept ostream_insertable = requires (std::ostream& o, const T& t) { o << t; }; +using D = std::chrono::duration; +static_assert( ostream_insertable ); +static_assert( ostream_insertable ); +static_assert( ! ostream_insertable> ); + int main() { test_ostream();