Extension: Mark the default constructor of chrono::duration as conditionally noexcept
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@372539 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/chrono b/include/chrono
index 0e4cf9a..a3d1e1a 100644
--- a/include/chrono
+++ b/include/chrono
@@ -1063,7 +1063,7 @@
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
#ifndef _LIBCPP_CXX03_LANG
- duration() = default;
+ duration() noexcept(noexcept(_Rep())) = default;
#else
duration() {}
#endif
diff --git a/test/libcxx/utilities/time/date.time/duration.noexcept.pass.cpp b/test/libcxx/utilities/time/date.time/duration.noexcept.pass.cpp
new file mode 100644
index 0000000..b9d443f
--- /dev/null
+++ b/test/libcxx/utilities/time/date.time/duration.noexcept.pass.cpp
@@ -0,0 +1,47 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+// Libc++ adds noexcept to the default constructor to std::chrono::duration
+// when the underlying type is noexcept default constructible. This makes all
+// the standard durations noexcept default constructible.
+
+// typedef duration<long long, nano> nanoseconds;
+// typedef duration<long long, micro> microseconds;
+// typedef duration<long long, milli> milliseconds;
+// typedef duration<long long > seconds;
+// typedef duration< long, ratio< 60> > minutes;
+// typedef duration< long, ratio<3600> > hours;
+//
+// #if _LIBCPP_STD_VER > 17
+// typedef duration< int, ratio_multiply<ratio<24>, hours::period>> days;
+// typedef duration< int, ratio_multiply<ratio<7>, days::period>> weeks;
+// typedef duration< int, ratio_multiply<ratio<146097, 400>, days::period>> years;
+// typedef duration< int, ratio_divide<years::period, ratio<12>>> months;
+// #endif
+
+#include <chrono>
+
+#include "test_macros.h"
+
+int main(int, char**) {
+
+ ASSERT_NOEXCEPT(std::chrono::nanoseconds());
+ ASSERT_NOEXCEPT(std::chrono::microseconds());
+ ASSERT_NOEXCEPT(std::chrono::milliseconds());
+ ASSERT_NOEXCEPT(std::chrono::seconds());
+ ASSERT_NOEXCEPT(std::chrono::minutes());
+ ASSERT_NOEXCEPT(std::chrono::hours());
+
+#if TEST_STD_VER > 17
+ ASSERT_NOEXCEPT(std::chrono::days());
+ ASSERT_NOEXCEPT(std::chrono::weeks());
+ ASSERT_NOEXCEPT(std::chrono::years());
+ ASSERT_NOEXCEPT(std::chrono::months());
+#endif
+
+ return 0;
+}