106 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8// UNSUPPORTED: c++03, c++11, c++14, c++179 10// <chrono>11// class year_month_day;12 13// constexpr year_month_day operator+(const year_month_day& ymd, const months& dm) noexcept;14// Returns: (ymd.year() / ymd.month() + dm) / ymd.day().15//16// constexpr year_month_day operator+(const months& dm, const year_month_day& ymd) noexcept;17// Returns: ymd + dm.18//19//20// constexpr year_month_day operator+(const year_month_day& ymd, const years& dy) noexcept;21// Returns: (ymd.year() + dy) / ymd.month() / ymd.day().22//23// constexpr year_month_day operator+(const years& dy, const year_month_day& ymd) noexcept;24// Returns: ym + dm.25 26#include <chrono>27#include <cassert>28#include <type_traits>29#include <utility>30 31#include "test_macros.h"32 33using day = std::chrono::day;34using year = std::chrono::year;35using years = std::chrono::years;36using month = std::chrono::month;37using months = std::chrono::months;38using year_month_day = std::chrono::year_month_day;39 40constexpr bool test() {41 { // year_month_day + months42 year_month_day ym{year{1234}, std::chrono::January, day{12}};43 for (int i = 0; i <= 10; ++i) {44 year_month_day ymd1 = ym + months{i};45 year_month_day ymd2 = months{i} + ym;46 assert(static_cast<int>(ymd1.year()) == 1234);47 assert(static_cast<int>(ymd2.year()) == 1234);48 assert(ymd1.month() == month(1 + i));49 assert(ymd2.month() == month(1 + i));50 assert(ymd1.day() == day{12});51 assert(ymd2.day() == day{12});52 assert(ymd1 == ymd2);53 }54 // Test the year wraps around.55 for (int i = 12; i <= 15; ++i) {56 year_month_day ymd1 = ym + months{i};57 year_month_day ymd2 = months{i} + ym;58 assert(static_cast<int>(ymd1.year()) == 1235);59 assert(static_cast<int>(ymd2.year()) == 1235);60 assert(ymd1.month() == month(1 + i - 12));61 assert(ymd2.month() == month(1 + i - 12));62 assert(ymd1.day() == day{12});63 assert(ymd2.day() == day{12});64 assert(ymd1 == ymd2);65 }66 }67 68 { // year_month_day + years69 year_month_day ym{year{1234}, std::chrono::January, day{12}};70 for (int i = 0; i <= 10; ++i) {71 year_month_day ymd1 = ym + years{i};72 year_month_day ymd2 = years{i} + ym;73 assert(static_cast<int>(ymd1.year()) == i + 1234);74 assert(static_cast<int>(ymd2.year()) == i + 1234);75 assert(ymd1.month() == std::chrono::January);76 assert(ymd2.month() == std::chrono::January);77 assert(ymd1.day() == day{12});78 assert(ymd2.day() == day{12});79 assert(ymd1 == ymd2);80 }81 }82 83 return true;84}85 86int main(int, char**) {87 // year_month_day + months88 ASSERT_NOEXCEPT(std::declval<year_month_day>() + std::declval<months>());89 ASSERT_NOEXCEPT(std::declval<months>() + std::declval<year_month_day>());90 91 ASSERT_SAME_TYPE(year_month_day, decltype(std::declval<year_month_day>() + std::declval<months>()));92 ASSERT_SAME_TYPE(year_month_day, decltype(std::declval<months>() + std::declval<year_month_day>()));93 94 // year_month_day + years95 ASSERT_NOEXCEPT(std::declval<year_month_day>() + std::declval<years>());96 ASSERT_NOEXCEPT(std::declval<years>() + std::declval<year_month_day>());97 98 ASSERT_SAME_TYPE(year_month_day, decltype(std::declval<year_month_day>() + std::declval<years>()));99 ASSERT_SAME_TYPE(year_month_day, decltype(std::declval<years>() + std::declval<year_month_day>()));100 101 test();102 static_assert(test());103 104 return 0;105}106