diff --git a/stl/inc/cmath b/stl/inc/cmath index 885819380b9..8b6b938ff66 100644 --- a/stl/inc/cmath +++ b/stl/inc/cmath @@ -669,9 +669,11 @@ _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) +_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 +681,18 @@ _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 _CLANG_BUILTIN1_ARG #undef _CLANG_BUILTIN2_ARG diff --git a/stl/inc/limits b/stl/inc/limits index 3605b11e4fd..ad6f5f1a013 100644 --- a/stl/inc/limits +++ b/stl/inc/limits @@ -875,6 +875,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 +887,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 +925,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 +937,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 +975,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 +987,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; 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__ 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"