AntonBikineev added a subscriber: cfe-commits.
AntonBikineev updated this revision to Diff 79491.

https://reviews.llvm.org/D27162

Files:
  include/chrono
  test/std/utilities/time/time.duration/time.duration.arithmetic/op_++.pass.cpp
  
test/std/utilities/time/time.duration/time.duration.arithmetic/op_++int.pass.cpp
  test/std/utilities/time/time.duration/time.duration.arithmetic/op_+=.pass.cpp
  test/std/utilities/time/time.duration/time.duration.arithmetic/op_--.pass.cpp
  
test/std/utilities/time/time.duration/time.duration.arithmetic/op_--int.pass.cpp
  test/std/utilities/time/time.duration/time.duration.arithmetic/op_-=.pass.cpp
  
test/std/utilities/time/time.duration/time.duration.arithmetic/op_divide=.pass.cpp
  
test/std/utilities/time/time.duration/time.duration.arithmetic/op_mod=duration.pass.cpp
  
test/std/utilities/time/time.duration/time.duration.arithmetic/op_mod=rep.pass.cpp
  
test/std/utilities/time/time.duration/time.duration.arithmetic/op_times=.pass.cpp
  www/cxx1z_status.html

Index: www/cxx1z_status.html
===================================================================
--- www/cxx1z_status.html
+++ www/cxx1z_status.html
@@ -132,7 +132,7 @@
 	<tr><td><a href="http://wg21.link/P0502R0";>P0502R0</a></td><td>LWG</td><td>Throwing out of a parallel algorithm terminates - but how?</td><td>Issaquah</td><td></td><td></td></tr>
 	<tr><td><a href="http://wg21.link/P0503R0";>P0503R0</a></td><td>LWG</td><td>Correcting library usage of "literal type"</td><td>Issaquah</td><td></td><td></td></tr>
 	<tr><td><a href="http://wg21.link/P0504R0";>P0504R0</a></td><td>LWG</td><td>Revisiting in-place tag types for any/optional/variant</td><td>Issaquah</td><td></td><td></td></tr>
-	<tr><td><a href="http://wg21.link/P0505R0";>P0505R0</a></td><td>LWG</td><td>Wording for GB 50 - constexpr for chrono</td><td>Issaquah</td><td></td><td></td></tr>
+	<tr><td><a href="http://wg21.link/P0505R0";>P0505R0</a></td><td>LWG</td><td>Wording for GB 50 - constexpr for chrono</td><td>Issaquah</td><td>Complete</td><td>4.0</td></tr>
 	<tr><td><a href="http://wg21.link/P0508R0";>P0508R0</a></td><td>LWG</td><td>Wording for GB 58 - structured bindings for node_handles</td><td>Issaquah</td><td></td><td></td></tr>
 	<tr><td><a href="http://wg21.link/P0509R1";>P0509R1</a></td><td>LWG</td><td>Updating “Restrictions on exception handling”</td><td>Issaquah</td><td></td><td></td></tr>
 	<tr><td><a href="http://wg21.link/P0510R0";>P0510R0</a></td><td>LWG</td><td>Disallowing references, incomplete types, arrays, and empty variants</td><td>Issaquah</td><td></td><td></td></tr>
Index: test/std/utilities/time/time.duration/time.duration.arithmetic/op_times=.pass.cpp
===================================================================
--- test/std/utilities/time/time.duration/time.duration.arithmetic/op_times=.pass.cpp
+++ test/std/utilities/time/time.duration/time.duration.arithmetic/op_times=.pass.cpp
@@ -11,14 +11,33 @@
 
 // duration
 
-// duration& operator*=(const rep& rhs);
+// constexpr duration& operator*=(const rep& rhs);
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
+#if TEST_STD_VER > 14
+constexpr std::chrono::hours test_ce(int n, int k) {
+    std::chrono::hours h(n);
+    h *= k;
+    return h;
+}
+#endif
+
 int main()
 {
     std::chrono::nanoseconds ns(3);
     ns *= 5;
     assert(ns.count() == 15);
+
+#if TEST_STD_VER > 14
+    {
+    static_assert ( test_ce (7, 2) == std::chrono::hours(14), "" );
+    static_assert ( test_ce (9, 5) == std::chrono::hours(45), "" );
+    static_assert ( test_ce (5, 0) == std::chrono::hours(0), "" );
+    static_assert ( test_ce (0, 0) == std::chrono::hours(0), "" );
+    }
+#endif
 }
Index: test/std/utilities/time/time.duration/time.duration.arithmetic/op_mod=rep.pass.cpp
===================================================================
--- test/std/utilities/time/time.duration/time.duration.arithmetic/op_mod=rep.pass.cpp
+++ test/std/utilities/time/time.duration/time.duration.arithmetic/op_mod=rep.pass.cpp
@@ -11,14 +11,32 @@
 
 // duration
 
-// duration& operator%=(const rep& rhs)
+// constexpr duration& operator%=(const rep& rhs)
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
+#if TEST_STD_VER > 14
+constexpr std::chrono::hours test_ce(int n, int k) {
+    std::chrono::hours h(n);
+    h %= k;
+    return h;
+}
+#endif
+
 int main()
 {
     std::chrono::microseconds us(11);
     us %= 3;
     assert(us.count() == 2);
+
+#if TEST_STD_VER > 14
+    {
+    static_assert ( test_ce (7, 2) == std::chrono::hours(1), "" );
+    static_assert ( test_ce (9, 5) == std::chrono::hours(4), "" );
+    static_assert ( test_ce (0, 4) == std::chrono::hours(0), "" );
+    }
+#endif
 }
Index: test/std/utilities/time/time.duration/time.duration.arithmetic/op_mod=duration.pass.cpp
===================================================================
--- test/std/utilities/time/time.duration/time.duration.arithmetic/op_mod=duration.pass.cpp
+++ test/std/utilities/time/time.duration/time.duration.arithmetic/op_mod=duration.pass.cpp
@@ -11,17 +11,36 @@
 
 // duration
 
-// duration& operator%=(const duration& rhs)
+// constexpr duration& operator%=(const duration& rhs)
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
+#if TEST_STD_VER > 14
+constexpr std::chrono::hours test_ce(int n, int k) {
+    typedef std::chrono::hours H;
+    H h(n);
+    h %= H(k);
+    return h;
+}
+#endif
+
 int main()
 {
     std::chrono::microseconds us(11);
     std::chrono::microseconds us2(3);
     us %= us2;
     assert(us.count() == 2);
     us %= std::chrono::milliseconds(3);
     assert(us.count() == 2);
+
+#if TEST_STD_VER > 14
+    {
+    static_assert ( test_ce (7, 2) == std::chrono::hours(1), "" );
+    static_assert ( test_ce (9, 5) == std::chrono::hours(4), "" );
+    static_assert ( test_ce (0, 4) == std::chrono::hours(0), "" );
+    }
+#endif
 }
Index: test/std/utilities/time/time.duration/time.duration.arithmetic/op_divide=.pass.cpp
===================================================================
--- test/std/utilities/time/time.duration/time.duration.arithmetic/op_divide=.pass.cpp
+++ test/std/utilities/time/time.duration/time.duration.arithmetic/op_divide=.pass.cpp
@@ -11,14 +11,32 @@
 
 // duration
 
-// duration& operator/=(const rep& rhs);
+// constexpr duration& operator/=(const rep& rhs);
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
+#if TEST_STD_VER > 14
+constexpr std::chrono::hours test_ce(int n, int k) {
+    std::chrono::hours h(n);
+    h /= k;
+    return h;
+}
+#endif
+
 int main()
 {
     std::chrono::nanoseconds ns(15);
     ns /= 5;
     assert(ns.count() == 3);
+
+#if TEST_STD_VER > 14
+    {
+    static_assert ( test_ce (8, 2) == std::chrono::hours(4), "" );
+    static_assert ( test_ce (9, 3) == std::chrono::hours(3), "" );
+    static_assert ( test_ce (0, 5) == std::chrono::hours(0), "" );
+    }
+#endif
 }
Index: test/std/utilities/time/time.duration/time.duration.arithmetic/op_-=.pass.cpp
===================================================================
--- test/std/utilities/time/time.duration/time.duration.arithmetic/op_-=.pass.cpp
+++ test/std/utilities/time/time.duration/time.duration.arithmetic/op_-=.pass.cpp
@@ -11,16 +11,36 @@
 
 // duration
 
-// duration& operator-=(const duration& d);
+// constexpr duration& operator-=(const duration& d);
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
+#if TEST_STD_VER > 14
+constexpr std::chrono::hours test_ce(int n, int k) {
+    typedef std::chrono::hours H;
+    H h(n);
+    h -= H(k);
+    return h;
+}
+#endif
+
 int main()
 {
     std::chrono::seconds s(3);
     s -= std::chrono::seconds(2);
     assert(s.count() == 1);
     s -= std::chrono::minutes(2);
     assert(s.count() == -119);
+
+#if TEST_STD_VER > 14
+    {
+    static_assert ( test_ce (7, 2) == std::chrono::hours(5), "" );
+    static_assert ( test_ce (9, 5) == std::chrono::hours(4), "" );
+    static_assert ( test_ce (5, 0) == std::chrono::hours(5), "" );
+    static_assert ( test_ce (0, 0) == std::chrono::hours(0), "" );
+    }
+#endif
 }
Index: test/std/utilities/time/time.duration/time.duration.arithmetic/op_--int.pass.cpp
===================================================================
--- test/std/utilities/time/time.duration/time.duration.arithmetic/op_--int.pass.cpp
+++ test/std/utilities/time/time.duration/time.duration.arithmetic/op_--int.pass.cpp
@@ -11,15 +11,32 @@
 
 // duration
 
-// duration operator--(int);
+// constexpr duration operator--(int);
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
+#if TEST_STD_VER > 14
+constexpr std::chrono::hours test_ce(int n) {
+    std::chrono::hours h(n);
+    std::chrono::hours h2 = h--;
+    return h2;
+}
+#endif
+
 int main()
 {
     std::chrono::hours h(3);
     std::chrono::hours h2 = h--;
     assert(h.count() == 2);
     assert(h2.count() == 3);
+
+#if TEST_STD_VER > 14
+    {
+    static_assert ( test_ce (2) == std::chrono::hours(2), "" );
+    static_assert ( test_ce (5) == std::chrono::hours(5), "" );
+    }
+#endif
 }
Index: test/std/utilities/time/time.duration/time.duration.arithmetic/op_--.pass.cpp
===================================================================
--- test/std/utilities/time/time.duration/time.duration.arithmetic/op_--.pass.cpp
+++ test/std/utilities/time/time.duration/time.duration.arithmetic/op_--.pass.cpp
@@ -11,15 +11,32 @@
 
 // duration
 
-// duration& operator--();
+// constexpr duration& operator--();
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
+#if TEST_STD_VER > 14
+constexpr std::chrono::hours test_ce(int n) {
+    std::chrono::hours h(n);
+    std::chrono::hours h2 = --h;
+    return h2;
+}
+#endif
+
 int main()
 {
     std::chrono::hours h(3);
     std::chrono::hours& href = --h;
     assert(&href == &h);
     assert(h.count() == 2);
+
+#if TEST_STD_VER > 14
+    {
+    static_assert ( test_ce (2) == std::chrono::hours(1), "" );
+    static_assert ( test_ce (5) == std::chrono::hours(4), "" );
+    }
+#endif
 }
Index: test/std/utilities/time/time.duration/time.duration.arithmetic/op_+=.pass.cpp
===================================================================
--- test/std/utilities/time/time.duration/time.duration.arithmetic/op_+=.pass.cpp
+++ test/std/utilities/time/time.duration/time.duration.arithmetic/op_+=.pass.cpp
@@ -11,16 +11,36 @@
 
 // duration
 
-// duration& operator+=(const duration& d);
+// constexpr duration& operator+=(const duration& d);
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
+#if TEST_STD_VER > 14
+constexpr std::chrono::hours test_ce(int n, int k) {
+    typedef std::chrono::hours H;
+    H h(n);
+    h += H(k);
+    return h;
+}
+#endif
+
 int main()
 {
     std::chrono::seconds s(3);
     s += std::chrono::seconds(2);
     assert(s.count() == 5);
     s += std::chrono::minutes(2);
     assert(s.count() == 125);
+
+#if TEST_STD_VER > 14
+    {
+    static_assert ( test_ce (7, 2) == std::chrono::hours(9), "" );
+    static_assert ( test_ce (9, 5) == std::chrono::hours(14), "" );
+    static_assert ( test_ce (5, 0) == std::chrono::hours(5), "" );
+    static_assert ( test_ce (0, 0) == std::chrono::hours(0), "" );
+    }
+#endif
 }
Index: test/std/utilities/time/time.duration/time.duration.arithmetic/op_++int.pass.cpp
===================================================================
--- test/std/utilities/time/time.duration/time.duration.arithmetic/op_++int.pass.cpp
+++ test/std/utilities/time/time.duration/time.duration.arithmetic/op_++int.pass.cpp
@@ -11,15 +11,32 @@
 
 // duration
 
-// duration operator++(int);
+// constexpr duration operator++(int);
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
+#if TEST_STD_VER > 14
+constexpr std::chrono::hours test_ce(int n) {
+    std::chrono::hours h(n);
+    std::chrono::hours h2 = h++;
+    return h2;
+}
+#endif
+
 int main()
 {
     std::chrono::hours h(3);
     std::chrono::hours h2 = h++;
     assert(h.count() == 4);
     assert(h2.count() == 3);
+
+#if TEST_STD_VER > 14
+    {
+    static_assert ( test_ce (2) == std::chrono::hours(2), "" );
+    static_assert ( test_ce (5) == std::chrono::hours(5), "" );
+    }
+#endif
 }
Index: test/std/utilities/time/time.duration/time.duration.arithmetic/op_++.pass.cpp
===================================================================
--- test/std/utilities/time/time.duration/time.duration.arithmetic/op_++.pass.cpp
+++ test/std/utilities/time/time.duration/time.duration.arithmetic/op_++.pass.cpp
@@ -11,15 +11,32 @@
 
 // duration
 
-// duration& operator++();
+// constexpr duration& operator++();
 
 #include <chrono>
 #include <cassert>
 
+#include "test_macros.h"
+
+#if TEST_STD_VER > 14
+constexpr std::chrono::hours test_ce(int n) {
+    std::chrono::hours h(n);
+    std::chrono::hours h2 = ++h;
+    return h2;
+}
+#endif
+
 int main()
 {
     std::chrono::hours h(3);
     std::chrono::hours& href = ++h;
     assert(&href == &h);
     assert(h.count() == 4);
+
+#if TEST_STD_VER > 14
+    {
+    static_assert ( test_ce (2) == std::chrono::hours(3), "" );
+    static_assert ( test_ce (5) == std::chrono::hours(6), "" );
+    }
+#endif
 }
Index: include/chrono
===================================================================
--- include/chrono
+++ include/chrono
@@ -77,16 +77,18 @@
 
     constexpr duration  operator+() const;
     constexpr duration  operator-() const;
-    duration& operator++();
-    duration  operator++(int);
-    duration& operator--();
-    duration  operator--(int);
+    constexpr duration& operator++();
+    constexpr duration  operator++(int);
+    constexpr duration& operator--();
+    constexpr duration  operator--(int);
 
-    duration& operator+=(const duration& d);
-    duration& operator-=(const duration& d);
+    constexpr duration& operator+=(const duration& d);
+    constexpr duration& operator-=(const duration& d);
 
-    duration& operator*=(const rep& rhs);
-    duration& operator/=(const rep& rhs);
+    constexpr duration& operator*=(const rep& rhs);
+    constexpr duration& operator/=(const rep& rhs);
+    constexpr duration& operator%=(const rep& rhs);
+    constexpr duration& operator%=(const duration& rhs);
 
     // special values
 
@@ -567,18 +569,18 @@
 
     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR duration  operator+() const {return *this;}
     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR duration  operator-() const {return duration(-__rep_);}
-    _LIBCPP_INLINE_VISIBILITY duration& operator++()      {++__rep_; return *this;}
-    _LIBCPP_INLINE_VISIBILITY duration  operator++(int)   {return duration(__rep_++);}
-    _LIBCPP_INLINE_VISIBILITY duration& operator--()      {--__rep_; return *this;}
-    _LIBCPP_INLINE_VISIBILITY duration  operator--(int)   {return duration(__rep_--);}
-
-    _LIBCPP_INLINE_VISIBILITY duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;}
-    _LIBCPP_INLINE_VISIBILITY duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;}
-
-    _LIBCPP_INLINE_VISIBILITY duration& operator*=(const rep& rhs) {__rep_ *= rhs; return *this;}
-    _LIBCPP_INLINE_VISIBILITY duration& operator/=(const rep& rhs) {__rep_ /= rhs; return *this;}
-    _LIBCPP_INLINE_VISIBILITY duration& operator%=(const rep& rhs) {__rep_ %= rhs; return *this;}
-    _LIBCPP_INLINE_VISIBILITY duration& operator%=(const duration& rhs) {__rep_ %= rhs.count(); return *this;}
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator++()      {++__rep_; return *this;}
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration  operator++(int)   {return duration(__rep_++);}
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator--()      {--__rep_; return *this;}
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration  operator--(int)   {return duration(__rep_--);}
+
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;}
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;}
+
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator*=(const rep& rhs) {__rep_ *= rhs; return *this;}
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator/=(const rep& rhs) {__rep_ /= rhs; return *this;}
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator%=(const rep& rhs) {__rep_ %= rhs; return *this;}
+    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator%=(const duration& rhs) {__rep_ %= rhs.count(); return *this;}
 
     // special values
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D27162: Support rel... Anton Bikineev via Phabricator via cfe-commits

Reply via email to