1 //===----------------------------------------------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
10
11 // <chrono>
12 // class month_day;
13
14 // constexpr month_day
15 // operator/(const month& m, const day& d) noexcept;
16 // Returns: {m, d}.
17 //
18 // constexpr month_day
19 // operator/(const day& d, const month& m) noexcept;
20 // Returns: m / d.
21
22 // constexpr month_day
23 // operator/(const month& m, int d) noexcept;
24 // Returns: m / day(d).
25 //
26 // constexpr month_day
27 // operator/(int m, const day& d) noexcept;
28 // Returns: month(m) / d.
29 //
30 // constexpr month_day
31 // operator/(const day& d, int m) noexcept;
32 // Returns: month(m) / d.
33
34
35 #include <chrono>
36 #include <type_traits>
37 #include <cassert>
38
39 #include "test_macros.h"
40 #include "test_comparisons.h"
41
main()42 int main()
43 {
44 using month_day = std::chrono::month_day;
45 using month = std::chrono::month;
46 using day = std::chrono::day;
47
48 constexpr month February = std::chrono::February;
49
50 { // operator/(const month& m, const day& d) (and switched)
51 ASSERT_NOEXCEPT ( February/day{1});
52 ASSERT_SAME_TYPE(month_day, decltype(February/day{1}));
53 ASSERT_NOEXCEPT ( day{1}/February);
54 ASSERT_SAME_TYPE(month_day, decltype(day{1}/February));
55
56 for (int i = 1; i <= 12; ++i)
57 for (unsigned j = 0; j <= 30; ++j)
58 {
59 month m(i);
60 day d{j};
61 month_day md1 = m/d;
62 month_day md2 = d/m;
63 assert(md1.month() == m);
64 assert(md1.day() == d);
65 assert(md2.month() == m);
66 assert(md2.day() == d);
67 assert(md1 == md2);
68 }
69 }
70
71
72 { // operator/(const month& m, int d) (NOT switched)
73 ASSERT_NOEXCEPT ( February/2);
74 ASSERT_SAME_TYPE(month_day, decltype(February/2));
75
76 for (int i = 1; i <= 12; ++i)
77 for (unsigned j = 0; j <= 30; ++j)
78 {
79 month m(i);
80 day d(j);
81 month_day md1 = m/j;
82 assert(md1.month() == m);
83 assert(md1.day() == d);
84 }
85 }
86
87
88 { // operator/(const day& d, int m) (and switched)
89 ASSERT_NOEXCEPT ( day{2}/2);
90 ASSERT_SAME_TYPE(month_day, decltype(day{2}/2));
91 ASSERT_NOEXCEPT ( 2/day{2});
92 ASSERT_SAME_TYPE(month_day, decltype(2/day{2}));
93
94 for (int i = 1; i <= 12; ++i)
95 for (unsigned j = 0; j <= 30; ++j)
96 {
97 month m(i);
98 day d(j);
99 month_day md1 = d/i;
100 month_day md2 = i/d;
101 assert(md1.month() == m);
102 assert(md1.day() == d);
103 assert(md2.month() == m);
104 assert(md2.day() == d);
105 assert(md1 == md2);
106 }
107 }
108 }
109