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:
dmitrykobets-msft 2022-04-14 11:08:28 -07:00 committed by GitHub
parent 383723676c
commit 2bfd495080
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 0 deletions

View File

@ -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;
} }

View File

@ -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

View File

@ -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