From e49b30d926db8d58d571bc6f5e9bb0c760334cdd Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Sun, 29 Sep 2024 14:45:20 +0800 Subject: [PATCH 1/3] Locally disable `-Wnan-infinity-disabled` for Clang --- stl/inc/limits | 18 ++++++++++++++++++ .../env.lst | 10 +++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/stl/inc/limits b/stl/inc/limits index 3605b11e4fd..caa77ec9538 100644 --- a/stl/inc/limits +++ b/stl/inc/limits @@ -848,6 +848,15 @@ public: static constexpr int digits10 = 19; }; +#ifdef __clang__ +#define _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED \ + _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wnan-infinity-disabled\"") +#define _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED _Pragma("clang diagnostic pop") +#else // ^^^ defined(__clang__) / !defined(__clang__) vvv +#define _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED +#define _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED +#endif // ^^^ !defined(__clang__) ^^^ + template <> class numeric_limits : public _Num_float_base { public: @@ -875,6 +884,7 @@ public: return FLT_TRUE_MIN; } + _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED _NODISCARD static constexpr float infinity() noexcept { return __builtin_huge_valf(); } @@ -886,6 +896,7 @@ public: _NODISCARD static constexpr float signaling_NaN() noexcept { return __builtin_nansf("1"); } + _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED static constexpr int digits = FLT_MANT_DIG; static constexpr int digits10 = FLT_DIG; @@ -923,6 +934,7 @@ public: return DBL_TRUE_MIN; } + _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED _NODISCARD static constexpr double infinity() noexcept { return __builtin_huge_val(); } @@ -934,6 +946,7 @@ public: _NODISCARD static constexpr double signaling_NaN() noexcept { return __builtin_nans("1"); } + _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED static constexpr int digits = DBL_MANT_DIG; static constexpr int digits10 = DBL_DIG; @@ -971,6 +984,7 @@ public: return LDBL_TRUE_MIN; } + _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED _NODISCARD static constexpr long double infinity() noexcept { return __builtin_huge_val(); } @@ -982,6 +996,7 @@ public: _NODISCARD static constexpr long double signaling_NaN() noexcept { return __builtin_nans("1"); } + _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED static constexpr int digits = LDBL_MANT_DIG; static constexpr int digits10 = LDBL_DIG; @@ -992,6 +1007,9 @@ public: static constexpr int min_exponent10 = LDBL_MIN_10_EXP; }; +#undef _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED +#undef _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED + _STD_END #pragma pop_macro("new") _STL_RESTORE_CLANG_WARNINGS diff --git a/tests/std/tests/VSO_0000000_vector_algorithms_floats/env.lst b/tests/std/tests/VSO_0000000_vector_algorithms_floats/env.lst index 5881d21c86a..00b11163539 100644 --- a/tests/std/tests/VSO_0000000_vector_algorithms_floats/env.lst +++ b/tests/std/tests/VSO_0000000_vector_algorithms_floats/env.lst @@ -42,12 +42,12 @@ PM_CL="/BE /c /EHsc /MD /std:c++14 /w14640 /Zc:threadSafeInit-" PM_CL="/BE /c /EHsc /MDd /std:c++17 /permissive- /w14640 /Zc:threadSafeInit-" PM_CL="/BE /c /EHsc /MT /std:c++20 /permissive- /w14640 /Zc:threadSafeInit-" PM_CL="/BE /c /EHsc /MTd /std:c++latest /permissive- /w14640 /Zc:threadSafeInit-" -PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call -Wno-nan-infinity-disabled /EHsc /MD /std:c++14 /w14640 /Zc:threadSafeInit- --start-no-unused-arguments" -PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call -Wno-nan-infinity-disabled /EHsc /MDd /std:c++17 /w14640 /Zc:threadSafeInit- --start-no-unused-arguments" -PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call -Wno-nan-infinity-disabled /EHsc /MT /std:c++20 /permissive- /w14640 /Zc:threadSafeInit- --start-no-unused-arguments" -PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call -Wno-nan-infinity-disabled /EHsc /MTd /std:c++latest /permissive- /w14640 /Zc:threadSafeInit- --start-no-unused-arguments" +PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MD /std:c++14 /w14640 /Zc:threadSafeInit- --start-no-unused-arguments" +PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MDd /std:c++17 /w14640 /Zc:threadSafeInit- --start-no-unused-arguments" +PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MT /std:c++20 /permissive- /w14640 /Zc:threadSafeInit- --start-no-unused-arguments" +PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MTd /std:c++latest /permissive- /w14640 /Zc:threadSafeInit- --start-no-unused-arguments" # TRANSITION, GH-3568 -# PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call -Wno-nan-infinity-disabled /EHsc /MT /std:c++latest /permissive- /w14640 /Zc:threadSafeInit- -fsanitize=undefined -fno-sanitize-recover=undefined --start-no-unused-arguments" +# PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MT /std:c++latest /permissive- /w14640 /Zc:threadSafeInit- -fsanitize=undefined -fno-sanitize-recover=undefined --start-no-unused-arguments" RUNALL_CROSSLIST * PM_CL="/fp:strict" * PM_CL="/fp:precise" From fe8834647a8e66a9030681e44f8cc6af70e0ee12 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Sun, 29 Sep 2024 15:26:56 +0800 Subject: [PATCH 2/3] Also do this in `` --- stl/inc/cmath | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/stl/inc/cmath b/stl/inc/cmath index 885819380b9..a00cf35d3e9 100644 --- a/stl/inc/cmath +++ b/stl/inc/cmath @@ -669,9 +669,15 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo _CLANG_BUILTIN2_ARG(NAME, double) \ _CLANG_BUILTIN2_ARG(NAME, long double) +#define _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED \ + _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wnan-infinity-disabled\"") +#define _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED _Pragma("clang diagnostic pop") + +_STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED _CLANG_BUILTIN1(isfinite) _CLANG_BUILTIN1(isinf) _CLANG_BUILTIN1(isnan) +_STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED _CLANG_BUILTIN1(isnormal) _CLANG_BUILTIN2(isgreater) @@ -679,14 +685,21 @@ _CLANG_BUILTIN2(isgreaterequal) _CLANG_BUILTIN2(isless) _CLANG_BUILTIN2(islessequal) _CLANG_BUILTIN2(islessgreater) +_STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED _CLANG_BUILTIN2(isunordered) +_STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED _CLANG_BUILTIN2_TEMPLATED(isgreater) _CLANG_BUILTIN2_TEMPLATED(isgreaterequal) _CLANG_BUILTIN2_TEMPLATED(isless) _CLANG_BUILTIN2_TEMPLATED(islessequal) _CLANG_BUILTIN2_TEMPLATED(islessgreater) +_STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED _CLANG_BUILTIN2_TEMPLATED(isunordered) +_STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED + +#undef _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED +#undef _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED #undef _CLANG_BUILTIN1_ARG #undef _CLANG_BUILTIN2_ARG From 2b1eea69de6f175c3dd98dc9e0ae790b376def26 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 30 Sep 2024 16:03:07 -0700 Subject: [PATCH 3/3] Extract macros to yvals_core.h, record warnings in comments. --- stl/inc/cmath | 7 ------- stl/inc/limits | 12 ------------ stl/inc/yvals_core.h | 24 ++++++++++++++++++++++++ 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/stl/inc/cmath b/stl/inc/cmath index a00cf35d3e9..8b6b938ff66 100644 --- a/stl/inc/cmath +++ b/stl/inc/cmath @@ -669,10 +669,6 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo _CLANG_BUILTIN2_ARG(NAME, double) \ _CLANG_BUILTIN2_ARG(NAME, long double) -#define _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED \ - _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wnan-infinity-disabled\"") -#define _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED _Pragma("clang diagnostic pop") - _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED _CLANG_BUILTIN1(isfinite) _CLANG_BUILTIN1(isinf) @@ -698,9 +694,6 @@ _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED _CLANG_BUILTIN2_TEMPLATED(isunordered) _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED -#undef _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED -#undef _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED - #undef _CLANG_BUILTIN1_ARG #undef _CLANG_BUILTIN2_ARG #undef _CLANG_BUILTIN1 diff --git a/stl/inc/limits b/stl/inc/limits index caa77ec9538..ad6f5f1a013 100644 --- a/stl/inc/limits +++ b/stl/inc/limits @@ -848,15 +848,6 @@ public: static constexpr int digits10 = 19; }; -#ifdef __clang__ -#define _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED \ - _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wnan-infinity-disabled\"") -#define _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED _Pragma("clang diagnostic pop") -#else // ^^^ defined(__clang__) / !defined(__clang__) vvv -#define _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED -#define _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED -#endif // ^^^ !defined(__clang__) ^^^ - template <> class numeric_limits : public _Num_float_base { public: @@ -1007,9 +998,6 @@ public: static constexpr int min_exponent10 = LDBL_MIN_10_EXP; }; -#undef _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED -#undef _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED - _STD_END #pragma pop_macro("new") _STL_RESTORE_CLANG_WARNINGS diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 12f16f58c1c..111348fe6a3 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -859,6 +859,30 @@ #endif // ^^^ !defined(__clang__) ^^^ #endif // !defined(_STL_RESTORE_CLANG_WARNINGS) +// warning: use of NaN is undefined behavior due to the currently enabled +// floating-point options [-Wnan-infinity-disabled] +// warning: use of infinity is undefined behavior due to the currently enabled +// floating-point options [-Wnan-infinity-disabled] +#ifndef _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED +#ifdef __clang__ +// clang-format off +#define _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wnan-infinity-disabled\"") +// clang-format on +#else // ^^^ defined(__clang__) / !defined(__clang__) vvv +#define _STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED +#endif // ^^^ !defined(__clang__) ^^^ +#endif // !defined(_STL_DISABLE_CLANG_WARNING_NAN_INF_DISABLED) + +#ifndef _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED +#ifdef __clang__ +#define _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED _Pragma("clang diagnostic pop") +#else // ^^^ defined(__clang__) / !defined(__clang__) vvv +#define _STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED +#endif // ^^^ !defined(__clang__) ^^^ +#endif // !defined(_STL_RESTORE_CLANG_WARNING_NAN_INF_DISABLED) + // clang-format off #ifndef _STL_DISABLE_DEPRECATED_WARNING #ifdef __clang__