1*7738db2cSMark de Wever //===----------------------------------------------------------------------===//
2*7738db2cSMark de Wever //
3*7738db2cSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*7738db2cSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
5*7738db2cSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*7738db2cSMark de Wever //
7*7738db2cSMark de Wever //===----------------------------------------------------------------------===//
8*7738db2cSMark de Wever 
9*7738db2cSMark de Wever // <chrono>
10*7738db2cSMark de Wever 
11*7738db2cSMark de Wever // duration
12*7738db2cSMark de Wever 
13*7738db2cSMark de Wever // template <class Rep1, class Period1, class Rep2, class Period2>
14*7738db2cSMark de Wever //   constexpr
15*7738db2cSMark de Wever //   typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
16*7738db2cSMark de Wever //   operator%(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
17*7738db2cSMark de Wever 
18*7738db2cSMark de Wever #include <chrono>
19*7738db2cSMark de Wever #include <cassert>
20*7738db2cSMark de Wever #include <ratio>
21*7738db2cSMark de Wever 
22*7738db2cSMark de Wever #include "test_macros.h"
23*7738db2cSMark de Wever 
main(int,char **)24*7738db2cSMark de Wever int main(int, char**)
25*7738db2cSMark de Wever {
26*7738db2cSMark de Wever     {
27*7738db2cSMark de Wever     std::chrono::nanoseconds ns1(15);
28*7738db2cSMark de Wever     std::chrono::nanoseconds ns2(6);
29*7738db2cSMark de Wever     std::chrono::nanoseconds r = ns1 % ns2;
30*7738db2cSMark de Wever     assert(r.count() == 3);
31*7738db2cSMark de Wever     }
32*7738db2cSMark de Wever     {
33*7738db2cSMark de Wever     std::chrono::microseconds us1(15);
34*7738db2cSMark de Wever     std::chrono::nanoseconds ns2(28);
35*7738db2cSMark de Wever     std::chrono::nanoseconds r = us1 % ns2;
36*7738db2cSMark de Wever     assert(r.count() == 20);
37*7738db2cSMark de Wever     }
38*7738db2cSMark de Wever     {
39*7738db2cSMark de Wever     std::chrono::duration<int, std::ratio<3, 5> > s1(6);
40*7738db2cSMark de Wever     std::chrono::duration<int, std::ratio<2, 3> > s2(3);
41*7738db2cSMark de Wever     std::chrono::duration<int, std::ratio<1, 15> > r = s1 % s2;
42*7738db2cSMark de Wever     assert(r.count() == 24);
43*7738db2cSMark de Wever     }
44*7738db2cSMark de Wever #if TEST_STD_VER >= 11
45*7738db2cSMark de Wever     {
46*7738db2cSMark de Wever     constexpr std::chrono::nanoseconds ns1(15);
47*7738db2cSMark de Wever     constexpr std::chrono::nanoseconds ns2(6);
48*7738db2cSMark de Wever     constexpr std::chrono::nanoseconds r = ns1 % ns2;
49*7738db2cSMark de Wever     static_assert(r.count() == 3, "");
50*7738db2cSMark de Wever     }
51*7738db2cSMark de Wever     {
52*7738db2cSMark de Wever     constexpr std::chrono::microseconds us1(15);
53*7738db2cSMark de Wever     constexpr std::chrono::nanoseconds ns2(28);
54*7738db2cSMark de Wever     constexpr std::chrono::nanoseconds r = us1 % ns2;
55*7738db2cSMark de Wever     static_assert(r.count() == 20, "");
56*7738db2cSMark de Wever     }
57*7738db2cSMark de Wever     {
58*7738db2cSMark de Wever     constexpr std::chrono::duration<int, std::ratio<3, 5> > s1(6);
59*7738db2cSMark de Wever     constexpr std::chrono::duration<int, std::ratio<2, 3> > s2(3);
60*7738db2cSMark de Wever     constexpr std::chrono::duration<int, std::ratio<1, 15> > r = s1 % s2;
61*7738db2cSMark de Wever     static_assert(r.count() == 24, "");
62*7738db2cSMark de Wever     }
63*7738db2cSMark de Wever #endif
64*7738db2cSMark de Wever 
65*7738db2cSMark de Wever   return 0;
66*7738db2cSMark de Wever }
67