]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Constrain operator<< for chrono::local_type
authorJonathan Wakely <jwakely@redhat.com>
Thu, 28 Aug 2025 12:59:09 +0000 (13:59 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 19 Sep 2025 20:12:15 +0000 (21:12 +0100)
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 <ppalka@redhat.com>
libstdc++-v3/include/bits/chrono_io.h
libstdc++-v3/testsuite/std/time/clock/local/io.cc

index 809d795cbf2b9cb4410f1ca0a072df948e124986..593a927811a6adab76962f96a76f61de3987d260 100644 (file)
@@ -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;
index 67818e876497acc62a7fcd1ee7669c21e1ea422e..6efd81a87c2ab0110878382f0ec85ab8242c001f 100644 (file)
@@ -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();