[llvm] 4b3dbaa - Fix nanosecond printing for TimePoint formatter.

Eli Friedman via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 14 15:51:49 PDT 2023


Author: Eli Friedman
Date: 2023-07-14T15:51:23-07:00
New Revision: 4b3dbaaa32420ab2cb66981b03122e2e4804f7eb

URL: https://github.com/llvm/llvm-project/commit/4b3dbaaa32420ab2cb66981b03122e2e4804f7eb
DIFF: https://github.com/llvm/llvm-project/commit/4b3dbaaa32420ab2cb66981b03122e2e4804f7eb.diff

LOG: Fix nanosecond printing for TimePoint formatter.

There was a copy-paste of the wrong field width, so the nanoseconds
weren't correctly padded with zeros.  Found by inspection.

Added: 
    

Modified: 
    llvm/lib/Support/Chrono.cpp
    llvm/unittests/Support/Chrono.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Support/Chrono.cpp b/llvm/lib/Support/Chrono.cpp
index 8c28d45d882282..859ece8f550080 100644
--- a/llvm/lib/Support/Chrono.cpp
+++ b/llvm/lib/Support/Chrono.cpp
@@ -74,7 +74,7 @@ void format_provider<TimePoint<>>::format(const TimePoint<> &T, raw_ostream &OS,
           continue;
         case 'N':  // Nanoseconds, from date(1).
           FStream << llvm::format(
-              "%.6lu", (long)duration_cast<nanoseconds>(Fractional).count());
+              "%.9lu", (long)duration_cast<nanoseconds>(Fractional).count());
           ++I;
           continue;
         case '%':  // Consume %%, so %%f parses as (%%)f not %(%f)

diff  --git a/llvm/unittests/Support/Chrono.cpp b/llvm/unittests/Support/Chrono.cpp
index 9a08a5c1bfdff4..daf8a8a350f08c 100644
--- a/llvm/unittests/Support/Chrono.cpp
+++ b/llvm/unittests/Support/Chrono.cpp
@@ -42,15 +42,21 @@ TEST(Chrono, TimePointFormat) {
   TM.tm_isdst = -1;
   TimePoint<> T =
       system_clock::from_time_t(mktime(&TM)) + nanoseconds(123456789);
+  TimePoint<> T2 =
+      system_clock::from_time_t(mktime(&TM)) + nanoseconds(23456789);
 
   // operator<< uses the format YYYY-MM-DD HH:MM:SS.NNNNNNNNN
   std::string S;
   raw_string_ostream OS(S);
   OS << T;
   EXPECT_EQ("2006-01-02 15:04:05.123456789", OS.str());
+  S.clear();
+  OS << T2;
+  EXPECT_EQ("2006-01-02 15:04:05.023456789", OS.str());
 
   // formatv default style matches operator<<.
   EXPECT_EQ("2006-01-02 15:04:05.123456789", formatv("{0}", T).str());
+  EXPECT_EQ("2006-01-02 15:04:05.023456789", formatv("{0}", T2).str());
   // formatv supports strftime-style format strings.
   EXPECT_EQ("15:04:05", formatv("{0:%H:%M:%S}", T).str());
   // formatv supports our strftime extensions for sub-second precision.


        


More information about the llvm-commits mailing list