From b5e4bc034ee27308714f9fd7b3f1a6d5c75ac2bf Mon Sep 17 00:00:00 2001 From: Andrew Krieger Date: Fri, 14 Apr 2017 14:36:30 -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. - Use more careful bit twiddling instead of negating unsigned types - Enable a simpler overload for bool->float conversion than one which attempts float->bool. - Delete one unneeded undef. Reviewed By: yfeldblum Differential Revision: D4891583 fbshipit-source-id: 4d2efda1fe720abcb083bf29b578c065127cda24 --- folly/Conv.h | 8 +++++--- folly/Expected.h | 12 ++++++++++++ folly/Hash.h | 3 ++- folly/portability/Windows.h | 5 ----- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/folly/Conv.h b/folly/Conv.h index 20cf3d51..25cb26eb 100644 --- a/folly/Conv.h +++ b/folly/Conv.h @@ -558,7 +558,8 @@ toAppend(Src value, Tgt * result) { if (value < 0) { result->push_back('-'); result->append( - buffer, uint64ToBufferUnsafe(uint64_t(-uint64_t(value)), buffer)); + buffer, + uint64ToBufferUnsafe(~static_cast(value) + 1, buffer)); } else { result->append(buffer, uint64ToBufferUnsafe(uint64_t(value), buffer)); } @@ -1179,13 +1180,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..e64633d2 100644 --- a/folly/Hash.h +++ b/folly/Hash.h @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -365,7 +366,7 @@ template <> struct hasher { size_t operator()(bool key) const { // Make sure that all the output bits depend on the input. - return -static_cast(key); + return key ? std::numeric_limits::max() : 0; } }; 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