diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2018-11-13 17:22:41 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2018-11-13 17:22:41 +0000 |
commit | cf355fc37383dd81093cf093c4ab6c879d6bb66d (patch) | |
tree | e47df6bd83f365bcc9735ae7862dba34b7a6f7b8 | |
parent | 7a83c5f623c00e6c1a88f1a90ac8691381375199 (diff) | |
download | bcm5719-llvm-cf355fc37383dd81093cf093c4ab6c879d6bb66d.tar.gz bcm5719-llvm-cf355fc37383dd81093cf093c4ab6c879d6bb66d.zip |
Implement P0972R0: <chrono> zero(), min(), and max() should be noexcept. Reviewed as https://reviews.llvm.org/D53828
llvm-svn: 346766
10 files changed, 75 insertions, 26 deletions
diff --git a/libcxx/include/chrono b/libcxx/include/chrono index 75258abd26b..e99e3c74c74 100644 --- a/libcxx/include/chrono +++ b/libcxx/include/chrono @@ -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 diff --git a/libcxx/test/std/utilities/time/time.duration/time.duration.special/max.pass.cpp b/libcxx/test/std/utilities/time/time.duration/time.duration.special/max.pass.cpp index 48c3e86e810..29b0e04c247 100644 --- a/libcxx/test/std/utilities/time/time.duration/time.duration.special/max.pass.cpp +++ b/libcxx/test/std/utilities/time/time.duration/time.duration.special/max.pass.cpp @@ -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(); diff --git a/libcxx/test/std/utilities/time/time.duration/time.duration.special/min.pass.cpp b/libcxx/test/std/utilities/time/time.duration/time.duration.special/min.pass.cpp index 0d94aaa5869..daf7165cf90 100644 --- a/libcxx/test/std/utilities/time/time.duration/time.duration.special/min.pass.cpp +++ b/libcxx/test/std/utilities/time/time.duration/time.duration.special/min.pass.cpp @@ -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(); diff --git a/libcxx/test/std/utilities/time/time.duration/time.duration.special/zero.pass.cpp b/libcxx/test/std/utilities/time/time.duration/time.duration.special/zero.pass.cpp index 7b312c5acb5..f9a4673db1a 100644 --- a/libcxx/test/std/utilities/time/time.duration/time.duration.special/zero.pass.cpp +++ b/libcxx/test/std/utilities/time/time.duration/time.duration.special/zero.pass.cpp @@ -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(); diff --git a/libcxx/test/std/utilities/time/time.point/time.point.special/max.pass.cpp b/libcxx/test/std/utilities/time/time.point/time.point.special/max.pass.cpp index 6bba6fc8278..1d8d0796438 100644 --- a/libcxx/test/std/utilities/time/time.point/time.point.special/max.pass.cpp +++ b/libcxx/test/std/utilities/time/time.point/time.point.special/max.pass.cpp @@ -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())); } diff --git a/libcxx/test/std/utilities/time/time.point/time.point.special/min.pass.cpp b/libcxx/test/std/utilities/time/time.point/time.point.special/min.pass.cpp index b1d955c252a..fab5b4aae22 100644 --- a/libcxx/test/std/utilities/time/time.point/time.point.special/min.pass.cpp +++ b/libcxx/test/std/utilities/time/time.point/time.point.special/min.pass.cpp @@ -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())); } diff --git a/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/max.pass.cpp b/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/max.pass.cpp index e3754c1f647..bd411543794 100644 --- a/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/max.pass.cpp +++ b/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/max.pass.cpp @@ -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 } diff --git a/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/min.pass.cpp b/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/min.pass.cpp index 508837375b8..207a9ab5aff 100644 --- a/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/min.pass.cpp +++ b/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/min.pass.cpp @@ -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 } diff --git a/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/zero.pass.cpp b/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/zero.pass.cpp index b84a676738a..614c69b2e38 100644 --- a/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/zero.pass.cpp +++ b/libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/zero.pass.cpp @@ -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 } diff --git a/libcxx/www/cxx2a_status.html b/libcxx/www/cxx2a_status.html index a3a124ecb99..3899d392881 100644 --- a/libcxx/www/cxx2a_status.html +++ b/libcxx/www/cxx2a_status.html @@ -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> |