[gcc r16-731] libstdc++: Fix std::format of chrono::local_days with {} [PR120293]
Jonathan Wakely
redi@gcc.gnu.org
Mon May 19 09:45:12 GMT 2025
https://gcc.gnu.org/g:1ed7585bf60ba9940ca5dc6d2c72dba86eea7b4d
commit r16-731-g1ed7585bf60ba9940ca5dc6d2c72dba86eea7b4d
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Thu May 15 19:32:01 2025 +0100
libstdc++: Fix std::format of chrono::local_days with {} [PR120293]
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.
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Diff:
---
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
More information about the Libstdc++-cvs
mailing list