From 08d0e994fc193cecc221f417bb94c14626f45522 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Thu, 7 Dec 2023 16:45:59 +0000 Subject: [PATCH 1/3] Disable warnings from deprecated numeric_limits members. When building with MSVC in C++23 mode. --- .../boost/multiprecision/cpp_bin_float.hpp | 14 ++++ .../boost/multiprecision/cpp_dec_float.hpp | 14 ++++ .../boost/multiprecision/cpp_int/limits.hpp | 14 ++++ include/boost/multiprecision/float128.hpp | 18 ++++- include/boost/multiprecision/gmp.hpp | 72 ++++++++++++++++--- include/boost/multiprecision/mpfi.hpp | 36 ++++++++-- include/boost/multiprecision/mpfr.hpp | 36 ++++++++-- include/boost/multiprecision/tommath.hpp | 18 ++++- 8 files changed, 202 insertions(+), 20 deletions(-) diff --git a/include/boost/multiprecision/cpp_bin_float.hpp b/include/boost/multiprecision/cpp_bin_float.hpp index 82ac4afe7..d620d3800 100644 --- a/include/boost/multiprecision/cpp_bin_float.hpp +++ b/include/boost/multiprecision/cpp_bin_float.hpp @@ -2154,7 +2154,14 @@ class numeric_limits, ExpressionTemplates> >::has_quiet_NaN; template constexpr bool numeric_limits, ExpressionTemplates> >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4996) +#endif template constexpr float_denorm_style numeric_limits, ExpressionTemplates> >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits, ExpressionTemplates> >::has_denorm_loss; template diff --git a/include/boost/multiprecision/cpp_dec_float.hpp b/include/boost/multiprecision/cpp_dec_float.hpp index 17a73559b..2cc19605a 100644 --- a/include/boost/multiprecision/cpp_dec_float.hpp +++ b/include/boost/multiprecision/cpp_dec_float.hpp @@ -3578,7 +3578,14 @@ class numeric_limits, ExpressionTemplates> >::has_quiet_NaN; template constexpr bool numeric_limits, ExpressionTemplates> >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits, ExpressionTemplates> >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits, ExpressionTemplates> >::has_denorm_loss; template diff --git a/include/boost/multiprecision/cpp_int/limits.hpp b/include/boost/multiprecision/cpp_int/limits.hpp index df80d02e7..fa29cc48b 100644 --- a/include/boost/multiprecision/cpp_int/limits.hpp +++ b/include/boost/multiprecision/cpp_int/limits.hpp @@ -200,7 +200,14 @@ class numeric_limits, ExpressionTemplates> >::has_quiet_NaN; template constexpr bool numeric_limits, ExpressionTemplates> >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4996) +#endif template constexpr float_denorm_style numeric_limits, ExpressionTemplates> >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits, ExpressionTemplates> >::has_denorm_loss; template diff --git a/include/boost/multiprecision/float128.hpp b/include/boost/multiprecision/float128.hpp index dffca9de0..da0514bff 100644 --- a/include/boost/multiprecision/float128.hpp +++ b/include/boost/multiprecision/float128.hpp @@ -835,8 +835,15 @@ class numeric_limits constexpr float_round_style numeric_limits >::round_style; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif } // namespace std diff --git a/include/boost/multiprecision/gmp.hpp b/include/boost/multiprecision/gmp.hpp index ce02a5dff..5a30e9045 100644 --- a/include/boost/multiprecision/gmp.hpp +++ b/include/boost/multiprecision/gmp.hpp @@ -3590,8 +3590,15 @@ class numeric_limits, ExpressionTemplates> >::has_quiet_NaN; template constexpr bool numeric_limits, ExpressionTemplates> >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits, ExpressionTemplates> >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits, ExpressionTemplates> >::has_denorm_loss; template @@ -3675,8 +3689,15 @@ class numeric_limits constexpr bool numeric_limits, ExpressionTemplates> >::has_quiet_NaN; template constexpr bool numeric_limits, ExpressionTemplates> >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits, ExpressionTemplates> >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits, ExpressionTemplates> >::has_denorm_loss; template @@ -3770,8 +3798,15 @@ class numeric_limits constexpr bool numeric_limits >::has_quiet_NaN; template constexpr bool numeric_limits >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits >::has_denorm_loss; template @@ -3866,8 +3908,15 @@ class numeric_limits constexpr bool numeric_limits >::has_quiet_NaN; template constexpr bool numeric_limits >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits >::has_denorm_loss; template diff --git a/include/boost/multiprecision/mpfi.hpp b/include/boost/multiprecision/mpfi.hpp index 2f7626fe1..891760c55 100644 --- a/include/boost/multiprecision/mpfi.hpp +++ b/include/boost/multiprecision/mpfi.hpp @@ -2372,8 +2372,15 @@ class numeric_limits, ExpressionTemplates> >::has_quiet_NaN; template constexpr bool numeric_limits, ExpressionTemplates> >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits, ExpressionTemplates> >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits, ExpressionTemplates> >::has_denorm_loss; template @@ -2468,8 +2482,15 @@ class numeric_limits constexpr bool numeric_limits, ExpressionTemplates> >::has_quiet_NaN; template constexpr bool numeric_limits, ExpressionTemplates> >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits, ExpressionTemplates> >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits, ExpressionTemplates> >::has_denorm_loss; template diff --git a/include/boost/multiprecision/mpfr.hpp b/include/boost/multiprecision/mpfr.hpp index a84183edc..68282d1b4 100644 --- a/include/boost/multiprecision/mpfr.hpp +++ b/include/boost/multiprecision/mpfr.hpp @@ -3416,8 +3416,15 @@ class numeric_limits, ExpressionTemplates> >::has_quiet_NaN; template constexpr bool numeric_limits, ExpressionTemplates> >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits, ExpressionTemplates> >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits, ExpressionTemplates> >::has_denorm_loss; template @@ -3535,8 +3549,15 @@ class numeric_limits constexpr bool numeric_limits, ExpressionTemplates> >::has_quiet_NaN; template constexpr bool numeric_limits, ExpressionTemplates> >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits, ExpressionTemplates> >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits, ExpressionTemplates> >::has_denorm_loss; template diff --git a/include/boost/multiprecision/tommath.hpp b/include/boost/multiprecision/tommath.hpp index 2e2530f7e..80b40393e 100644 --- a/include/boost/multiprecision/tommath.hpp +++ b/include/boost/multiprecision/tommath.hpp @@ -950,8 +950,15 @@ class numeric_limits constexpr bool numeric_limits >::has_quiet_NaN; template constexpr bool numeric_limits >::has_signaling_NaN; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif template constexpr float_denorm_style numeric_limits >::has_denorm; +#ifdef _MSC_VER +#pragma warning(pop) +#endif template constexpr bool numeric_limits >::has_denorm_loss; template From 982eb69b6e522899c33ed93444173ee1ccdc8b3f Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Thu, 7 Dec 2023 17:47:40 +0000 Subject: [PATCH 2/3] Add test case. --- test/Jamfile.v2 | 1 + test/git_issue_573.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 test/git_issue_573.cpp diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 1a6773578..5842d2120 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -1231,6 +1231,7 @@ test-suite misc : [ run git_issue_509.cpp : : : [ requires cpp_lib_bit_cast ] ] [ run git_issue_526.cpp ] [ run git_issue_540.cpp ] + [ run git_issue_573.cpp : : : msvc:-sdl msvc:latest ] [ compile git_issue_98.cpp : [ check-target-builds ../config//has_float128 : TEST_FLOAT128 quadmath : ] [ check-target-builds ../config//has_gmp : TEST_GMP gmp : ] diff --git a/test/git_issue_573.cpp b/test/git_issue_573.cpp new file mode 100644 index 000000000..fcb2e6cf9 --- /dev/null +++ b/test/git_issue_573.cpp @@ -0,0 +1,32 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2023 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// In C++23 and later std::numeric_limits<>::has_denorm along with type +// float_denorm_style are deprecated, and MSVC generates either a C4996 +// warning, or when building with /cdl (the recomended default for the IDE) +// a hard error. It is sufficient to include our headers to reproduce the +// issue, unless all uses of float_denorm_style are guarded by #pragma warning(disable : 4996) +// +// Note that other compilers may follow suite in due course, and in time float_denorm_style +// will be removed completely. For now though we DO need to provide numeric_limits<>::has_denorm +// in our specializations, as it's only deprecated, not removed as of C++23. +// +// See https://github.com/boostorg/multiprecision/issues/573 + +#include +#include +#include +#include + +int main() +{ + boost::multiprecision::cpp_dec_float_50 f1(2); + std::cout << tgamma(f1) << std::endl; + boost::multiprecision::cpp_bin_float_50 f2(2); + std::cout << tgamma(f2) << std::endl; + boost::multiprecision::cpp_int i = 2; + std::cout << i * i << std::endl; +} + From 2440fb23cf9a270b9d77abc77d0c2bab10ed9022 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Fri, 8 Dec 2023 09:01:04 +0000 Subject: [PATCH 3/3] We don't need latest in the Jamfile, it gets tested anyway. --- test/Jamfile.v2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 5842d2120..a05a3aee5 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -1231,7 +1231,7 @@ test-suite misc : [ run git_issue_509.cpp : : : [ requires cpp_lib_bit_cast ] ] [ run git_issue_526.cpp ] [ run git_issue_540.cpp ] - [ run git_issue_573.cpp : : : msvc:-sdl msvc:latest ] + [ run git_issue_573.cpp : : : msvc:-sdl ] [ compile git_issue_98.cpp : [ check-target-builds ../config//has_float128 : TEST_FLOAT128 quadmath : ] [ check-target-builds ../config//has_gmp : TEST_GMP gmp : ]