xref: /llvm-project/libcxx/test/std/time/time.zone/time.zone.leap/assign.copy.pass.cpp (revision a4422a51941bfcffc870d1e2fff682e5387f89c2)
16f2d8cc0SMark de Wever //===----------------------------------------------------------------------===//
26f2d8cc0SMark de Wever //
36f2d8cc0SMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46f2d8cc0SMark de Wever // See https://llvm.org/LICENSE.txt for license information.
56f2d8cc0SMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66f2d8cc0SMark de Wever //
76f2d8cc0SMark de Wever //===----------------------------------------------------------------------===//
86f2d8cc0SMark de Wever 
96f2d8cc0SMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
106f2d8cc0SMark de Wever // UNSUPPORTED: no-filesystem, no-localization, no-tzdb
116f2d8cc0SMark de Wever 
12*a4422a51SMark de Wever // XFAIL: libcpp-has-no-experimental-tzdb
136f2d8cc0SMark de Wever // XFAIL: availability-tzdb-missing
146f2d8cc0SMark de Wever 
156f2d8cc0SMark de Wever // <chrono>
166f2d8cc0SMark de Wever 
176f2d8cc0SMark de Wever // class leap_second
186f2d8cc0SMark de Wever // {
196f2d8cc0SMark de Wever //   leap_second& operator=(const leap_second&) = default;
206f2d8cc0SMark de Wever //
216f2d8cc0SMark de Wever //   ...
226f2d8cc0SMark de Wever // };
236f2d8cc0SMark de Wever 
246f2d8cc0SMark de Wever #include <chrono>
256f2d8cc0SMark de Wever #include <concepts>
266f2d8cc0SMark de Wever #include <memory>
276f2d8cc0SMark de Wever #include <type_traits>
286f2d8cc0SMark de Wever #include <cassert>
296f2d8cc0SMark de Wever 
306f2d8cc0SMark de Wever #include "test_chrono_leap_second.h"
316f2d8cc0SMark de Wever 
test()326f2d8cc0SMark de Wever constexpr bool test() {
336f2d8cc0SMark de Wever   std::chrono::leap_second a =
346f2d8cc0SMark de Wever       test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1});
356f2d8cc0SMark de Wever   std::chrono::leap_second b =
366f2d8cc0SMark de Wever       test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{10}}, std::chrono::seconds{15});
376f2d8cc0SMark de Wever 
386f2d8cc0SMark de Wever   //  operator== only compares the date member.
396f2d8cc0SMark de Wever   assert(a.date() != b.date());
406f2d8cc0SMark de Wever   assert(a.value() != b.value());
416f2d8cc0SMark de Wever 
426f2d8cc0SMark de Wever   {
436f2d8cc0SMark de Wever     std::same_as<std::chrono::leap_second&> decltype(auto) result(b = a);
446f2d8cc0SMark de Wever     assert(std::addressof(result) == std::addressof(b));
456f2d8cc0SMark de Wever 
466f2d8cc0SMark de Wever     assert(a.date() == b.date());
476f2d8cc0SMark de Wever     assert(a.value() == b.value());
486f2d8cc0SMark de Wever   }
496f2d8cc0SMark de Wever 
506f2d8cc0SMark de Wever   {
516f2d8cc0SMark de Wever     // Tests an rvalue uses the copy assignment.
526f2d8cc0SMark de Wever     std::same_as<std::chrono::leap_second&> decltype(auto) result(b = std::move(a));
536f2d8cc0SMark de Wever     assert(std::addressof(result) == std::addressof(b));
546f2d8cc0SMark de Wever 
556f2d8cc0SMark de Wever     assert(a.date() == b.date());
566f2d8cc0SMark de Wever     assert(a.value() == b.value());
576f2d8cc0SMark de Wever   }
586f2d8cc0SMark de Wever 
596f2d8cc0SMark de Wever   return true;
606f2d8cc0SMark de Wever }
616f2d8cc0SMark de Wever 
main(int,const char **)626f2d8cc0SMark de Wever int main(int, const char**) {
636f2d8cc0SMark de Wever   static_assert(std::is_copy_assignable_v<std::chrono::leap_second>);
646f2d8cc0SMark de Wever 
656f2d8cc0SMark de Wever   test();
666f2d8cc0SMark de Wever   static_assert(test());
676f2d8cc0SMark de Wever 
686f2d8cc0SMark de Wever   return 0;
696f2d8cc0SMark de Wever }
70