summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2018-11-13 17:22:41 +0000
committerMarshall Clow <mclow.lists@gmail.com>2018-11-13 17:22:41 +0000
commitcf355fc37383dd81093cf093c4ab6c879d6bb66d (patch)
treee47df6bd83f365bcc9735ae7862dba34b7a6f7b8
parent7a83c5f623c00e6c1a88f1a90ac8691381375199 (diff)
downloadbcm5719-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
-rw-r--r--libcxx/include/chrono32
-rw-r--r--libcxx/test/std/utilities/time/time.duration/time.duration.special/max.pass.cpp6
-rw-r--r--libcxx/test/std/utilities/time/time.duration/time.duration.special/min.pass.cpp6
-rw-r--r--libcxx/test/std/utilities/time/time.duration/time.duration.special/zero.pass.cpp6
-rw-r--r--libcxx/test/std/utilities/time/time.point/time.point.special/max.pass.cpp8
-rw-r--r--libcxx/test/std/utilities/time/time.point/time.point.special/min.pass.cpp8
-rw-r--r--libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/max.pass.cpp11
-rw-r--r--libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/min.pass.cpp11
-rw-r--r--libcxx/test/std/utilities/time/time.traits/time.traits.duration_values/zero.pass.cpp9
-rw-r--r--libcxx/www/cxx2a_status.html4
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>&lt;chrono&gt; 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>&lt;chrono&gt; <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>
OpenPOWER on IntegriCloud