1 // The MIT License (MIT)
2 //
3 // Copyright (c) 2015, 2016 Howard Hinnant
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 // SOFTWARE.
22 
23 #include "date.h"
24 
25 #include <type_traits>
26 
27 template <class I, class J, class K>
28 constexpr
29 auto
test(I i,J j,K k)30 test(I i, J j, K k) -> decltype(i/j/k)
31 {
32     return i/j/k;
33 }
34 
35 void
test(...)36 test(...)
37 {
38 }
39 
40 int
main()41 main()
42 {
43     using std::is_same;
44     using namespace date;
45 
46     static_assert(is_same<decltype(test(        1,         1,         1)), int>{}, "");
47     static_assert(is_same<decltype(test(        1,         1,       1_d)), month_day>{}, "");
48     static_assert(is_same<decltype(test(        1,         1,       jan)), void>{}, "");
49     static_assert(is_same<decltype(test(        1,         1,       1_y)), void>{}, "");
50     static_assert(is_same<decltype(test(        1,         1,      last)), month_day_last>{}, "");
51     static_assert(is_same<decltype(test(        1,         1,    sun[1])), month_weekday>{}, "");
52     static_assert(is_same<decltype(test(        1,         1, sun[last])), month_weekday_last>{}, "");
53 
54     static_assert(is_same<decltype(test(        1,       1_d,         1)), year_month_day>{}, "");
55     static_assert(is_same<decltype(test(        1,       1_d,       1_d)), void>{}, "");
56     static_assert(is_same<decltype(test(        1,       1_d,       jan)), void>{}, "");
57     static_assert(is_same<decltype(test(        1,       1_d,       1_y)), year_month_day>{}, "");
58     static_assert(is_same<decltype(test(        1,       1_d,      last)), void>{}, "");
59     static_assert(is_same<decltype(test(        1,       1_d,    sun[1])), void>{}, "");
60     static_assert(is_same<decltype(test(        1,       1_d, sun[last])), void>{}, "");
61 
62     static_assert(is_same<decltype(test(        1,       jan,         1)), void>{}, "");
63     static_assert(is_same<decltype(test(        1,       jan,       1_d)), void>{}, "");
64     static_assert(is_same<decltype(test(        1,       jan,       jan)), void>{}, "");
65     static_assert(is_same<decltype(test(        1,       jan,       1_y)), void>{}, "");
66     static_assert(is_same<decltype(test(        1,       jan,      last)), void>{}, "");
67     static_assert(is_same<decltype(test(        1,       jan,    sun[1])), void>{}, "");
68     static_assert(is_same<decltype(test(        1,       jan, sun[last])), void>{}, "");
69 
70     static_assert(is_same<decltype(test(        1,       1_y,         1)), void>{}, "");
71     static_assert(is_same<decltype(test(        1,       1_y,       1_d)), void>{}, "");
72     static_assert(is_same<decltype(test(        1,       1_y,       jan)), void>{}, "");
73     static_assert(is_same<decltype(test(        1,       1_y,       1_y)), void>{}, "");
74     static_assert(is_same<decltype(test(        1,       1_y,      last)), void>{}, "");
75     static_assert(is_same<decltype(test(        1,       1_y,    sun[1])), void>{}, "");
76     static_assert(is_same<decltype(test(        1,       1_y, sun[last])), void>{}, "");
77 
78     static_assert(is_same<decltype(test(        1,      last,         1)), year_month_day_last>{}, "");
79     static_assert(is_same<decltype(test(        1,      last,       1_d)), void>{}, "");
80     static_assert(is_same<decltype(test(        1,      last,       jan)), void>{}, "");
81     static_assert(is_same<decltype(test(        1,      last,       1_y)), year_month_day_last>{}, "");
82     static_assert(is_same<decltype(test(        1,      last,      last)), void>{}, "");
83     static_assert(is_same<decltype(test(        1,      last,    sun[1])), void>{}, "");
84     static_assert(is_same<decltype(test(        1,      last, sun[last])), void>{}, "");
85 
86     static_assert(is_same<decltype(test(        1,    sun[1],         1)), year_month_weekday>{}, "");
87     static_assert(is_same<decltype(test(        1,    sun[1],       1_d)), void>{}, "");
88     static_assert(is_same<decltype(test(        1,    sun[1],       jan)), void>{}, "");
89     static_assert(is_same<decltype(test(        1,    sun[1],       1_y)), year_month_weekday>{}, "");
90     static_assert(is_same<decltype(test(        1,    sun[1],      last)), void>{}, "");
91     static_assert(is_same<decltype(test(        1,    sun[1],    sun[1])), void>{}, "");
92     static_assert(is_same<decltype(test(        1,    sun[1], sun[last])), void>{}, "");
93 
94     static_assert(is_same<decltype(test(        1, sun[last],         1)), year_month_weekday_last>{}, "");
95     static_assert(is_same<decltype(test(        1, sun[last],       1_d)), void>{}, "");
96     static_assert(is_same<decltype(test(        1, sun[last],       jan)), void>{}, "");
97     static_assert(is_same<decltype(test(        1, sun[last],       1_y)), year_month_weekday_last>{}, "");
98     static_assert(is_same<decltype(test(        1, sun[last],      last)), void>{}, "");
99     static_assert(is_same<decltype(test(        1, sun[last],    sun[1])), void>{}, "");
100     static_assert(is_same<decltype(test(        1, sun[last], sun[last])), void>{}, "");
101 
102     static_assert(is_same<decltype(test(      1_d,         1,         1)), year_month_day>{}, "");
103     static_assert(is_same<decltype(test(      1_d,         1,       1_d)), void>{}, "");
104     static_assert(is_same<decltype(test(      1_d,         1,       jan)), void>{}, "");
105     static_assert(is_same<decltype(test(      1_d,         1,       1_y)), year_month_day>{}, "");
106     static_assert(is_same<decltype(test(      1_d,         1,      last)), void>{}, "");
107     static_assert(is_same<decltype(test(      1_d,         1,    sun[1])), void>{}, "");
108     static_assert(is_same<decltype(test(      1_d,         1, sun[last])), void>{}, "");
109 
110     static_assert(is_same<decltype(test(      1_d,       1_d,         1)), void>{}, "");
111     static_assert(is_same<decltype(test(      1_d,       1_d,       1_d)), void>{}, "");
112     static_assert(is_same<decltype(test(      1_d,       1_d,       jan)), void>{}, "");
113     static_assert(is_same<decltype(test(      1_d,       1_d,       1_y)), void>{}, "");
114     static_assert(is_same<decltype(test(      1_d,       1_d,      last)), void>{}, "");
115     static_assert(is_same<decltype(test(      1_d,       1_d,    sun[1])), void>{}, "");
116     static_assert(is_same<decltype(test(      1_d,       1_d, sun[last])), void>{}, "");
117 
118     static_assert(is_same<decltype(test(      1_d,       jan,         1)), year_month_day>{}, "");
119     static_assert(is_same<decltype(test(      1_d,       jan,       1_d)), void>{}, "");
120     static_assert(is_same<decltype(test(      1_d,       jan,       jan)), void>{}, "");
121     static_assert(is_same<decltype(test(      1_d,       jan,       1_y)), year_month_day>{}, "");
122     static_assert(is_same<decltype(test(      1_d,       jan,      last)), void>{}, "");
123     static_assert(is_same<decltype(test(      1_d,       jan,    sun[1])), void>{}, "");
124     static_assert(is_same<decltype(test(      1_d,       jan, sun[last])), void>{}, "");
125 
126     static_assert(is_same<decltype(test(      1_d,       1_y,         1)), void>{}, "");
127     static_assert(is_same<decltype(test(      1_d,       1_y,       1_d)), void>{}, "");
128     static_assert(is_same<decltype(test(      1_d,       1_y,       jan)), void>{}, "");
129     static_assert(is_same<decltype(test(      1_d,       1_y,       1_y)), void>{}, "");
130     static_assert(is_same<decltype(test(      1_d,       1_y,      last)), void>{}, "");
131     static_assert(is_same<decltype(test(      1_d,       1_y,    sun[1])), void>{}, "");
132     static_assert(is_same<decltype(test(      1_d,       1_y, sun[last])), void>{}, "");
133 
134     static_assert(is_same<decltype(test(      1_d,      last,         1)), void>{}, "");
135     static_assert(is_same<decltype(test(      1_d,      last,       1_d)), void>{}, "");
136     static_assert(is_same<decltype(test(      1_d,      last,       jan)), void>{}, "");
137     static_assert(is_same<decltype(test(      1_d,      last,       1_y)), void>{}, "");
138     static_assert(is_same<decltype(test(      1_d,      last,      last)), void>{}, "");
139     static_assert(is_same<decltype(test(      1_d,      last,    sun[1])), void>{}, "");
140     static_assert(is_same<decltype(test(      1_d,      last, sun[last])), void>{}, "");
141 
142     static_assert(is_same<decltype(test(      1_d,    sun[1],         1)), void>{}, "");
143     static_assert(is_same<decltype(test(      1_d,    sun[1],       1_d)), void>{}, "");
144     static_assert(is_same<decltype(test(      1_d,    sun[1],       jan)), void>{}, "");
145     static_assert(is_same<decltype(test(      1_d,    sun[1],       1_y)), void>{}, "");
146     static_assert(is_same<decltype(test(      1_d,    sun[1],      last)), void>{}, "");
147     static_assert(is_same<decltype(test(      1_d,    sun[1],    sun[1])), void>{}, "");
148     static_assert(is_same<decltype(test(      1_d,    sun[1], sun[last])), void>{}, "");
149 
150     static_assert(is_same<decltype(test(      1_d, sun[last],         1)), void>{}, "");
151     static_assert(is_same<decltype(test(      1_d, sun[last],       1_d)), void>{}, "");
152     static_assert(is_same<decltype(test(      1_d, sun[last],       jan)), void>{}, "");
153     static_assert(is_same<decltype(test(      1_d, sun[last],       1_y)), void>{}, "");
154     static_assert(is_same<decltype(test(      1_d, sun[last],      last)), void>{}, "");
155     static_assert(is_same<decltype(test(      1_d, sun[last],    sun[1])), void>{}, "");
156     static_assert(is_same<decltype(test(      1_d, sun[last], sun[last])), void>{}, "");
157 
158     static_assert(is_same<decltype(test(      jan,         1,         1)), year_month_day>{}, "");
159     static_assert(is_same<decltype(test(      jan,         1,       1_d)), void>{}, "");
160     static_assert(is_same<decltype(test(      jan,         1,       jan)), void>{}, "");
161     static_assert(is_same<decltype(test(      jan,         1,       1_y)), year_month_day>{}, "");
162     static_assert(is_same<decltype(test(      jan,         1,      last)), void>{}, "");
163     static_assert(is_same<decltype(test(      jan,         1,    sun[1])), void>{}, "");
164     static_assert(is_same<decltype(test(      jan,         1, sun[last])), void>{}, "");
165 
166     static_assert(is_same<decltype(test(      jan,       1_d,         1)), year_month_day>{}, "");
167     static_assert(is_same<decltype(test(      jan,       1_d,       1_d)), void>{}, "");
168     static_assert(is_same<decltype(test(      jan,       1_d,       jan)), void>{}, "");
169     static_assert(is_same<decltype(test(      jan,       1_d,       1_y)), year_month_day>{}, "");
170     static_assert(is_same<decltype(test(      jan,       1_d,      last)), void>{}, "");
171     static_assert(is_same<decltype(test(      jan,       1_d,    sun[1])), void>{}, "");
172     static_assert(is_same<decltype(test(      jan,       1_d, sun[last])), void>{}, "");
173 
174     static_assert(is_same<decltype(test(      jan,       jan,         1)), void>{}, "");
175     static_assert(is_same<decltype(test(      jan,       jan,       1_d)), void>{}, "");
176     static_assert(is_same<decltype(test(      jan,       jan,       jan)), void>{}, "");
177     static_assert(is_same<decltype(test(      jan,       jan,       1_y)), void>{}, "");
178     static_assert(is_same<decltype(test(      jan,       jan,      last)), void>{}, "");
179     static_assert(is_same<decltype(test(      jan,       jan,    sun[1])), void>{}, "");
180     static_assert(is_same<decltype(test(      jan,       jan, sun[last])), void>{}, "");
181 
182     static_assert(is_same<decltype(test(      jan,       1_y,         1)), void>{}, "");
183     static_assert(is_same<decltype(test(      jan,       1_y,       1_d)), void>{}, "");
184     static_assert(is_same<decltype(test(      jan,       1_y,       jan)), void>{}, "");
185     static_assert(is_same<decltype(test(      jan,       1_y,       1_y)), void>{}, "");
186     static_assert(is_same<decltype(test(      jan,       1_y,      last)), void>{}, "");
187     static_assert(is_same<decltype(test(      jan,       1_y,    sun[1])), void>{}, "");
188     static_assert(is_same<decltype(test(      jan,       1_y, sun[last])), void>{}, "");
189 
190     static_assert(is_same<decltype(test(      jan,      last,         1)), year_month_day_last>{}, "");
191     static_assert(is_same<decltype(test(      jan,      last,       1_d)), void>{}, "");
192     static_assert(is_same<decltype(test(      jan,      last,       jan)), void>{}, "");
193     static_assert(is_same<decltype(test(      jan,      last,       1_y)), year_month_day_last>{}, "");
194     static_assert(is_same<decltype(test(      jan,      last,      last)), void>{}, "");
195     static_assert(is_same<decltype(test(      jan,      last,    sun[1])), void>{}, "");
196     static_assert(is_same<decltype(test(      jan,      last, sun[last])), void>{}, "");
197 
198     static_assert(is_same<decltype(test(      jan,    sun[1],         1)), year_month_weekday>{}, "");
199     static_assert(is_same<decltype(test(      jan,    sun[1],       1_d)), void>{}, "");
200     static_assert(is_same<decltype(test(      jan,    sun[1],       jan)), void>{}, "");
201     static_assert(is_same<decltype(test(      jan,    sun[1],       1_y)), year_month_weekday>{}, "");
202     static_assert(is_same<decltype(test(      jan,    sun[1],      last)), void>{}, "");
203     static_assert(is_same<decltype(test(      jan,    sun[1],    sun[1])), void>{}, "");
204     static_assert(is_same<decltype(test(      jan,    sun[1], sun[last])), void>{}, "");
205 
206     static_assert(is_same<decltype(test(      jan, sun[last],         1)), year_month_weekday_last>{}, "");
207     static_assert(is_same<decltype(test(      jan, sun[last],       1_d)), void>{}, "");
208     static_assert(is_same<decltype(test(      jan, sun[last],       jan)), void>{}, "");
209     static_assert(is_same<decltype(test(      jan, sun[last],       1_y)), year_month_weekday_last>{}, "");
210     static_assert(is_same<decltype(test(      jan, sun[last],      last)), void>{}, "");
211     static_assert(is_same<decltype(test(      jan, sun[last],    sun[1])), void>{}, "");
212     static_assert(is_same<decltype(test(      jan, sun[last], sun[last])), void>{}, "");
213 
214     static_assert(is_same<decltype(test(      1_y,         1,         1)), year_month_day>{}, "");
215     static_assert(is_same<decltype(test(      1_y,         1,       1_d)), year_month_day>{}, "");
216     static_assert(is_same<decltype(test(      1_y,         1,       jan)), void>{}, "");
217     static_assert(is_same<decltype(test(      1_y,         1,       1_y)), void>{}, "");
218     static_assert(is_same<decltype(test(      1_y,         1,      last)), year_month_day_last>{}, "");
219     static_assert(is_same<decltype(test(      1_y,         1,    sun[1])), year_month_weekday>{}, "");
220     static_assert(is_same<decltype(test(      1_y,         1, sun[last])), year_month_weekday_last>{}, "");
221 
222     static_assert(is_same<decltype(test(      1_y,       1_d,         1)), void>{}, "");
223     static_assert(is_same<decltype(test(      1_y,       1_d,       1_d)), void>{}, "");
224     static_assert(is_same<decltype(test(      1_y,       1_d,       jan)), void>{}, "");
225     static_assert(is_same<decltype(test(      1_y,       1_d,       1_y)), void>{}, "");
226     static_assert(is_same<decltype(test(      1_y,       1_d,      last)), void>{}, "");
227     static_assert(is_same<decltype(test(      1_y,       1_d,    sun[1])), void>{}, "");
228     static_assert(is_same<decltype(test(      1_y,       1_d, sun[last])), void>{}, "");
229 
230     static_assert(is_same<decltype(test(      1_y,       jan,         1)), year_month_day>{}, "");
231     static_assert(is_same<decltype(test(      1_y,       jan,       1_d)), year_month_day>{}, "");
232     static_assert(is_same<decltype(test(      1_y,       jan,       jan)), void>{}, "");
233     static_assert(is_same<decltype(test(      1_y,       jan,       1_y)), void>{}, "");
234     static_assert(is_same<decltype(test(      1_y,       jan,      last)), year_month_day_last>{}, "");
235     static_assert(is_same<decltype(test(      1_y,       jan,    sun[1])), year_month_weekday>{}, "");
236     static_assert(is_same<decltype(test(      1_y,       jan, sun[last])), year_month_weekday_last>{}, "");
237 
238     static_assert(is_same<decltype(test(      1_y,       1_y,         1)), void>{}, "");
239     static_assert(is_same<decltype(test(      1_y,       1_y,       1_d)), void>{}, "");
240     static_assert(is_same<decltype(test(      1_y,       1_y,       jan)), void>{}, "");
241     static_assert(is_same<decltype(test(      1_y,       1_y,       1_y)), void>{}, "");
242     static_assert(is_same<decltype(test(      1_y,       1_y,      last)), void>{}, "");
243     static_assert(is_same<decltype(test(      1_y,       1_y,    sun[1])), void>{}, "");
244     static_assert(is_same<decltype(test(      1_y,       1_y, sun[last])), void>{}, "");
245 
246     static_assert(is_same<decltype(test(      1_y,      last,         1)), void>{}, "");
247     static_assert(is_same<decltype(test(      1_y,      last,       1_d)), void>{}, "");
248     static_assert(is_same<decltype(test(      1_y,      last,       jan)), void>{}, "");
249     static_assert(is_same<decltype(test(      1_y,      last,       1_y)), void>{}, "");
250     static_assert(is_same<decltype(test(      1_y,      last,      last)), void>{}, "");
251     static_assert(is_same<decltype(test(      1_y,      last,    sun[1])), void>{}, "");
252     static_assert(is_same<decltype(test(      1_y,      last, sun[last])), void>{}, "");
253 
254     static_assert(is_same<decltype(test(      1_y,    sun[1],         1)), void>{}, "");
255     static_assert(is_same<decltype(test(      1_y,    sun[1],       1_d)), void>{}, "");
256     static_assert(is_same<decltype(test(      1_y,    sun[1],       jan)), void>{}, "");
257     static_assert(is_same<decltype(test(      1_y,    sun[1],       1_y)), void>{}, "");
258     static_assert(is_same<decltype(test(      1_y,    sun[1],      last)), void>{}, "");
259     static_assert(is_same<decltype(test(      1_y,    sun[1],    sun[1])), void>{}, "");
260     static_assert(is_same<decltype(test(      1_y,    sun[1], sun[last])), void>{}, "");
261 
262     static_assert(is_same<decltype(test(      1_y, sun[last],         1)), void>{}, "");
263     static_assert(is_same<decltype(test(      1_y, sun[last],       1_d)), void>{}, "");
264     static_assert(is_same<decltype(test(      1_y, sun[last],       jan)), void>{}, "");
265     static_assert(is_same<decltype(test(      1_y, sun[last],       1_y)), void>{}, "");
266     static_assert(is_same<decltype(test(      1_y, sun[last],      last)), void>{}, "");
267     static_assert(is_same<decltype(test(      1_y, sun[last],    sun[1])), void>{}, "");
268     static_assert(is_same<decltype(test(      1_y, sun[last], sun[last])), void>{}, "");
269 
270     static_assert(is_same<decltype(test(     last,         1,         1)), year_month_day_last>{}, "");
271     static_assert(is_same<decltype(test(     last,         1,       1_d)), void>{}, "");
272     static_assert(is_same<decltype(test(     last,         1,       jan)), void>{}, "");
273     static_assert(is_same<decltype(test(     last,         1,       1_y)), year_month_day_last>{}, "");
274     static_assert(is_same<decltype(test(     last,         1,      last)), void>{}, "");
275     static_assert(is_same<decltype(test(     last,         1,    sun[1])), void>{}, "");
276     static_assert(is_same<decltype(test(     last,         1, sun[last])), void>{}, "");
277 
278     static_assert(is_same<decltype(test(     last,       1_d,         1)), void>{}, "");
279     static_assert(is_same<decltype(test(     last,       1_d,       1_d)), void>{}, "");
280     static_assert(is_same<decltype(test(     last,       1_d,       jan)), void>{}, "");
281     static_assert(is_same<decltype(test(     last,       1_d,       1_y)), void>{}, "");
282     static_assert(is_same<decltype(test(     last,       1_d,      last)), void>{}, "");
283     static_assert(is_same<decltype(test(     last,       1_d,    sun[1])), void>{}, "");
284     static_assert(is_same<decltype(test(     last,       1_d, sun[last])), void>{}, "");
285 
286     static_assert(is_same<decltype(test(     last,       jan,         1)), year_month_day_last>{}, "");
287     static_assert(is_same<decltype(test(     last,       jan,       1_d)), void>{}, "");
288     static_assert(is_same<decltype(test(     last,       jan,       jan)), void>{}, "");
289     static_assert(is_same<decltype(test(     last,       jan,       1_y)), year_month_day_last>{}, "");
290     static_assert(is_same<decltype(test(     last,       jan,      last)), void>{}, "");
291     static_assert(is_same<decltype(test(     last,       jan,    sun[1])), void>{}, "");
292     static_assert(is_same<decltype(test(     last,       jan, sun[last])), void>{}, "");
293 
294     static_assert(is_same<decltype(test(     last,       1_y,         1)), void>{}, "");
295     static_assert(is_same<decltype(test(     last,       1_y,       1_d)), void>{}, "");
296     static_assert(is_same<decltype(test(     last,       1_y,       jan)), void>{}, "");
297     static_assert(is_same<decltype(test(     last,       1_y,       1_y)), void>{}, "");
298     static_assert(is_same<decltype(test(     last,       1_y,      last)), void>{}, "");
299     static_assert(is_same<decltype(test(     last,       1_y,    sun[1])), void>{}, "");
300     static_assert(is_same<decltype(test(     last,       1_y, sun[last])), void>{}, "");
301 
302     static_assert(is_same<decltype(test(     last,      last,         1)), void>{}, "");
303     static_assert(is_same<decltype(test(     last,      last,       1_d)), void>{}, "");
304     static_assert(is_same<decltype(test(     last,      last,       jan)), void>{}, "");
305     static_assert(is_same<decltype(test(     last,      last,       1_y)), void>{}, "");
306     static_assert(is_same<decltype(test(     last,      last,      last)), void>{}, "");
307     static_assert(is_same<decltype(test(     last,      last,    sun[1])), void>{}, "");
308     static_assert(is_same<decltype(test(     last,      last, sun[last])), void>{}, "");
309 
310     static_assert(is_same<decltype(test(     last,    sun[1],         1)), void>{}, "");
311     static_assert(is_same<decltype(test(     last,    sun[1],       1_d)), void>{}, "");
312     static_assert(is_same<decltype(test(     last,    sun[1],       jan)), void>{}, "");
313     static_assert(is_same<decltype(test(     last,    sun[1],       1_y)), void>{}, "");
314     static_assert(is_same<decltype(test(     last,    sun[1],      last)), void>{}, "");
315     static_assert(is_same<decltype(test(     last,    sun[1],    sun[1])), void>{}, "");
316     static_assert(is_same<decltype(test(     last,    sun[1], sun[last])), void>{}, "");
317 
318     static_assert(is_same<decltype(test(     last, sun[last],         1)), void>{}, "");
319     static_assert(is_same<decltype(test(     last, sun[last],       1_d)), void>{}, "");
320     static_assert(is_same<decltype(test(     last, sun[last],       jan)), void>{}, "");
321     static_assert(is_same<decltype(test(     last, sun[last],       1_y)), void>{}, "");
322     static_assert(is_same<decltype(test(     last, sun[last],      last)), void>{}, "");
323     static_assert(is_same<decltype(test(     last, sun[last],    sun[1])), void>{}, "");
324     static_assert(is_same<decltype(test(     last, sun[last], sun[last])), void>{}, "");
325 
326     static_assert(is_same<decltype(test(   sun[1],         1,         1)), year_month_weekday>{}, "");
327     static_assert(is_same<decltype(test(   sun[1],         1,       1_d)), void>{}, "");
328     static_assert(is_same<decltype(test(   sun[1],         1,       jan)), void>{}, "");
329     static_assert(is_same<decltype(test(   sun[1],         1,       1_y)), year_month_weekday>{}, "");
330     static_assert(is_same<decltype(test(   sun[1],         1,      last)), void>{}, "");
331     static_assert(is_same<decltype(test(   sun[1],         1,    sun[1])), void>{}, "");
332     static_assert(is_same<decltype(test(   sun[1],         1, sun[last])), void>{}, "");
333 
334     static_assert(is_same<decltype(test(   sun[1],       1_d,         1)), void>{}, "");
335     static_assert(is_same<decltype(test(   sun[1],       1_d,       1_d)), void>{}, "");
336     static_assert(is_same<decltype(test(   sun[1],       1_d,       jan)), void>{}, "");
337     static_assert(is_same<decltype(test(   sun[1],       1_d,       1_y)), void>{}, "");
338     static_assert(is_same<decltype(test(   sun[1],       1_d,      last)), void>{}, "");
339     static_assert(is_same<decltype(test(   sun[1],       1_d,    sun[1])), void>{}, "");
340     static_assert(is_same<decltype(test(   sun[1],       1_d, sun[last])), void>{}, "");
341 
342     static_assert(is_same<decltype(test(   sun[1],       jan,         1)), year_month_weekday>{}, "");
343     static_assert(is_same<decltype(test(   sun[1],       jan,       1_d)), void>{}, "");
344     static_assert(is_same<decltype(test(   sun[1],       jan,       jan)), void>{}, "");
345     static_assert(is_same<decltype(test(   sun[1],       jan,       1_y)), year_month_weekday>{}, "");
346     static_assert(is_same<decltype(test(   sun[1],       jan,      last)), void>{}, "");
347     static_assert(is_same<decltype(test(   sun[1],       jan,    sun[1])), void>{}, "");
348     static_assert(is_same<decltype(test(   sun[1],       jan, sun[last])), void>{}, "");
349 
350     static_assert(is_same<decltype(test(   sun[1],       1_y,         1)), void>{}, "");
351     static_assert(is_same<decltype(test(   sun[1],       1_y,       1_d)), void>{}, "");
352     static_assert(is_same<decltype(test(   sun[1],       1_y,       jan)), void>{}, "");
353     static_assert(is_same<decltype(test(   sun[1],       1_y,       1_y)), void>{}, "");
354     static_assert(is_same<decltype(test(   sun[1],       1_y,      last)), void>{}, "");
355     static_assert(is_same<decltype(test(   sun[1],       1_y,    sun[1])), void>{}, "");
356     static_assert(is_same<decltype(test(   sun[1],       1_y, sun[last])), void>{}, "");
357 
358     static_assert(is_same<decltype(test(   sun[1],      last,         1)), void>{}, "");
359     static_assert(is_same<decltype(test(   sun[1],      last,       1_d)), void>{}, "");
360     static_assert(is_same<decltype(test(   sun[1],      last,       jan)), void>{}, "");
361     static_assert(is_same<decltype(test(   sun[1],      last,       1_y)), void>{}, "");
362     static_assert(is_same<decltype(test(   sun[1],      last,      last)), void>{}, "");
363     static_assert(is_same<decltype(test(   sun[1],      last,    sun[1])), void>{}, "");
364     static_assert(is_same<decltype(test(   sun[1],      last, sun[last])), void>{}, "");
365 
366     static_assert(is_same<decltype(test(   sun[1],    sun[1],         1)), void>{}, "");
367     static_assert(is_same<decltype(test(   sun[1],    sun[1],       1_d)), void>{}, "");
368     static_assert(is_same<decltype(test(   sun[1],    sun[1],       jan)), void>{}, "");
369     static_assert(is_same<decltype(test(   sun[1],    sun[1],       1_y)), void>{}, "");
370     static_assert(is_same<decltype(test(   sun[1],    sun[1],      last)), void>{}, "");
371     static_assert(is_same<decltype(test(   sun[1],    sun[1],    sun[1])), void>{}, "");
372     static_assert(is_same<decltype(test(   sun[1],    sun[1], sun[last])), void>{}, "");
373 
374     static_assert(is_same<decltype(test(   sun[1], sun[last],         1)), void>{}, "");
375     static_assert(is_same<decltype(test(   sun[1], sun[last],       1_d)), void>{}, "");
376     static_assert(is_same<decltype(test(   sun[1], sun[last],       jan)), void>{}, "");
377     static_assert(is_same<decltype(test(   sun[1], sun[last],       1_y)), void>{}, "");
378     static_assert(is_same<decltype(test(   sun[1], sun[last],      last)), void>{}, "");
379     static_assert(is_same<decltype(test(   sun[1], sun[last],    sun[1])), void>{}, "");
380     static_assert(is_same<decltype(test(   sun[1], sun[last], sun[last])), void>{}, "");
381 
382     static_assert(is_same<decltype(test(sun[last],         1,         1)), year_month_weekday_last>{}, "");
383     static_assert(is_same<decltype(test(sun[last],         1,       1_d)), void>{}, "");
384     static_assert(is_same<decltype(test(sun[last],         1,       jan)), void>{}, "");
385     static_assert(is_same<decltype(test(sun[last],         1,       1_y)), year_month_weekday_last>{}, "");
386     static_assert(is_same<decltype(test(sun[last],         1,      last)), void>{}, "");
387     static_assert(is_same<decltype(test(sun[last],         1,    sun[1])), void>{}, "");
388     static_assert(is_same<decltype(test(sun[last],         1, sun[last])), void>{}, "");
389 
390     static_assert(is_same<decltype(test(sun[last],       1_d,         1)), void>{}, "");
391     static_assert(is_same<decltype(test(sun[last],       1_d,       1_d)), void>{}, "");
392     static_assert(is_same<decltype(test(sun[last],       1_d,       jan)), void>{}, "");
393     static_assert(is_same<decltype(test(sun[last],       1_d,       1_y)), void>{}, "");
394     static_assert(is_same<decltype(test(sun[last],       1_d,      last)), void>{}, "");
395     static_assert(is_same<decltype(test(sun[last],       1_d,    sun[1])), void>{}, "");
396     static_assert(is_same<decltype(test(sun[last],       1_d, sun[last])), void>{}, "");
397 
398     static_assert(is_same<decltype(test(sun[last],       jan,         1)), year_month_weekday_last>{}, "");
399     static_assert(is_same<decltype(test(sun[last],       jan,       1_d)), void>{}, "");
400     static_assert(is_same<decltype(test(sun[last],       jan,       jan)), void>{}, "");
401     static_assert(is_same<decltype(test(sun[last],       jan,       1_y)), year_month_weekday_last>{}, "");
402     static_assert(is_same<decltype(test(sun[last],       jan,      last)), void>{}, "");
403     static_assert(is_same<decltype(test(sun[last],       jan,    sun[1])), void>{}, "");
404     static_assert(is_same<decltype(test(sun[last],       jan, sun[last])), void>{}, "");
405 
406     static_assert(is_same<decltype(test(sun[last],       1_y,         1)), void>{}, "");
407     static_assert(is_same<decltype(test(sun[last],       1_y,       1_d)), void>{}, "");
408     static_assert(is_same<decltype(test(sun[last],       1_y,       jan)), void>{}, "");
409     static_assert(is_same<decltype(test(sun[last],       1_y,       1_y)), void>{}, "");
410     static_assert(is_same<decltype(test(sun[last],       1_y,      last)), void>{}, "");
411     static_assert(is_same<decltype(test(sun[last],       1_y,    sun[1])), void>{}, "");
412     static_assert(is_same<decltype(test(sun[last],       1_y, sun[last])), void>{}, "");
413 
414     static_assert(is_same<decltype(test(sun[last],      last,         1)), void>{}, "");
415     static_assert(is_same<decltype(test(sun[last],      last,       1_d)), void>{}, "");
416     static_assert(is_same<decltype(test(sun[last],      last,       jan)), void>{}, "");
417     static_assert(is_same<decltype(test(sun[last],      last,       1_y)), void>{}, "");
418     static_assert(is_same<decltype(test(sun[last],      last,      last)), void>{}, "");
419     static_assert(is_same<decltype(test(sun[last],      last,    sun[1])), void>{}, "");
420     static_assert(is_same<decltype(test(sun[last],      last, sun[last])), void>{}, "");
421 
422     static_assert(is_same<decltype(test(sun[last],    sun[1],         1)), void>{}, "");
423     static_assert(is_same<decltype(test(sun[last],    sun[1],       1_d)), void>{}, "");
424     static_assert(is_same<decltype(test(sun[last],    sun[1],       jan)), void>{}, "");
425     static_assert(is_same<decltype(test(sun[last],    sun[1],       1_y)), void>{}, "");
426     static_assert(is_same<decltype(test(sun[last],    sun[1],      last)), void>{}, "");
427     static_assert(is_same<decltype(test(sun[last],    sun[1],    sun[1])), void>{}, "");
428     static_assert(is_same<decltype(test(sun[last],    sun[1], sun[last])), void>{}, "");
429 
430     static_assert(is_same<decltype(test(sun[last], sun[last],         1)), void>{}, "");
431     static_assert(is_same<decltype(test(sun[last], sun[last],       1_d)), void>{}, "");
432     static_assert(is_same<decltype(test(sun[last], sun[last],       jan)), void>{}, "");
433     static_assert(is_same<decltype(test(sun[last], sun[last],       1_y)), void>{}, "");
434     static_assert(is_same<decltype(test(sun[last], sun[last],      last)), void>{}, "");
435     static_assert(is_same<decltype(test(sun[last], sun[last],    sun[1])), void>{}, "");
436     static_assert(is_same<decltype(test(sun[last], sun[last], sun[last])), void>{}, "");
437 }
438