diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2024-07-29 12:52:40 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2024-07-30 21:14:29 +0100 |
commit | 4883c9571f5fb8fc7e873bb8a31aa164c5cfd0e0 (patch) | |
tree | b0c4f26cc617fdefde143e4588d5abde82533c12 /libstdc++-v3/include | |
parent | 8f05ada7dfb9a40d4333a2aa9ccb5ddcdf8e2b06 (diff) | |
download | gcc-4883c9571f5fb8fc7e873bb8a31aa164c5cfd0e0.zip gcc-4883c9571f5fb8fc7e873bb8a31aa164c5cfd0e0.tar.gz gcc-4883c9571f5fb8fc7e873bb8a31aa164c5cfd0e0.tar.bz2 |
libstdc++: Fix formatter for low-resolution chrono::zoned_time (LWG 4124)
This implements the proposed resolution of LWG 4124, so that
low-resolution chrono::zoned_time objects can be formatted. The
formatter for zoned_time<D, P> needs to account for get_local_time
returning local_time<common_type_t<D, seconds>> not local_time<D>.
libstdc++-v3/ChangeLog:
* include/bits/chrono_io.h (__local_time_fmt_for): New alias
template.
(formatter<zoned_time<D, P>>): Use __local_time_fmt_for.
* testsuite/std/time/zoned_time/io.cc: Check zoned_time<minutes>
can be formatted.
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/chrono_io.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/libstdc++-v3/include/bits/chrono_io.h b/libstdc++-v3/include/bits/chrono_io.h index e7e7deb..d8a4a12 100644 --- a/libstdc++-v3/include/bits/chrono_io.h +++ b/libstdc++-v3/include/bits/chrono_io.h @@ -164,6 +164,12 @@ namespace __detail const string* _M_abbrev; const seconds* _M_offset_sec; }; + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 4124. Cannot format zoned_time with resolution coarser than seconds + template<typename _Duration> + using __local_time_fmt_for + = __local_time_fmt<common_type_t<_Duration, seconds>>; } /// @endcond @@ -2137,15 +2143,15 @@ namespace __format #if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI template<typename _Duration, typename _TimeZonePtr, typename _CharT> struct formatter<chrono::zoned_time<_Duration, _TimeZonePtr>, _CharT> - : formatter<chrono::__detail::__local_time_fmt<_Duration>, _CharT> + : formatter<chrono::__detail::__local_time_fmt_for<_Duration>, _CharT> { template<typename _FormatContext> typename _FormatContext::iterator format(const chrono::zoned_time<_Duration, _TimeZonePtr>& __tp, _FormatContext& __ctx) const { - using chrono::__detail::__local_time_fmt; - using _Base = formatter<__local_time_fmt<_Duration>, _CharT>; + using _Ltf = chrono::__detail::__local_time_fmt_for<_Duration>; + using _Base = formatter<_Ltf, _CharT>; const chrono::sys_info __info = __tp.get_info(); const auto __lf = chrono::local_time_format(__tp.get_local_time(), &__info.abbrev, |