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
if (value < 0) {
result->push_back('-');
result->append(
- buffer, uint64ToBufferUnsafe(uint64_t(-uint64_t(value)), buffer));
+ buffer,
+ uint64ToBufferUnsafe(~static_cast<uint64_t>(value) + 1, buffer));
} else {
result->append(buffer, uint64ToBufferUnsafe(uint64_t(value), buffer));
}
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 <class Tgt>
typename std::enable_if<
- !std::is_same<Tgt, bool>::value && std::is_integral<Tgt>::value,
+ !std::is_same<Tgt, bool>::value &&
+ (std::is_integral<Tgt>::value || std::is_floating_point<Tgt>::value),
Expected<Tgt, ConversionCode>>::type
convertTo(const bool& value) noexcept {
return static_cast<Tgt>(value ? 1 : 0);
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_;
}
Error&& error() && {
return std::move(error_);
}
+ FOLLY_POP_WARNING
};
template <class Value, class Error>
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_;
}
Error&& error() && {
return std::move(error_);
}
+ FOLLY_POP_WARNING
};
namespace expected_detail_ExpectedHelper {
#include <cstdint>
#include <cstring>
+#include <limits>
#include <string>
#include <tuple>
#include <type_traits>
struct hasher<bool> {
size_t operator()(bool key) const {
// Make sure that all the output bits depend on the input.
- return -static_cast<size_t>(key);
+ return key ? std::numeric_limits<size_t>::max() : 0;
}
};
#undef CAL_GREGORIAN
#endif
-// Defined in winnt.h
-#ifdef DELETE
-#undef DELETE
-#endif
-
// Defined in the GDI interface.
#ifdef ERROR
#undef ERROR