Fix FBString with MSVC
[folly.git] / folly / FBString.h
index c10490abeecfe4ce67953a7066516c7783dde2f6..0ff4ba9e6a05bd4a3895973f641507477a93ccb7 100644 (file)
@@ -56,6 +56,7 @@
 #include <folly/Hash.h>
 #include <folly/Malloc.h>
 #include <folly/Traits.h>
+#include <folly/portability/BitsFunctexcept.h>
 
 #if FOLLY_HAVE_DEPRECATED_ASSOC
 #ifdef _GLIBCXX_SYMVER
 #define FBSTRING_UNLIKELY(x) (x)
 #endif
 
-#pragma GCC diagnostic push
+FOLLY_PUSH_WARNING
 // Ignore shadowing warnings within this file, so includers can use -Wshadow.
-#pragma GCC diagnostic ignored "-Wshadow"
+FOLLY_GCC_DISABLE_WARNING("-Wshadow")
 // GCC 4.9 has a false positive in setSmallSize (probably
 // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124), disable
 // compile-time array bound checking.
-#pragma GCC diagnostic ignored "-Warray-bounds"
+FOLLY_GCC_DISABLE_WARNING("-Warray-bounds")
 
 // FBString cannot use throw when replacing std::string, though it may still
 // use std::__throw_*
@@ -1238,11 +1239,14 @@ public:
   // otherwise MSVC 2017 will aggressively pre-resolve value_type to
   // traits_type::char_type, which won't compare as equal when determining
   // which overload the implementation is referring to.
+  // Also note that MSVC 2015 Update 3 requires us to explicitly specify the
+  // namespace in-which to search for basic_fbstring, otherwise it tries to
+  // look for basic_fbstring::basic_fbstring, which is just plain wrong.
   template <typename TP>
   typename std::enable_if<
       std::is_same<
           typename std::decay<TP>::type,
-          typename basic_fbstring<E, T, A, Storage>::value_type>::value,
+          typename folly::basic_fbstring<E, T, A, Storage>::value_type>::value,
       basic_fbstring<E, T, A, Storage>&>::type
   operator=(TP c);
 
@@ -2885,7 +2889,7 @@ FOLLY_FBSTRING_HASH
 
 #endif // _LIBSTDCXX_FBSTRING
 
-#pragma GCC diagnostic pop
+FOLLY_POP_WARNING
 
 #undef FBSTRING_DISABLE_SSO
 #undef FBSTRING_SANITIZE_ADDRESS