17738db2cSMark de Wever //===----------------------------------------------------------------------===//
27738db2cSMark de Wever //
37738db2cSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47738db2cSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
57738db2cSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67738db2cSMark de Wever //
77738db2cSMark de Wever //===----------------------------------------------------------------------===//
87738db2cSMark de Wever
97738db2cSMark de Wever // <chrono>
107738db2cSMark de Wever
117738db2cSMark de Wever // duration
127738db2cSMark de Wever
137738db2cSMark de Wever // template <class Rep1, class Period, class Rep2>
147738db2cSMark de Wever // constexpr
157738db2cSMark de Wever // duration<typename common_type<Rep1, Rep2>::type, Period>
167738db2cSMark de Wever // operator*(const duration<Rep1, Period>& d, const Rep2& s);
177738db2cSMark de Wever
187738db2cSMark de Wever // template <class Rep1, class Period, class Rep2>
197738db2cSMark de Wever // constexpr
207738db2cSMark de Wever // duration<typename common_type<Rep1, Rep2>::type, Period>
217738db2cSMark de Wever // operator*(const Rep1& s, const duration<Rep2, Period>& d);
227738db2cSMark de Wever
237738db2cSMark de Wever #include <chrono>
247738db2cSMark de Wever #include <cassert>
257738db2cSMark de Wever
267738db2cSMark de Wever #include "test_macros.h"
277738db2cSMark de Wever #include "../../rep.h"
287738db2cSMark de Wever
main(int,char **)29*7d9540eaSMark de Wever int main(int, char**) {
307738db2cSMark de Wever {
317738db2cSMark de Wever std::chrono::nanoseconds ns(3);
327738db2cSMark de Wever ns = ns * 5;
337738db2cSMark de Wever assert(ns.count() == 15);
347738db2cSMark de Wever ns = 6 * ns;
357738db2cSMark de Wever assert(ns.count() == 90);
367738db2cSMark de Wever }
377738db2cSMark de Wever
387738db2cSMark de Wever #if TEST_STD_VER >= 11
397738db2cSMark de Wever {
407738db2cSMark de Wever constexpr std::chrono::nanoseconds ns(3);
417738db2cSMark de Wever constexpr std::chrono::nanoseconds ns2 = ns * 5;
427738db2cSMark de Wever static_assert(ns2.count() == 15, "");
437738db2cSMark de Wever constexpr std::chrono::nanoseconds ns3 = 6 * ns;
447738db2cSMark de Wever static_assert(ns3.count() == 18, "");
457738db2cSMark de Wever }
467738db2cSMark de Wever #endif
477738db2cSMark de Wever
487738db2cSMark de Wever #if TEST_STD_VER >= 11
497738db2cSMark de Wever { // This is related to PR#41130
507738db2cSMark de Wever typedef std::chrono::nanoseconds Duration;
517738db2cSMark de Wever Duration d(5);
527738db2cSMark de Wever NotARep n;
537738db2cSMark de Wever ASSERT_SAME_TYPE(Duration, decltype(d * n));
547738db2cSMark de Wever ASSERT_SAME_TYPE(Duration, decltype(n * d));
557738db2cSMark de Wever d = d * n;
567738db2cSMark de Wever assert(d.count() == 5);
577738db2cSMark de Wever d = n * d;
587738db2cSMark de Wever assert(d.count() == 5);
597738db2cSMark de Wever }
60*7d9540eaSMark de Wever {
61*7d9540eaSMark de Wever std::chrono::duration<int> d(8);
62*7d9540eaSMark de Wever RepConstConvertibleLWG3050 x;
63*7d9540eaSMark de Wever
64*7d9540eaSMark de Wever {
65*7d9540eaSMark de Wever auto r = d * x;
66*7d9540eaSMark de Wever assert(r.count() == 16);
67*7d9540eaSMark de Wever ASSERT_SAME_TYPE(std::chrono::duration<long>, decltype(r));
68*7d9540eaSMark de Wever }
69*7d9540eaSMark de Wever {
70*7d9540eaSMark de Wever auto r = x * d;
71*7d9540eaSMark de Wever assert(r.count() == 16);
72*7d9540eaSMark de Wever ASSERT_SAME_TYPE(std::chrono::duration<long>, decltype(r));
73*7d9540eaSMark de Wever }
74*7d9540eaSMark de Wever }
75*7d9540eaSMark de Wever #endif // TEST_STD_VER >= 11
767738db2cSMark de Wever
777738db2cSMark de Wever return 0;
787738db2cSMark de Wever }
79