From a110f8daa0ad5cca47c5be85cb415d0cd3bd3f57 Mon Sep 17 00:00:00 2001 From: Andrew Krieger Date: Fri, 14 Apr 2017 00:06:53 -0700 Subject: [PATCH] Suppress more warnings for MSVC Summary: Several other warnings that aren't reasonable to disable globally occur in folly headers. - Wrap the unreachable code warnings in MSVC specific disable blocks to prevent problems for users. - Cast to signed types to perform integral negation before casting back to unsigned for bit operations. - Enable a simpler overload for bool->float conversion than one which attempts float->bool. - Delete one unneeded undef. (Note: this ignores all push blocking failures!) Reviewed By: yfeldblum Differential Revision: D4805628 fbshipit-source-id: 9574ea984e1e3daca01101259687f46effcf3a9f --- folly/Conv.h | 10 +++++++--- folly/Expected.h | 12 ++++++++++++ folly/Hash.h | 3 ++- folly/portability/Windows.h | 5 ----- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/folly/Conv.h b/folly/Conv.h index 20cf3d51..17b2fc67 100644 --- a/folly/Conv.h +++ b/folly/Conv.h @@ -557,8 +557,11 @@ toAppend(Src value, Tgt * result) { char buffer[20]; if (value < 0) { result->push_back('-'); + using u = std::make_signed::type; result->append( - buffer, uint64ToBufferUnsafe(uint64_t(-uint64_t(value)), buffer)); + buffer, + uint64ToBufferUnsafe( + static_cast(-static_cast(value)), buffer)); } else { result->append(buffer, uint64ToBufferUnsafe(uint64_t(value), buffer)); } @@ -1179,13 +1182,14 @@ parseTo(StringPiece src, Tgt& out) { namespace detail { /** - * Bool to integral doesn't need any special checks, and this + * Bool to integral/float doesn't need any special checks, and this * overload means we aren't trying to see if a bool is less than * an integer. */ template typename std::enable_if< - !std::is_same::value && std::is_integral::value, + !std::is_same::value && + (std::is_integral::value || std::is_floating_point::value), Expected>::type convertTo(const bool& value) noexcept { return static_cast(value ? 1 : 0); diff --git a/folly/Expected.h b/folly/Expected.h index ee765cc9..2b791c11 100644 --- a/folly/Expected.h +++ b/folly/Expected.h @@ -233,6 +233,11 @@ struct ExpectedStorage { Value&& value() && { return std::move(value_); } + // TODO (t17322426): remove when VS2015 support is deprecated + // VS2015 static analyzer incorrectly flags these as unreachable in certain + // circumstances. VS2017 does not have this problem on the same code. + FOLLY_PUSH_WARNING + FOLLY_MSVC_DISABLE_WARNING(4702) // unreachable code Error& error() & { return error_; } @@ -242,6 +247,7 @@ struct ExpectedStorage { Error&& error() && { return std::move(error_); } + FOLLY_POP_WARNING }; template @@ -527,6 +533,11 @@ struct ExpectedStorage { Value&& value() && { return std::move(value_); } + // TODO (t17322426): remove when VS2015 support is deprecated + // VS2015 static analyzer incorrectly flags these as unreachable in certain + // circumstances. VS2017 does not have this problem on the same code. + FOLLY_PUSH_WARNING + FOLLY_MSVC_DISABLE_WARNING(4702) // unreachable code Error& error() & { return error_; } @@ -536,6 +547,7 @@ struct ExpectedStorage { Error&& error() && { return std::move(error_); } + FOLLY_POP_WARNING }; namespace expected_detail_ExpectedHelper { diff --git a/folly/Hash.h b/folly/Hash.h index 0f0afc5b..314a98d0 100644 --- a/folly/Hash.h +++ b/folly/Hash.h @@ -365,7 +365,8 @@ template <> struct hasher { size_t operator()(bool key) const { // Make sure that all the output bits depend on the input. - return -static_cast(key); + using u = std::make_signed::type; + return static_cast(-static_cast(key)); } }; diff --git a/folly/portability/Windows.h b/folly/portability/Windows.h index f10c428a..2cb0bda8 100755 --- a/folly/portability/Windows.h +++ b/folly/portability/Windows.h @@ -44,11 +44,6 @@ #undef CAL_GREGORIAN #endif -// Defined in winnt.h -#ifdef DELETE -#undef DELETE -#endif - // Defined in the GDI interface. #ifdef ERROR #undef ERROR -- 2.34.1