From c31d639e15ceb2a1fab05f1318f886df7c18bbcb Mon Sep 17 00:00:00 2001
From: Marc Horowitz <mhorowitz@fb.com>
Date: Tue, 18 Apr 2017 15:21:35 -0700
Subject: [PATCH] Fail on implicit convert from BOOL on ObjC in folly::dynamic

Summary: On some platforms (iPhone 5C at least), ObjC/Objc++ BOOL is really signed char.  There is code which expects this to be a boolean when converted to dynamic (and then to JSON and into JS), but the old code treated it as a number.  This makes such code (like [mobileConfig getBool:]) fail to compile, so the developer needs to resolve the ambiguity one way or the other.

Reviewed By: yfeldblum

Differential Revision: D4648133

fbshipit-source-id: 76ece7803a1e966dca08bdb857af7990035544a0
---
 folly/Portability.h | 6 ++++++
 folly/dynamic-inl.h | 3 +++
 2 files changed, 9 insertions(+)

diff --git a/folly/Portability.h b/folly/Portability.h
index 1792abf5..51032fda 100644
--- a/folly/Portability.h
+++ b/folly/Portability.h
@@ -331,6 +331,12 @@ using namespace FOLLY_GFLAGS_NAMESPACE;
 
 namespace folly {
 
+#if __OBJC__
+constexpr auto kIsObjC = true;
+#else
+constexpr auto kIsObjC = false;
+#endif
+
 #if defined(__linux__) && !FOLLY_MOBILE
 constexpr auto kIsLinux = true;
 #else
diff --git a/folly/dynamic-inl.h b/folly/dynamic-inl.h
index dbe36b5d..3c85ee4b 100644
--- a/folly/dynamic-inl.h
+++ b/folly/dynamic-inl.h
@@ -310,6 +310,9 @@ inline dynamic::~dynamic() noexcept { destroy(); }
 template <class T>
 struct dynamic::NumericTypeHelper<
     T, typename std::enable_if<std::is_integral<T>::value>::type> {
+  static_assert(
+      !kIsObjC || sizeof(T) > sizeof(char),
+      "char-sized types are ambiguous in objc; cast to bool or wider type");
   using type = int64_t;
 };
 template <>
-- 
2.34.1