mirror of
https://github.com/microsoft/GSL.git
synced 2025-01-18 09:44:59 -05:00
Suppress -Wfloat-equal warning in implementation of gsl::narrow (#1043)
In the implementation of gsl::narrow, there is a comparison `static_cast<U>(t) != u` which may be comparing two floats. The comparison here is done purposefully to categorize ill effects of narrowing conversion, since the values being compared *should* be the same when compared with `operator==`. Note, using #pragma GCC will suppress this warning for both GCC and Clang.
This commit is contained in:
parent
383723676c
commit
2bfd495080
@ -43,10 +43,17 @@ GSL_SUPPRESS(p.2) // NO-FORMAT: attribute // don't rely on undefined behavior
|
|||||||
// and cannot fit into the destination integral type), the resultant behavior is benign on the platforms
|
// and cannot fit into the destination integral type), the resultant behavior is benign on the platforms
|
||||||
// that we target (i.e., no hardware trap representations are hit).
|
// that we target (i.e., no hardware trap representations are hit).
|
||||||
|
|
||||||
|
#if defined(__clang__) || defined(__GNUC__)
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wfloat-equal"
|
||||||
|
#endif
|
||||||
if (static_cast<U>(t) != u || (is_different_signedness && ((t < T{}) != (u < U{}))))
|
if (static_cast<U>(t) != u || (is_different_signedness && ((t < T{}) != (u < U{}))))
|
||||||
{
|
{
|
||||||
throw narrowing_error{};
|
throw narrowing_error{};
|
||||||
}
|
}
|
||||||
|
#if defined(__clang__) || defined(__GNUC__)
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,7 @@ if(MSVC) # MSVC or simulating MSVC
|
|||||||
>
|
>
|
||||||
$<$<CXX_COMPILER_ID:Clang>:
|
$<$<CXX_COMPILER_ID:Clang>:
|
||||||
-Weverything
|
-Weverything
|
||||||
|
-Wfloat-equal
|
||||||
-Wno-c++98-compat
|
-Wno-c++98-compat
|
||||||
-Wno-c++98-compat-pedantic
|
-Wno-c++98-compat-pedantic
|
||||||
-Wno-covered-switch-default # GTest
|
-Wno-covered-switch-default # GTest
|
||||||
@ -122,6 +123,7 @@ else()
|
|||||||
-Wpedantic
|
-Wpedantic
|
||||||
-Wshadow
|
-Wshadow
|
||||||
-Wsign-conversion
|
-Wsign-conversion
|
||||||
|
-Wfloat-equal
|
||||||
-Wno-deprecated-declarations # Allow tests for [[deprecated]] elements
|
-Wno-deprecated-declarations # Allow tests for [[deprecated]] elements
|
||||||
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
|
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
|
||||||
-Weverything
|
-Weverything
|
||||||
@ -227,6 +229,7 @@ if(MSVC) # MSVC or simulating MSVC
|
|||||||
>
|
>
|
||||||
$<$<CXX_COMPILER_ID:Clang>:
|
$<$<CXX_COMPILER_ID:Clang>:
|
||||||
-Weverything
|
-Weverything
|
||||||
|
-Wfloat-equal
|
||||||
-Wno-c++98-compat
|
-Wno-c++98-compat
|
||||||
-Wno-c++98-compat-pedantic
|
-Wno-c++98-compat-pedantic
|
||||||
-Wno-missing-prototypes
|
-Wno-missing-prototypes
|
||||||
@ -250,6 +253,7 @@ else()
|
|||||||
-Wpedantic
|
-Wpedantic
|
||||||
-Wshadow
|
-Wshadow
|
||||||
-Wsign-conversion
|
-Wsign-conversion
|
||||||
|
-Wfloat-equal
|
||||||
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
|
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
|
||||||
-Weverything
|
-Weverything
|
||||||
-Wno-c++98-compat
|
-Wno-c++98-compat
|
||||||
|
@ -149,5 +149,7 @@ TEST(utils_tests, narrow)
|
|||||||
EXPECT_TRUE(
|
EXPECT_TRUE(
|
||||||
narrow<std::complex<float>>(std::complex<double>(4, 2)) == std::complex<float>(4, 2));
|
narrow<std::complex<float>>(std::complex<double>(4, 2)) == std::complex<float>(4, 2));
|
||||||
EXPECT_THROW(narrow<std::complex<float>>(std::complex<double>(4.2)), narrowing_error);
|
EXPECT_THROW(narrow<std::complex<float>>(std::complex<double>(4.2)), narrowing_error);
|
||||||
|
|
||||||
|
EXPECT_TRUE(narrow<int>(float(1)) == 1);
|
||||||
}
|
}
|
||||||
#endif // GSL_KERNEL_MODE
|
#endif // GSL_KERNEL_MODE
|
||||||
|
Loading…
Reference in New Issue
Block a user