Extension: Mark the default constructor of chrono::duration as conditionally noexcept

llvm-svn: 372539
This commit is contained in:
Marshall Clow 2019-09-23 04:16:48 +00:00
parent 457226e02a
commit d8ac51ab8f
2 changed files with 48 additions and 1 deletions

View File

@ -1063,7 +1063,7 @@ public:
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
#ifndef _LIBCPP_CXX03_LANG
duration() = default;
duration() noexcept(noexcept(_Rep())) = default;
#else
duration() {}
#endif

View File

@ -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;
}