llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-libcxx Author: Mark de Wever (mordante) <details> <summary>Changes</summary> The negative values were shown as 1900-01-01 00:01:39.-00000001 after the changes they are shown as 1900-01-01 00:01:39.999999999 --- Full diff: https://github.com/llvm/llvm-project/pull/89408.diff 4 Files Affected: - (modified) libcxx/include/__chrono/formatter.h (+3) - (modified) libcxx/test/std/time/time.clock/time.clock.file/ostream.pass.cpp (+54) - (modified) libcxx/test/std/time/time.clock/time.clock.local/ostream.pass.cpp (+54) - (modified) libcxx/test/std/time/time.clock/time.clock.system/sys_time.ostream.pass.cpp (+54) ``````````diff diff --git a/libcxx/include/__chrono/formatter.h b/libcxx/include/__chrono/formatter.h index 226fccbee6d133..058e9ac97bc941 100644 --- a/libcxx/include/__chrono/formatter.h +++ b/libcxx/include/__chrono/formatter.h @@ -88,6 +88,9 @@ __format_sub_seconds(basic_stringstream<_CharT>& __sstr, const chrono::duration< using __duration = chrono::duration<_Rep, _Period>; auto __fraction = __value - chrono::duration_cast<chrono::seconds>(__value); + // Converts a negative fraction to its positive value. + if (__value < chrono::seconds{0}) + __fraction += chrono::seconds{1}; if constexpr (chrono::treat_as_floating_point_v<_Rep>) // When the floating-point value has digits itself they are ignored based // on the wording in [tab:time.format.spec] diff --git a/libcxx/test/std/time/time.clock/time.clock.file/ostream.pass.cpp b/libcxx/test/std/time/time.clock/time.clock.file/ostream.pass.cpp index 18a4506b91566b..99d56002e9c391 100644 --- a/libcxx/test/std/time/time.clock/time.clock.file/ostream.pass.cpp +++ b/libcxx/test/std/time/time.clock/time.clock.file/ostream.pass.cpp @@ -71,6 +71,24 @@ template <class CharT> static void test_c() { using namespace std::literals::chrono_literals; + assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) == + SV("1940-01-01 22:57:56.876543211")); + + assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{-946'688'523'123'456us}) == + SV("1940-01-01 22:57:56.876544")); + + assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{-946'688'523'123ms}) == + SV("1940-01-01 22:57:56.877")); + + assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-1ns}) == + SV("1969-12-31 23:59:59.999999999")); + + assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{0ns}) == + SV("1970-01-01 00:00:00.000000000")); + + assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{1ns}) == + SV("1970-01-01 00:00:00.000000001")); + assert(stream_c_locale<CharT>(file_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03.123456789")); assert(stream_c_locale<CharT>(file_time<std::chrono::microseconds>{946'688'523'123'456us}) == @@ -107,6 +125,24 @@ template <class CharT> static void test_fr_FR() { using namespace std::literals::chrono_literals; + assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) == + SV("1940-01-01 22:57:56,876543211")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{-946'688'523'123'456us}) == + SV("1940-01-01 22:57:56,876544")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{-946'688'523'123ms}) == + SV("1940-01-01 22:57:56,877")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-1ns}) == + SV("1969-12-31 23:59:59,999999999")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{0ns}) == + SV("1970-01-01 00:00:00,000000000")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{1ns}) == + SV("1970-01-01 00:00:00,000000001")); + assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03,123456789")); assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::microseconds>{946'688'523'123'456us}) == @@ -144,6 +180,24 @@ template <class CharT> static void test_ja_JP() { using namespace std::literals::chrono_literals; + assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) == + SV("1940-01-01 22:57:56.876543211")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{-946'688'523'123'456us}) == + SV("1940-01-01 22:57:56.876544")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{-946'688'523'123ms}) == + SV("1940-01-01 22:57:56.877")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-1ns}) == + SV("1969-12-31 23:59:59.999999999")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{0ns}) == + SV("1970-01-01 00:00:00.000000000")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{1ns}) == + SV("1970-01-01 00:00:00.000000001")); + assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03.123456789")); assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::microseconds>{946'688'523'123'456us}) == diff --git a/libcxx/test/std/time/time.clock/time.clock.local/ostream.pass.cpp b/libcxx/test/std/time/time.clock/time.clock.local/ostream.pass.cpp index 9fdef8d5adc782..6ec63a14fbbd33 100644 --- a/libcxx/test/std/time/time.clock/time.clock.local/ostream.pass.cpp +++ b/libcxx/test/std/time/time.clock/time.clock.local/ostream.pass.cpp @@ -64,6 +64,24 @@ template <class CharT> static void test_c() { using namespace std::literals::chrono_literals; + assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) == + SV("1940-01-01 22:57:56.876543211")); + + assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{-946'688'523'123'456us}) == + SV("1940-01-01 22:57:56.876544")); + + assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::milliseconds>{-946'688'523'123ms}) == + SV("1940-01-01 22:57:56.877")); + + assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-1ns}) == + SV("1969-12-31 23:59:59.999999999")); + + assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{0ns}) == + SV("1970-01-01 00:00:00.000000000")); + + assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{1ns}) == + SV("1970-01-01 00:00:00.000000001")); + assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03.123456789")); assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{946'688'523'123'456us}) == @@ -97,6 +115,24 @@ template <class CharT> static void test_fr_FR() { using namespace std::literals::chrono_literals; + assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) == + SV("1940-01-01 22:57:56,876543211")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{-946'688'523'123'456us}) == + SV("1940-01-01 22:57:56,876544")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::milliseconds>{-946'688'523'123ms}) == + SV("1940-01-01 22:57:56,877")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-1ns}) == + SV("1969-12-31 23:59:59,999999999")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{0ns}) == + SV("1970-01-01 00:00:00,000000000")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{1ns}) == + SV("1970-01-01 00:00:00,000000001")); + assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03,123456789")); assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{946'688'523'123'456us}) == @@ -131,6 +167,24 @@ template <class CharT> static void test_ja_JP() { using namespace std::literals::chrono_literals; + assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) == + SV("1940-01-01 22:57:56.876543211")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{-946'688'523'123'456us}) == + SV("1940-01-01 22:57:56.876544")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::milliseconds>{-946'688'523'123ms}) == + SV("1940-01-01 22:57:56.877")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-1ns}) == + SV("1969-12-31 23:59:59.999999999")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{0ns}) == + SV("1970-01-01 00:00:00.000000000")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{1ns}) == + SV("1970-01-01 00:00:00.000000001")); + assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03.123456789")); assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{946'688'523'123'456us}) == diff --git a/libcxx/test/std/time/time.clock/time.clock.system/sys_time.ostream.pass.cpp b/libcxx/test/std/time/time.clock/time.clock.system/sys_time.ostream.pass.cpp index 78d8da57c150a6..e596ddefde51d9 100644 --- a/libcxx/test/std/time/time.clock/time.clock.system/sys_time.ostream.pass.cpp +++ b/libcxx/test/std/time/time.clock/time.clock.system/sys_time.ostream.pass.cpp @@ -64,6 +64,24 @@ template <class CharT> static void test_c() { using namespace std::literals::chrono_literals; + assert(stream_c_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) == + SV("1940-01-01 22:57:56.876543211")); + + assert(stream_c_locale<CharT>(std::chrono::sys_time<std::chrono::microseconds>{-946'688'523'123'456us}) == + SV("1940-01-01 22:57:56.876544")); + + assert(stream_c_locale<CharT>(std::chrono::sys_time<std::chrono::milliseconds>{-946'688'523'123ms}) == + SV("1940-01-01 22:57:56.877")); + + assert(stream_c_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{-1ns}) == + SV("1969-12-31 23:59:59.999999999")); + + assert(stream_c_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{0ns}) == + SV("1970-01-01 00:00:00.000000000")); + + assert(stream_c_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{1ns}) == + SV("1970-01-01 00:00:00.000000001")); + assert(stream_c_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03.123456789")); assert(stream_c_locale<CharT>(std::chrono::sys_time<std::chrono::microseconds>{946'688'523'123'456us}) == @@ -92,6 +110,24 @@ template <class CharT> static void test_fr_FR() { using namespace std::literals::chrono_literals; + assert(stream_fr_FR_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) == + SV("1940-01-01 22:57:56,876543211")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::sys_time<std::chrono::microseconds>{-946'688'523'123'456us}) == + SV("1940-01-01 22:57:56,876544")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::sys_time<std::chrono::milliseconds>{-946'688'523'123ms}) == + SV("1940-01-01 22:57:56,877")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{-1ns}) == + SV("1969-12-31 23:59:59,999999999")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{0ns}) == + SV("1970-01-01 00:00:00,000000000")); + + assert(stream_fr_FR_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{1ns}) == + SV("1970-01-01 00:00:00,000000001")); + assert(stream_fr_FR_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03,123456789")); assert(stream_fr_FR_locale<CharT>(std::chrono::sys_time<std::chrono::microseconds>{946'688'523'123'456us}) == @@ -120,6 +156,24 @@ template <class CharT> static void test_ja_JP() { using namespace std::literals::chrono_literals; + assert(stream_ja_JP_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) == + SV("1940-01-01 22:57:56.876543211")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::sys_time<std::chrono::microseconds>{-946'688'523'123'456us}) == + SV("1940-01-01 22:57:56.876544")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::sys_time<std::chrono::milliseconds>{-946'688'523'123ms}) == + SV("1940-01-01 22:57:56.877")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{-1ns}) == + SV("1969-12-31 23:59:59.999999999")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{0ns}) == + SV("1970-01-01 00:00:00.000000000")); + + assert(stream_ja_JP_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{1ns}) == + SV("1970-01-01 00:00:00.000000001")); + assert(stream_ja_JP_locale<CharT>(std::chrono::sys_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03.123456789")); assert(stream_ja_JP_locale<CharT>(std::chrono::sys_time<std::chrono::microseconds>{946'688'523'123'456us}) == `````````` </details> https://github.com/llvm/llvm-project/pull/89408 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits