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) {