From 5af45646989df0924baa87b0c19c16f228b8ebfb Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Tue, 1 Dec 2015 15:58:26 +0000 Subject: [PATCH] Restrict noexcept on converting constructors. See https://svn.boost.org/trac/boost/ticket/11826. --- include/boost/multiprecision/float128.hpp | 4 ++-- test/test_nothrow_float128.cpp | 25 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) 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