]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Add test for chrono::leap_seconds ostream insertion
authorJonathan Wakely <jwakely@redhat.com>
Mon, 10 Jun 2024 20:10:29 +0000 (21:10 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 11 Jun 2024 10:11:22 +0000 (11:11 +0100)
Also add a comment to the three-way comparison oeprator for
chrono::leap_seconds, noting the deviation from the spec (which is
functionally equivalent). What we implement is the originally proposed
resolution to LWG 3383, which should compile slightly more efficiently
than the final accepted resolution.

libstdc++-v3/ChangeLog:

* include/std/chrono (leap_seconds): Add comment.
* testsuite/std/time/leap_seconds/io.cc: New test.

libstdc++-v3/include/std/chrono
libstdc++-v3/testsuite/std/time/leap_seconds/io.cc [new file with mode: 0644]

index b0aadf83b03f019af3b6db7fb2ce2a06e2baec27..7ffa536072846c12964620003c7b47a74f8d024c 100644 (file)
@@ -2925,6 +2925,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                   const leap_second& __y) noexcept
        { return !(__x < __y.date()); }
 
+      // This is a simplified form of the constraint specified in the standard,
+      // three_way_comparable_with<sys_seconds, sys_time<_Duration>>.
       template<three_way_comparable_with<seconds> _Duration>
        [[nodiscard]] friend constexpr auto
        operator<=>(const leap_second& __x,
diff --git a/libstdc++-v3/testsuite/std/time/leap_seconds/io.cc b/libstdc++-v3/testsuite/std/time/leap_seconds/io.cc
new file mode 100644 (file)
index 0000000..511fafd
--- /dev/null
@@ -0,0 +1,56 @@
+// { dg-do run { target c++20 } }
+// { dg-require-effective-target tzdb }
+// { dg-require-effective-target cxx11_abi }
+
+#include <chrono>
+#include <sstream>
+#include <format>
+#include <testsuite_hooks.h>
+
+void
+test_output()
+{
+  using namespace std::chrono;
+
+  std::ostringstream out;
+  out << '\n';
+
+  for (auto& l : get_tzdb().leap_seconds)
+  if (l <= sys_days{2018y/March/17d})
+    out << l.date() << ": " << l.value() << '\n';
+
+  VERIFY( out.str() == R"(
+1972-07-01 00:00:00: 1s
+1973-01-01 00:00:00: 1s
+1974-01-01 00:00:00: 1s
+1975-01-01 00:00:00: 1s
+1976-01-01 00:00:00: 1s
+1977-01-01 00:00:00: 1s
+1978-01-01 00:00:00: 1s
+1979-01-01 00:00:00: 1s
+1980-01-01 00:00:00: 1s
+1981-07-01 00:00:00: 1s
+1982-07-01 00:00:00: 1s
+1983-07-01 00:00:00: 1s
+1985-07-01 00:00:00: 1s
+1988-01-01 00:00:00: 1s
+1990-01-01 00:00:00: 1s
+1991-01-01 00:00:00: 1s
+1992-07-01 00:00:00: 1s
+1993-07-01 00:00:00: 1s
+1994-07-01 00:00:00: 1s
+1996-01-01 00:00:00: 1s
+1997-07-01 00:00:00: 1s
+1999-01-01 00:00:00: 1s
+2006-01-01 00:00:00: 1s
+2009-01-01 00:00:00: 1s
+2012-07-01 00:00:00: 1s
+2015-07-01 00:00:00: 1s
+2017-01-01 00:00:00: 1s
+)" );
+}
+
+int main()
+{
+  test_output();
+}