Restore `bool T::ParseFrom(const char*, size_t)` support for MSVC.

IIRC, it was problematic for MSVC 2017 and/or MSVC 2019, but
https://github.com/google/oss-policies-info/commit/dca3ce04cd812e03c71107a7fdea419acbd6432c
raised the support baseline to MSVC 2022, so let's try it...

Change-Id: Id00483381c1f6c499a2da0c2d40d235c95dedfaa
Reviewed-on: https://code-review.googlesource.com/c/re2/+/63050
Reviewed-by: Alex Chernyakhovsky <achernya@google.com>
Reviewed-by: Paul Wankadia <junyer@google.com>
diff --git a/re2/re2.h b/re2/re2.h
index 7ea44e0..13bf39f 100644
--- a/re2/re2.h
+++ b/re2/re2.h
@@ -890,14 +890,12 @@
       re2_internal::Parse4ary<T>::value,
       int>::type;
 
-#if !defined(_MSC_VER)
   template <typename T>
   using CanParseFrom = typename std::enable_if<
       std::is_member_function_pointer<
           decltype(static_cast<bool (T::*)(const char*, size_t)>(
               &T::ParseFrom))>::value,
       int>::type;
-#endif
 
  public:
   Arg() : Arg(nullptr) {}
@@ -909,10 +907,8 @@
   template <typename T, CanParse4ary<T> = 0>
   Arg(T* ptr) : arg_(ptr), parser_(DoParse4ary<T>) {}
 
-#if !defined(_MSC_VER)
   template <typename T, CanParseFrom<T> = 0>
   Arg(T* ptr) : arg_(ptr), parser_(DoParseFrom<T>) {}
-#endif
 
   typedef bool (*Parser)(const char* str, size_t n, void* dest);
 
@@ -938,13 +934,11 @@
     return re2_internal::Parse(str, n, reinterpret_cast<T*>(dest), 10);
   }
 
-#if !defined(_MSC_VER)
   template <typename T>
   static bool DoParseFrom(const char* str, size_t n, void* dest) {
     if (dest == NULL) return true;
     return reinterpret_cast<T*>(dest)->ParseFrom(str, n);
   }
-#endif
 
   void*         arg_;
   Parser        parser_;
diff --git a/re2/testing/re2_arg_test.cc b/re2/testing/re2_arg_test.cc
index 4b00be3..78d4aee 100644
--- a/re2/testing/re2_arg_test.cc
+++ b/re2/testing/re2_arg_test.cc
@@ -135,7 +135,6 @@
 }
 
 TEST(RE2ArgTest, ParseFromTest) {
-#if !defined(_MSC_VER)
   struct {
     bool ParseFrom(const char* str, size_t n) {
       LOG(INFO) << "str = " << str << ", n = " << n;
@@ -155,7 +154,6 @@
   } obj2;
   RE2::Arg arg2(&obj2);
   EXPECT_FALSE(arg2.Parse("two", 3));
-#endif
 }
 
 TEST(RE2ArgTest, OptionalDoubleTest) {