[libcxx] r346766 - Implement P0972R0: <chrono> zero(), min(), and max() should be noexcept. Reviewed as https://reviews.llvm.org/D53828

Marshall Clow mclow.lists at gmail.com
Tue Nov 13 09:22:42 PST 2018


Author: marshall
Date: Tue Nov 13 09:22:41 2018
New Revision: 346766

URL: http://llvm.org/viewvc/llvm-project?rev=346766&view=rev
Log:
Implement P0972R0: <chrono> zero(), min(), and max() should be noexcept. Reviewed as https://reviews.llvm.org/D53828

Modified:
    libcxx/trunk/include/chrono
    libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/max.pass.cpp
    libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/min.pass.cpp
    libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/zero.pass.cpp
    libcxx/trunk/test/std/utilities/time/time.point/time.point.special/max.pass.cpp
    libcxx/trunk/test/std/utilities/time/time.point/time.point.special/min.pass.cpp
    libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/max.pass.cpp
    libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/min.pass.cpp
    libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/zero.pass.cpp
    libcxx/trunk/www/cxx2a_status.html

Modified: libcxx/trunk/include/chrono
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/chrono?rev=346766&r1=346765&r2=346766&view=diff
==============================================================================
--- libcxx/trunk/include/chrono (original)
+++ libcxx/trunk/include/chrono Tue Nov 13 09:22:41 2018
@@ -33,9 +33,9 @@ template <class Rep>
 struct duration_values
 {
 public:
-    static constexpr Rep zero();
-    static constexpr Rep max();
-    static constexpr Rep min();
+    static constexpr Rep zero(); // noexcept in C++20
+    static constexpr Rep max();  // noexcept in C++20
+    static constexpr Rep min();  // noexcept in C++20
 };
 
 // duration
@@ -92,9 +92,9 @@ public:
 
     // special values
 
-    static constexpr duration zero();
-    static constexpr duration min();
-    static constexpr duration max();
+    static constexpr duration zero(); // noexcept in C++20
+    static constexpr duration min();  // noexcept in C++20
+    static constexpr duration max();  // noexcept in C++20
 };
 
 typedef duration<long long,         nano> nanoseconds;
@@ -134,8 +134,8 @@ public:
 
     // special values
 
-    static constexpr time_point min();
-    static constexpr time_point max();
+    static constexpr time_point min();  // noexcept in C++20
+    static constexpr time_point max();  // noexcept in C++20
 };
 
 } // chrono
@@ -924,9 +924,9 @@ template <class _Rep>
 struct _LIBCPP_TEMPLATE_VIS duration_values
 {
 public:
-    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep zero() {return _Rep(0);}
-    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep max()  {return numeric_limits<_Rep>::max();}
-    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min()  {return numeric_limits<_Rep>::lowest();}
+    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep zero() _NOEXCEPT {return _Rep(0);}
+    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep max()  _NOEXCEPT {return numeric_limits<_Rep>::max();}
+    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min()  _NOEXCEPT {return numeric_limits<_Rep>::lowest();}
 };
 
 #if _LIBCPP_STD_VER > 14
@@ -1081,9 +1081,9 @@ public:
 
     // special values
 
-    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration zero() {return duration(duration_values<rep>::zero());}
-    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration min()  {return duration(duration_values<rep>::min());}
-    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration max()  {return duration(duration_values<rep>::max());}
+    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration zero() _NOEXCEPT {return duration(duration_values<rep>::zero());}
+    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration min()  _NOEXCEPT {return duration(duration_values<rep>::min());}
+    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration max()  _NOEXCEPT {return duration(duration_values<rep>::max());}
 };
 
 typedef duration<long long,         nano> nanoseconds;
@@ -1369,8 +1369,8 @@ public:
 
     // special values
 
-    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point min() {return time_point(duration::min());}
-    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point max() {return time_point(duration::max());}
+    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point min() _NOEXCEPT {return time_point(duration::min());}
+    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point max() _NOEXCEPT {return time_point(duration::max());}
 };
 
 } // chrono

Modified: libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/max.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/max.pass.cpp?rev=346766&r1=346765&r2=346766&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/max.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/max.pass.cpp Tue Nov 13 09:22:41 2018
@@ -11,7 +11,7 @@
 
 // duration
 
-// static constexpr duration max();
+// static constexpr duration max(); // noexcept after C++17
 
 #include <chrono>
 #include <limits>
@@ -23,6 +23,10 @@
 template <class D>
 void test()
 {
+	LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<typename D::rep>::max());
+#if TEST_STD_VER > 17
+	ASSERT_NOEXCEPT(       std::chrono::duration_values<typename D::rep>::max());
+#endif
     {
     typedef typename D::rep Rep;
     Rep max_rep = std::chrono::duration_values<Rep>::max();

Modified: libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/min.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/min.pass.cpp?rev=346766&r1=346765&r2=346766&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/min.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/min.pass.cpp Tue Nov 13 09:22:41 2018
@@ -11,7 +11,7 @@
 
 // duration
 
-// static constexpr duration min();
+// static constexpr duration min(); // noexcept after C++17
 
 #include <chrono>
 #include <limits>
@@ -23,6 +23,10 @@
 template <class D>
 void test()
 {
+    LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<typename D::rep>::min());
+#if TEST_STD_VER > 17
+    ASSERT_NOEXCEPT(       std::chrono::duration_values<typename D::rep>::min());
+#endif
     {
     typedef typename D::rep Rep;
     Rep min_rep = std::chrono::duration_values<Rep>::min();

Modified: libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/zero.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/zero.pass.cpp?rev=346766&r1=346765&r2=346766&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/zero.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/time/time.duration/time.duration.special/zero.pass.cpp Tue Nov 13 09:22:41 2018
@@ -11,7 +11,7 @@
 
 // duration
 
-// static constexpr duration zero();
+// static constexpr duration zero(); // noexcept after C++17
 
 #include <chrono>
 #include <cassert>
@@ -22,6 +22,10 @@
 template <class D>
 void test()
 {
+	LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<typename D::rep>::zero());
+#if TEST_STD_VER > 17
+	ASSERT_NOEXCEPT(       std::chrono::duration_values<typename D::rep>::zero());
+#endif
     {
     typedef typename D::rep Rep;
     Rep zero_rep = std::chrono::duration_values<Rep>::zero();

Modified: libcxx/trunk/test/std/utilities/time/time.point/time.point.special/max.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/time/time.point/time.point.special/max.pass.cpp?rev=346766&r1=346765&r2=346766&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/time/time.point/time.point.special/max.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/time/time.point/time.point.special/max.pass.cpp Tue Nov 13 09:22:41 2018
@@ -11,15 +11,21 @@
 
 // time_point
 
-// static constexpr time_point max();
+// static constexpr time_point max(); // noexcept after C++17
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
 int main()
 {
     typedef std::chrono::system_clock Clock;
     typedef std::chrono::milliseconds Duration;
     typedef std::chrono::time_point<Clock, Duration> TP;
+	LIBCPP_ASSERT_NOEXCEPT(TP::max());
+#if TEST_STD_VER > 17
+	ASSERT_NOEXCEPT(       TP::max());
+#endif
     assert(TP::max() == TP(Duration::max()));
 }

Modified: libcxx/trunk/test/std/utilities/time/time.point/time.point.special/min.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/time/time.point/time.point.special/min.pass.cpp?rev=346766&r1=346765&r2=346766&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/time/time.point/time.point.special/min.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/time/time.point/time.point.special/min.pass.cpp Tue Nov 13 09:22:41 2018
@@ -11,15 +11,21 @@
 
 // time_point
 
-// static constexpr time_point min();
+// static constexpr time_point min(); // noexcept after C++17
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
 int main()
 {
     typedef std::chrono::system_clock Clock;
     typedef std::chrono::milliseconds Duration;
     typedef std::chrono::time_point<Clock, Duration> TP;
+    LIBCPP_ASSERT_NOEXCEPT(TP::max());
+#if TEST_STD_VER > 17
+    ASSERT_NOEXCEPT(       TP::max());
+#endif
     assert(TP::min() == TP(Duration::min()));
 }

Modified: libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/max.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/max.pass.cpp?rev=346766&r1=346765&r2=346766&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/max.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/max.pass.cpp Tue Nov 13 09:22:41 2018
@@ -9,7 +9,7 @@
 
 // <chrono>
 
-// duration_values::max
+// duration_values::max  // noexcept after C++17
 
 #include <chrono>
 #include <limits>
@@ -34,4 +34,13 @@ int main()
     static_assert(std::chrono::duration_values<Rep>::max() ==
            std::numeric_limits<Rep>::max(), "");
 #endif
+
+    LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<int>::max());
+    LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<double>::max());
+    LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<Rep>::max());
+#if TEST_STD_VER > 17
+    ASSERT_NOEXCEPT(std::chrono::duration_values<int>::max());
+    ASSERT_NOEXCEPT(std::chrono::duration_values<double>::max());
+    ASSERT_NOEXCEPT(std::chrono::duration_values<Rep>::max());
+#endif
 }

Modified: libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/min.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/min.pass.cpp?rev=346766&r1=346765&r2=346766&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/min.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/min.pass.cpp Tue Nov 13 09:22:41 2018
@@ -9,7 +9,7 @@
 
 // <chrono>
 
-// duration_values::min
+// duration_values::min  // noexcept after C++17
 
 #include <chrono>
 #include <limits>
@@ -34,4 +34,13 @@ int main()
     static_assert(std::chrono::duration_values<Rep>::min() ==
            std::numeric_limits<Rep>::lowest(), "");
 #endif
+
+    LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<int>::min());
+    LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<double>::min());
+    LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<Rep>::min());
+#if TEST_STD_VER > 17
+    ASSERT_NOEXCEPT(std::chrono::duration_values<int>::min());
+    ASSERT_NOEXCEPT(std::chrono::duration_values<double>::min());
+    ASSERT_NOEXCEPT(std::chrono::duration_values<Rep>::min());
+#endif
 }

Modified: libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/zero.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/zero.pass.cpp?rev=346766&r1=346765&r2=346766&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/zero.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/time/time.traits/time.traits.duration_values/zero.pass.cpp Tue Nov 13 09:22:41 2018
@@ -9,7 +9,7 @@
 
 // <chrono>
 
-// duration_values::zero
+// duration_values::zero  // noexcept after C++17
 
 #include <chrono>
 #include <cassert>
@@ -25,4 +25,11 @@ int main()
     static_assert(std::chrono::duration_values<int>::zero() == 0, "");
     static_assert(std::chrono::duration_values<Rep>::zero() == 0, "");
 #endif
+
+    LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<int>::zero());
+    LIBCPP_ASSERT_NOEXCEPT(std::chrono::duration_values<Rep>::zero());
+#if TEST_STD_VER > 17
+    ASSERT_NOEXCEPT(std::chrono::duration_values<int>::zero());
+    ASSERT_NOEXCEPT(std::chrono::duration_values<Rep>::zero());
+#endif
 }

Modified: libcxx/trunk/www/cxx2a_status.html
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx2a_status.html?rev=346766&r1=346765&r2=346766&view=diff
==============================================================================
--- libcxx/trunk/www/cxx2a_status.html (original)
+++ libcxx/trunk/www/cxx2a_status.html Tue Nov 13 09:22:41 2018
@@ -122,7 +122,7 @@
 	<tr><td><a href="https://wg21.link/P0896R4">P0896R4</a></td><td>LWG</td><td>The One Ranges Proposal</td><td>San Diego</td><td><i> </i></td><td></td></tr>
 	<tr><td><a href="https://wg21.link/P0899R1">P0899R1</a></td><td>LWG</td><td>P0899R1 - LWG 3016 is not a defect</td><td>San Diego</td><td><i> </i></td><td></td></tr>
 	<tr><td><a href="https://wg21.link/P0919R3">P0919R3</a></td><td>LWG</td><td>Heterogeneous lookup for unordered containers</td><td>San Diego</td><td><i> </i></td><td></td></tr>
-	<tr><td><a href="https://wg21.link/P0972R0">P0972R0</a></td><td>LWG</td><td><chrono> zero(), min(), and max() should be noexcept</td><td>San Diego</td><td><i> </i></td><td></td></tr>
+	<tr><td><a href="https://wg21.link/P0972R0">P0972R0</a></td><td>LWG</td><td><chrono> <tt>zero()</tt>, <tt>min()</tt>, and <tt>max()</tt> should be noexcept</td><td>San Diego</td><td>Complete</td><td>8.0</td></tr>
 	<tr><td><a href="https://wg21.link/P1006R1">P1006R1</a></td><td>LWG</td><td>Constexpr in std::pointer_traits</td><td>San Diego</td><td><i> </i></td><td>8.0</td></tr>
 	<tr><td><a href="https://wg21.link/P1007R3">P1007R3</a></td><td>LWG</td><td><tt>std::assume_aligned</tt></td><td>San Diego</td><td><i> </i></td><td></td></tr>
 	<tr><td><a href="https://wg21.link/P1020R1">P1020R1</a></td><td>LWG</td><td>Smart pointer creation with default initialization</td><td>San Diego</td><td><i> </i></td><td></td></tr>
@@ -292,7 +292,7 @@
 <!-- 	<tr><td></td><td></td><td></td><td></td></tr> -->
   </table>
 
-  <p>Last Updated: 11-Nov-2018</p>
+  <p>Last Updated: 12-Nov-2018</p>
 </div>
 </body>
 </html>




More information about the libcxx-commits mailing list