/////////////////////////////////////////////////////////////// // Copyright 2024 John Maddock. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt #include #include #include "test.hpp" template void test_neg_divide_by_zero(std::true_type const&) { T val = -42; BOOST_CHECK_THROW(static_cast(val % 0), std::overflow_error); BOOST_CHECK_THROW(static_cast(val % static_cast(0)), std::overflow_error); BOOST_CHECK_THROW(static_cast(val % static_cast(0)), std::overflow_error); BOOST_CHECK_THROW(static_cast(val % static_cast(0)), std::overflow_error); } template void test_neg_divide_by_zero(std::false_type const&) { } template void test_divide_by_zero() { T val = 42; BOOST_CHECK_THROW(static_cast(val % 0), std::overflow_error); BOOST_CHECK_THROW(static_cast(val % static_cast(0)), std::overflow_error); BOOST_CHECK_THROW(static_cast(val % static_cast(0)), std::overflow_error); BOOST_CHECK_THROW(static_cast(val % static_cast(0)), std::overflow_error); BOOST_IF_CONSTEXPR((std::numeric_limits::digits < 500) && std::numeric_limits::digits) { val <<= std::numeric_limits::digits - 10; } else val <<= 500; BOOST_CHECK_THROW(static_cast(val % 0), std::overflow_error); BOOST_CHECK_THROW(static_cast(val % static_cast(0)), std::overflow_error); BOOST_CHECK_THROW(static_cast(val % static_cast(0)), std::overflow_error); BOOST_CHECK_THROW(static_cast(val % static_cast(0)), std::overflow_error); using tag_type = std::integral_constant::is_signed>; test_neg_divide_by_zero(tag_type()); } int main() { using int64_t = boost::multiprecision::number>; using uint64_t = boost::multiprecision::number>; using checked_int64_t = boost::multiprecision::number>; using checked_uint64_t = boost::multiprecision::number>; test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); test_divide_by_zero(); return boost::report_errors(); }