diff --git a/include/boost/multiprecision/float128.hpp b/include/boost/multiprecision/float128.hpp index cd70fa00..43416723 100644 --- a/include/boost/multiprecision/float128.hpp +++ b/include/boost/multiprecision/float128.hpp @@ -144,10 +144,10 @@ public: return *this; } template - BOOST_CONSTEXPR float128_backend(const T& i, const typename enable_if_c::value>::type* = 0) BOOST_NOEXCEPT + BOOST_CONSTEXPR float128_backend(const T& i, const typename enable_if_c::value>::type* = 0) BOOST_NOEXCEPT_IF(noexcept(std::declval() = std::declval())) : m_value(i) {} template - typename enable_if_c::value || is_convertible::value, float128_backend&>::type operator = (const T& i) BOOST_NOEXCEPT + typename enable_if_c::value || is_convertible::value, float128_backend&>::type operator = (const T& i) BOOST_NOEXCEPT_IF(noexcept(std::declval() = std::declval())) { m_value = i; return *this; diff --git a/test/test_nothrow_float128.cpp b/test/test_nothrow_float128.cpp index c41678e3..6b377f55 100644 --- a/test/test_nothrow_float128.cpp +++ b/test/test_nothrow_float128.cpp @@ -48,6 +48,31 @@ BOOST_STATIC_ASSERT(boost::has_nothrow_copy::va BOOST_STATIC_ASSERT(boost::has_nothrow_assign::value); #endif +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128())); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval()))); +BOOST_STATIC_ASSERT(noexcept(std::declval() = std::declval())); +BOOST_STATIC_ASSERT(noexcept(std::declval() = std::declval())); +BOOST_STATIC_ASSERT(noexcept(std::declval() = std::declval())); +BOOST_STATIC_ASSERT(noexcept(std::declval() = std::declval())); +BOOST_STATIC_ASSERT(noexcept(std::declval() = std::declval())); +BOOST_STATIC_ASSERT(noexcept(std::declval() = std::declval())); + +struct any_convert +{ + template + operator T ()const; // Can throw! +}; + +BOOST_STATIC_ASSERT(!noexcept(boost::multiprecision::float128(std::declval()))); +BOOST_STATIC_ASSERT(!noexcept(boost::multiprecision::float128(std::declval()))); +BOOST_STATIC_ASSERT(!noexcept(std::declval() = std::declval())); +BOOST_STATIC_ASSERT(!noexcept(std::declval() = std::declval())); + #endif // noexcept