From f219cda7bd43696792ca4668ca5a9fbf55a9f09f Mon Sep 17 00:00:00 2001 From: Jason Molenda Date: Thu, 8 Feb 2024 09:16:12 -0800 Subject: [PATCH] [lldb] Fix printf formatting of std::time_t seconds (#81078) This formatter https://github.com/llvm/llvm-project/pull/78609 was originally passing the signed seconds (which can refer to times in the past) with an unsigned printf formatter, and had tests that expected to see negative values from the printf which always failed on macOS. I'm not clear how they ever passed on any platform. Fix the printf to print seconds as a signed value, and re-enable the tests. --- .../Plugins/Language/CPlusPlus/LibCxx.cpp | 6 ++-- .../chrono/TestDataFormatterLibcxxChrono.py | 30 +++++++++---------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index a7d7066bb2c1..7893aa7cc1f9 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -1108,7 +1108,7 @@ bool lldb_private::formatters::LibcxxChronoSysSecondsSummaryProvider( const std::time_t seconds = ptr_sp->GetValueAsSigned(0); if (seconds < chrono_timestamp_min || seconds > chrono_timestamp_max) - stream.Printf("timestamp=%" PRIu64 " s", static_cast(seconds)); + stream.Printf("timestamp=%" PRId64 " s", static_cast(seconds)); else { std::array str; std::size_t size = @@ -1116,8 +1116,8 @@ bool lldb_private::formatters::LibcxxChronoSysSecondsSummaryProvider( if (size == 0) return false; - stream.Printf("date/time=%s timestamp=%" PRIu64 " s", str.data(), - static_cast(seconds)); + stream.Printf("date/time=%s timestamp=%" PRId64 " s", str.data(), + static_cast(seconds)); } return true; diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/chrono/TestDataFormatterLibcxxChrono.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/chrono/TestDataFormatterLibcxxChrono.py index 9706f9e94e92..a90fb828d121 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/chrono/TestDataFormatterLibcxxChrono.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/chrono/TestDataFormatterLibcxxChrono.py @@ -54,17 +54,16 @@ class LibcxxChronoDataFormatterTestCase(TestBase): substrs=["ss_0 = date/time=1970-01-01T00:00:00Z timestamp=0 s"], ) - # FIXME disabled temporarily, macOS is printing this as an unsigned? - #self.expect( - # "frame variable ss_neg_date_time", - # substrs=[ - # "ss_neg_date_time = date/time=-32767-01-01T00:00:00Z timestamp=-1096193779200 s" - # ], - #) - #self.expect( - # "frame variable ss_neg_seconds", - # substrs=["ss_neg_seconds = timestamp=-1096193779201 s"], - #) + self.expect( + "frame variable ss_neg_date_time", + substrs=[ + "ss_neg_date_time = date/time=-32767-01-01T00:00:00Z timestamp=-1096193779200 s" + ], + ) + self.expect( + "frame variable ss_neg_seconds", + substrs=["ss_neg_seconds = timestamp=-1096193779201 s"], + ) self.expect( "frame variable ss_pos_date_time", @@ -77,11 +76,10 @@ class LibcxxChronoDataFormatterTestCase(TestBase): substrs=["ss_pos_seconds = timestamp=971890963200 s"], ) - # FIXME disabled temporarily, macOS is printing this as an unsigned? - #self.expect( - # "frame variable ss_min", - # substrs=["ss_min = timestamp=-9223372036854775808 s"], - #) + self.expect( + "frame variable ss_min", + substrs=["ss_min = timestamp=-9223372036854775808 s"], + ) self.expect( "frame variable ss_max", substrs=["ss_max = timestamp=9223372036854775807 s"],