diff --git a/libcxx/include/__chrono/month.h b/libcxx/include/__chrono/month.h --- a/libcxx/include/__chrono/month.h +++ b/libcxx/include/__chrono/month.h @@ -31,9 +31,9 @@ public: month() = default; _LIBCPP_HIDE_FROM_ABI explicit inline constexpr month(unsigned __val) noexcept : __m_(static_cast(__val)) {} - _LIBCPP_HIDE_FROM_ABI inline constexpr month& operator++() noexcept { ++__m_; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr month& operator++() noexcept { *this += months{1}; return *this; } _LIBCPP_HIDE_FROM_ABI inline constexpr month operator++(int) noexcept { month __tmp = *this; ++(*this); return __tmp; } - _LIBCPP_HIDE_FROM_ABI inline constexpr month& operator--() noexcept { --__m_; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr month& operator--() noexcept { *this -= months{1}; return *this; } _LIBCPP_HIDE_FROM_ABI inline constexpr month operator--(int) noexcept { month __tmp = *this; --(*this); return __tmp; } _LIBCPP_HIDE_FROM_ABI constexpr month& operator+=(const months& __m1) noexcept; _LIBCPP_HIDE_FROM_ABI constexpr month& operator-=(const months& __m1) noexcept; diff --git a/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/decrement.pass.cpp b/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/decrement.pass.cpp --- a/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/decrement.pass.cpp +++ b/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/decrement.pass.cpp @@ -13,42 +13,52 @@ // constexpr month& operator--() noexcept; // constexpr month operator--(int) noexcept; - #include #include #include #include "test_macros.h" -template -constexpr bool testConstexpr() -{ - M m1{10}; - if (static_cast(--m1) != 9) return false; - if (static_cast(m1--) != 9) return false; - if (static_cast(m1) != 8) return false; - return true; -} +constexpr bool test() { + using month = std::chrono::month; + for (unsigned i = 0; i <= 15; ++i) { + month m1(i); + month m2 = m1--; + assert(m1.ok()); + assert(m1 != m2); + + unsigned exp = i == 0 ? 11 : i == 1 ? 12 : i - 1; + while (exp > 12) + exp -= 12; + assert(static_cast(m1) == exp); + } + for (unsigned i = 0; i <= 15; ++i) { + month m1(i); + month m2 = --m1; + assert(m1.ok()); + assert(m2.ok()); + assert(m1 == m2); -int main(int, char**) -{ - using month = std::chrono::month; + unsigned exp = i == 0 ? 11 : i == 1 ? 12 : i - 1; + while (exp > 12) + exp -= 12; + assert(static_cast(m1) == exp); + } + + return true; +} - ASSERT_NOEXCEPT(--(std::declval()) ); - ASSERT_NOEXCEPT( (std::declval())--); +int main(int, char**) { + using month = std::chrono::month; - ASSERT_SAME_TYPE(month , decltype( std::declval()--)); - ASSERT_SAME_TYPE(month&, decltype(--std::declval() )); + ASSERT_NOEXCEPT(--(std::declval())); + ASSERT_NOEXCEPT((std::declval())--); - static_assert(testConstexpr(), ""); + ASSERT_SAME_TYPE(month, decltype(std::declval()--)); + ASSERT_SAME_TYPE(month&, decltype(--std::declval())); - for (unsigned i = 10; i <= 20; ++i) - { - month m(i); - assert(static_cast(--m) == i - 1); - assert(static_cast(m--) == i - 1); - assert(static_cast(m) == i - 2); - } + test(); + static_assert(test()); return 0; } diff --git a/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/increment.pass.cpp b/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/increment.pass.cpp --- a/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/increment.pass.cpp +++ b/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/increment.pass.cpp @@ -13,41 +13,52 @@ // constexpr month& operator++() noexcept; // constexpr month operator++(int) noexcept; - #include #include #include #include "test_macros.h" -template -constexpr bool testConstexpr() -{ - M m1{1}; - if (static_cast(++m1) != 2) return false; - if (static_cast(m1++) != 2) return false; - if (static_cast(m1) != 3) return false; - return true; +constexpr bool test() { + using month = std::chrono::month; + for (unsigned i = 0; i <= 15; ++i) { + month m1(i); + month m2 = m1++; + assert(m1.ok()); + assert(m1 != m2); + + unsigned exp = i + 1; + while (exp > 12) + exp -= 12; + assert(static_cast(m1) == exp); + } + for (unsigned i = 0; i <= 15; ++i) { + month m1(i); + month m2 = ++m1; + assert(m1.ok()); + assert(m2.ok()); + assert(m1 == m2); + + unsigned exp = i + 1; + while (exp > 12) + exp -= 12; + assert(static_cast(m1) == exp); + } + + return true; } -int main(int, char**) -{ - using month = std::chrono::month; - ASSERT_NOEXCEPT(++(std::declval()) ); - ASSERT_NOEXCEPT( (std::declval())++); +int main(int, char**) { + using month = std::chrono::month; - ASSERT_SAME_TYPE(month , decltype( std::declval()++)); - ASSERT_SAME_TYPE(month&, decltype(++std::declval() )); + ASSERT_NOEXCEPT(++(std::declval())); + ASSERT_NOEXCEPT((std::declval())++); - static_assert(testConstexpr(), ""); + ASSERT_SAME_TYPE(month, decltype(std::declval()++)); + ASSERT_SAME_TYPE(month&, decltype(++std::declval())); - for (unsigned i = 0; i <= 10; ++i) - { - month m(i); - assert(static_cast(++m) == i + 1); - assert(static_cast(m++) == i + 1); - assert(static_cast(m) == i + 2); - } + test(); + static_assert(test()); return 0; } diff --git a/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/plus_minus_equal.pass.cpp b/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/plus_minus_equal.pass.cpp --- a/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/plus_minus_equal.pass.cpp +++ b/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.members/plus_minus_equal.pass.cpp @@ -19,50 +19,43 @@ #include "test_macros.h" -template -constexpr bool testConstexpr() -{ - M m1{1}; - if (static_cast(m1 += Ms{ 1}) != 2) return false; - if (static_cast(m1 += Ms{ 2}) != 4) return false; - if (static_cast(m1 += Ms{ 8}) != 12) return false; - if (static_cast(m1 -= Ms{ 1}) != 11) return false; - if (static_cast(m1 -= Ms{ 2}) != 9) return false; - if (static_cast(m1 -= Ms{ 8}) != 1) return false; - return true; +constexpr bool test() { + using month = std::chrono::month; + using months = std::chrono::months; + + for (unsigned i = 1; i <= 10; ++i) { + month m(i); + int exp = i + 10; + while (exp > 12) + exp -= 12; + assert(static_cast(m += months{10}) == static_cast(exp)); + assert(static_cast(m) == static_cast(exp)); + assert(m.ok()); + } + + for (unsigned i = 1; i <= 10; ++i) { + month m(i); + int exp = i - 9; + while (exp < 1) + exp += 12; + assert(static_cast(m -= months{9}) == static_cast(exp)); + assert(static_cast(m) == static_cast(exp)); + assert(m.ok()); + } + return true; } -int main(int, char**) -{ - using month = std::chrono::month; - using months = std::chrono::months; +int main(int, char**) { + using month = std::chrono::month; + using months = std::chrono::months; - ASSERT_NOEXCEPT(std::declval() += std::declval()); - ASSERT_NOEXCEPT(std::declval() -= std::declval()); - ASSERT_SAME_TYPE(month&, decltype(std::declval() += std::declval())); - ASSERT_SAME_TYPE(month&, decltype(std::declval() -= std::declval())); + ASSERT_NOEXCEPT(std::declval() += std::declval()); + ASSERT_NOEXCEPT(std::declval() -= std::declval()); + ASSERT_SAME_TYPE(month&, decltype(std::declval() += std::declval())); + ASSERT_SAME_TYPE(month&, decltype(std::declval() -= std::declval())); - static_assert(testConstexpr(), ""); - - for (unsigned i = 1; i <= 10; ++i) - { - month m(i); - int exp = i + 10; - while (exp > 12) - exp -= 12; - assert(static_cast(m += months{10}) == static_cast(exp)); - assert(static_cast(m) == static_cast(exp)); - } - - for (unsigned i = 1; i <= 10; ++i) - { - month m(i); - int exp = i - 9; - while (exp < 1) - exp += 12; - assert(static_cast(m -= months{ 9}) == static_cast(exp)); - assert(static_cast(m) == static_cast(exp)); - } + test(); + static_assert(test()); return 0; } diff --git a/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.nonmembers/minus.pass.cpp b/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.nonmembers/minus.pass.cpp --- a/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.nonmembers/minus.pass.cpp +++ b/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.nonmembers/minus.pass.cpp @@ -58,12 +58,11 @@ for (unsigned i = 1; i <= 12; ++i) { month m1 = m - months{i}; - // months off = m - month {i}; + assert(m1.ok()); int exp = 6 - i; if (exp < 1) exp += 12; assert(static_cast(m1) == static_cast(exp)); - // assert(off.count() == static_cast(exp)); } return 0; diff --git a/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.nonmembers/plus.pass.cpp b/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.nonmembers/plus.pass.cpp --- a/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.nonmembers/plus.pass.cpp +++ b/libcxx/test/std/time/time.cal/time.cal.month/time.cal.month.nonmembers/plus.pass.cpp @@ -23,51 +23,45 @@ // holding a value in the range [1, 12] even if !x.ok(). -end note] // [Example: February + months{11} == January. -end example] - - #include #include #include #include "test_macros.h" -template -constexpr bool testConstexpr() -{ - M m{1}; - Ms offset{4}; - assert(m + offset == M{5}); - assert(offset + m == M{5}); - // Check the example - assert(M{2} + Ms{11} == M{1}); - return true; -} +constexpr bool test() { + using month = std::chrono::month; + using months = std::chrono::months; -int main(int, char**) -{ - using month = std::chrono::month; - using months = std::chrono::months; + month my{2}; + for (unsigned i = 0; i <= 15; ++i) { + month m1 = my + months{i}; + month m2 = months{i} + my; + assert(m1.ok()); + assert(m2.ok()); + assert(m1 == m2); + unsigned exp = i + 2; + while (exp > 12) + exp -= 12; + assert(static_cast(m1) == exp); + assert(static_cast(m2) == exp); + } + + return true; +} - ASSERT_NOEXCEPT(std::declval() + std::declval()); - ASSERT_NOEXCEPT(std::declval() + std::declval()); +int main(int, char**) { + using month = std::chrono::month; + using months = std::chrono::months; - ASSERT_SAME_TYPE(month, decltype(std::declval() + std::declval())); - ASSERT_SAME_TYPE(month, decltype(std::declval() + std::declval() )); + ASSERT_NOEXCEPT(std::declval() + std::declval()); + ASSERT_NOEXCEPT(std::declval() + std::declval()); - static_assert(testConstexpr(), ""); + ASSERT_SAME_TYPE(month, decltype(std::declval() + std::declval())); + ASSERT_SAME_TYPE(month, decltype(std::declval() + std::declval())); - month my{2}; - for (unsigned i = 0; i <= 15; ++i) - { - month m1 = my + months{i}; - month m2 = months{i} + my; - assert(m1 == m2); - unsigned exp = i + 2; - while (exp > 12) - exp -= 12; - assert(static_cast(m1) == exp); - assert(static_cast(m2) == exp); - } + test(); + static_assert(test()); - return 0; + return 0; }