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 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 #include +#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: 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 #include +#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,11 +11,22 @@ // duration -// duration& operator+=(const duration& d); +// constexpr duration& operator+=(const duration& d); #include #include +#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); @@ -23,4 +34,13 @@ 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_--.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 #include +#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_--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 #include +#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,11 +11,22 @@ // duration -// duration& operator-=(const duration& d); +// constexpr duration& operator-=(const duration& d); #include #include +#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); @@ -23,4 +34,13 @@ 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_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 #include +#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_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,11 +11,22 @@ // duration -// duration& operator%=(const duration& rhs) +// constexpr duration& operator%=(const duration& rhs) #include #include +#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); @@ -24,4 +35,12 @@ 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_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 #include +#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_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 #include +#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: www/cxx1z_status.html =================================================================== --- www/cxx1z_status.html +++ www/cxx1z_status.html @@ -132,7 +132,7 @@ P0502R0LWGThrowing out of a parallel algorithm terminates - but how?Issaquah P0503R0LWGCorrecting library usage of "literal type"Issaquah P0504R0LWGRevisiting in-place tag types for any/optional/variantIssaquah - P0505R0LWGWording for GB 50 - constexpr for chronoIssaquah + P0505R0LWGWording for GB 50 - constexpr for chronoIssaquahComplete4.0 P0508R0LWGWording for GB 58 - structured bindings for node_handlesIssaquah P0509R1LWGUpdating “Restrictions on exception handling”Issaquah P0510R0LWGDisallowing references, incomplete types, arrays, and empty variantsIssaquah