Allow building with -Wshift-sign-overflow
authorChristopher Dykes <cdykes@fb.com>
Mon, 12 Dec 2016 23:15:27 +0000 (15:15 -0800)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Mon, 12 Dec 2016 23:17:55 +0000 (15:17 -0800)
Summary: Prior to C++14 these shifts are undefined behavior, but the unsigned version is not, so do the shifts on unsigned values before converting to the final type.

Reviewed By: yfeldblum

Differential Revision: D4309311

fbshipit-source-id: 914b207bac2f77a96c07a8a5df81980c672aa677

folly/test/JsonTest.cpp
folly/test/SmallLocksTest.cpp

index 805cb3004ffa56a4855f20a38fb181658ffbe4bd..bd11be75c38ded03367f517e98d8722cdf1ccd9a 100644 (file)
@@ -154,14 +154,14 @@ TEST(Json, BoolConversion) {
 }
 
 TEST(Json, JavascriptSafe) {
-  auto badDouble = (1ll << 63ll) + 1;
+  auto badDouble = int64_t((1ULL << 63ULL) + 1);
   dynamic badDyn = badDouble;
   EXPECT_EQ(folly::toJson(badDouble), folly::to<std::string>(badDouble));
   folly::json::serialization_opts opts;
   opts.javascript_safe = true;
   EXPECT_ANY_THROW(folly::json::serialize(badDouble, opts));
 
-  auto okDouble = 1ll << 63ll;
+  auto okDouble = int64_t(1ULL << 63ULL);
   dynamic okDyn = okDouble;
   EXPECT_EQ(folly::toJson(okDouble), folly::to<std::string>(okDouble));
 }
index 5bb9ddb59a06bb54c7d9b5f5a8c655da582b5c01..0c24664b905af2e273b123b7e009751c0329b6f6 100644 (file)
@@ -91,7 +91,8 @@ template<class T> struct PslTest {
   PslTest() { lock.init(); }
 
   void doTest() {
-    T ourVal = rand() % (T(1) << (sizeof(T) * 8 - 1));
+    using UT = typename std::make_unsigned<T>::type;
+    T ourVal = rand() % T(UT(1) << (sizeof(UT) * 8 - 1));
     for (int i = 0; i < 10000; ++i) {
       std::lock_guard<PicoSpinLock<T>> guard(lock);
       lock.setData(ourVal);