87 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(const sys_days& dp) noexcept;14//15// Effects: Constructs an object of type year_month_day that corresponds16// to the date represented by dp.17//18// Remarks: For any value ymd of type year_month_day for which ymd.ok() is true,19// ymd == year_month_day{sys_days{ymd}} is true.20//21// constexpr chrono::year year() const noexcept;22// constexpr chrono::month month() const noexcept;23// constexpr bool ok() const noexcept;24 25#include <chrono>26#include <cassert>27#include <type_traits>28#include <utility>29 30#include "test_macros.h"31 32int main(int, char**)33{34 using year = std::chrono::year;35 using day = std::chrono::day;36 using sys_days = std::chrono::sys_days;37 using days = std::chrono::days;38 using year_month_day = std::chrono::year_month_day;39 40 ASSERT_NOEXCEPT(year_month_day{std::declval<sys_days>()});41 42 {43 constexpr sys_days sd{};44 constexpr year_month_day ymd{sd};45 46 static_assert( ymd.ok(), "");47 static_assert( ymd.year() == year{1970}, "");48 static_assert( ymd.month() == std::chrono::January, "");49 static_assert( ymd.day() == day{1}, "");50 }51 52 {53 constexpr sys_days sd{days{10957+32}};54 constexpr year_month_day ymd{sd};55 56 static_assert( ymd.ok(), "");57 static_assert( ymd.year() == year{2000}, "");58 static_assert( ymd.month() == std::chrono::February, "");59 static_assert( ymd.day() == day{2}, "");60 }61 62 63 // There's one more leap day between 1/1/40 and 1/1/7064 // when compared to 1/1/70 -> 1/1/200065 {66 constexpr sys_days sd{days{-10957}};67 constexpr year_month_day ymd{sd};68 69 static_assert( ymd.ok(), "");70 static_assert( ymd.year() == year{1940}, "");71 static_assert( ymd.month() == std::chrono::January, "");72 static_assert( ymd.day() == day{2}, "");73 }74 75 {76 sys_days sd{days{-(10957+34)}};77 year_month_day ymd{sd};78 79 assert( ymd.ok());80 assert( ymd.year() == year{1939});81 assert( ymd.month() == std::chrono::November);82 assert( ymd.day() == day{29});83 }84 85 return 0;86}87