diff --git a/libstdc++-v3/include/bits/chrono_io.h b/libstdc++-v3/include/bits/chrono_io.h index e7e7deb2cde..d8a4a121113 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 + using __local_time_fmt_for + = __local_time_fmt>; } /// @endcond @@ -2137,15 +2143,15 @@ namespace __format #if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI template struct formatter, _CharT> - : formatter, _CharT> + : formatter, _CharT> { template 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, diff --git a/libstdc++-v3/testsuite/std/time/zoned_time/io.cc b/libstdc++-v3/testsuite/std/time/zoned_time/io.cc index ee3b9edba81..c113eea6d3f 100644 --- a/libstdc++-v3/testsuite/std/time/zoned_time/io.cc +++ b/libstdc++-v3/testsuite/std/time/zoned_time/io.cc @@ -66,6 +66,10 @@ test_format() ws = std::format(L"{:+^34}", zoned_time(zone, t)); VERIFY( ws == L"++2022-12-19 12:26:25.708000 EST++" ); #endif + + // LWG 4124. Cannot format zoned_time with resolution coarser than seconds + s = std::format("{}", zoned_time(zone, time_point_cast(t))); + VERIFY( s == "2022-12-19 12:26:00 EST" ); } int main()