Use std::nullptr_t in dynamic
authorChristopher Dykes <cdykes@fb.com>
Fri, 21 Apr 2017 18:25:39 +0000 (11:25 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Fri, 21 Apr 2017 18:42:22 +0000 (11:42 -0700)
Summary: It was changed to a `void*` previously due to an ICE in GCC 4.7. GCC 4.7 hasn't been supported in quite a while, and newer versions of GCC don't crash, so it's time to switch it back to `nullptr_t`.

Reviewed By: yfeldblum

Differential Revision: D4917389

fbshipit-source-id: fc48642026c7e3aaeadef27bb949f70648c2312c

folly/dynamic-inl.h
folly/dynamic.cpp
folly/dynamic.h

index 3c85ee4b27c351d383d232cf5adca1da6e86cce5..fe65cbbc995709e6f8f3bb590624c0c3c25cf0c5 100644 (file)
@@ -44,7 +44,7 @@ struct hash< ::folly::dynamic> {
   do {                                \
     switch ((type)) {                 \
       case NULLT:                     \
-        apply(void*);                 \
+        apply(std::nullptr_t);        \
         break;                        \
       case ARRAY:                     \
         apply(Array);                 \
@@ -419,7 +419,7 @@ inline bool dynamic::isInt() const {
   return get_nothrow<int64_t>() != nullptr;
 }
 inline bool dynamic::isNull() const {
-  return get_nothrow<void*>() != nullptr;
+  return get_nothrow<std::nullptr_t>() != nullptr;
 }
 inline bool dynamic::isNumber() const {
   return isInt() || isDouble();
@@ -484,6 +484,12 @@ struct dynamic::CompareOp<dynamic::ObjectImpl> {
     return false;
   }
 };
+template<>
+struct dynamic::CompareOp<std::nullptr_t> {
+  static bool comp(std::nullptr_t const&, std::nullptr_t const&) {
+    return true;
+  }
+};
 
 inline dynamic& dynamic::operator+=(dynamic const& o) {
   if (type() == STRING && o.type() == STRING) {
@@ -708,7 +714,7 @@ inline dynamic::dynamic(Array&& r) : type_(ARRAY) {
   }; \
   //
 
-FOLLY_DYNAMIC_DEC_TYPEINFO(void*,               "null",    dynamic::NULLT)
+FOLLY_DYNAMIC_DEC_TYPEINFO(std::nullptr_t,      "null",    dynamic::NULLT)
 FOLLY_DYNAMIC_DEC_TYPEINFO(bool,                "boolean", dynamic::BOOL)
 FOLLY_DYNAMIC_DEC_TYPEINFO(std::string,         "string",  dynamic::STRING)
 FOLLY_DYNAMIC_DEC_TYPEINFO(dynamic::Array,      "array",   dynamic::ARRAY)
@@ -758,8 +764,8 @@ T const* dynamic::getAddress() const noexcept {
 }
 
 template<class T> struct dynamic::GetAddrImpl {};
-template<> struct dynamic::GetAddrImpl<void*> {
-  static void** get(Data& d) noexcept { return &d.nul; }
+template<> struct dynamic::GetAddrImpl<std::nullptr_t> {
+  static std::nullptr_t* get(Data& d) noexcept { return &d.nul; }
 };
 template<> struct dynamic::GetAddrImpl<dynamic::Array> {
   static Array* get(Data& d) noexcept { return &d.array; }
@@ -818,11 +824,10 @@ struct dynamic::PrintImpl {
 };
 // Otherwise, null, being (void*)0, would print as 0.
 template <>
-struct dynamic::PrintImpl<void*> {
+struct dynamic::PrintImpl<std::nullptr_t> {
   static void print(dynamic const& /* d */,
                     std::ostream& out,
-                    void* const& nul) {
-    DCHECK_EQ((void*)0, nul);
+                    std::nullptr_t const&) {
     out << "null";
   }
 };
index cc1ffdea211cf590e790e4d1c22a7a722643f8d7..8ef7d08ee6e4159efc7f484dc8262c86f5d0cf09 100644 (file)
@@ -29,7 +29,7 @@ namespace folly {
   constexpr dynamic::Type dynamic::TypeInfo<T>::type; \
   //
 
-FOLLY_DYNAMIC_DEF_TYPEINFO(void*)
+FOLLY_DYNAMIC_DEF_TYPEINFO(std::nullptr_t)
 FOLLY_DYNAMIC_DEF_TYPEINFO(bool)
 FOLLY_DYNAMIC_DEF_TYPEINFO(std::string)
 FOLLY_DYNAMIC_DEF_TYPEINFO(dynamic::Array)
@@ -65,7 +65,7 @@ TypeError::~TypeError() = default;
   do {                                \
     switch ((type)) {                 \
       case NULLT:                     \
-        apply(void*);                 \
+        apply(std::nullptr_t);        \
         break;                        \
       case ARRAY:                     \
         apply(Array);                 \
index 1c9ac0e0fea563eb7c526a7898f1479434a75e1e..a62805090dd9058938830571b6112c77bf273624 100644 (file)
@@ -552,9 +552,7 @@ private:
     explicit Data() : nul(nullptr) {}
     ~Data() {}
 
-    // XXX: gcc does an ICE if we use std::nullptr_t instead of void*
-    // here.  See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50361
-    void* nul;
+    std::nullptr_t nul;
     Array array;
     bool boolean;
     double doubl;