aboutsummaryrefslogtreecommitdiffstats
path: root/googlemock
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2020-01-31 12:03:06 -0500
committerAndy Getz <durandal@google.com>2020-02-07 13:34:42 -0500
commit572e261b607585d7044ad3321f9530d5c14a2564 (patch)
tree71908c4d9b8481ea9f6e6289e90b69aff820e2aa /googlemock
parent7bc671b8e0de264e58bb479535dc66f3be70ee4f (diff)
downloadgoogletest-572e261b607585d7044ad3321f9530d5c14a2564.tar.gz
googletest-572e261b607585d7044ad3321f9530d5c14a2564.tar.bz2
googletest-572e261b607585d7044ad3321f9530d5c14a2564.zip
Googletest export
Fix use of reserved names. Minimize code duplication needed for explict-vs-nonexplicit constructor. PiperOrigin-RevId: 292555014
Diffstat (limited to 'googlemock')
-rw-r--r--googlemock/include/gmock/gmock-generated-matchers.h44
-rw-r--r--googlemock/include/gmock/gmock-generated-matchers.h.pump3
-rw-r--r--googlemock/include/gmock/gmock-matchers.h28
-rw-r--r--googlemock/test/gmock-matchers_test.cc27
4 files changed, 48 insertions, 54 deletions
diff --git a/googlemock/include/gmock/gmock-generated-matchers.h b/googlemock/include/gmock/gmock-generated-matchers.h
index 346b145e..539d6570 100644
--- a/googlemock/include/gmock/gmock-generated-matchers.h
+++ b/googlemock/include/gmock/gmock-generated-matchers.h
@@ -50,10 +50,8 @@
#define GMOCK_INTERNAL_MATCHER(name, description)\
class name##Matcher : public \
::testing::internal::MatcherBaseImpl<name##Matcher> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##Matcher>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##Matcher::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -95,10 +93,8 @@
template <typename p0##_type>\
class name##MatcherP : public \
::testing::internal::MatcherBaseImpl<name##MatcherP<p0##_type>> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##MatcherP>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##MatcherP::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -144,10 +140,8 @@
class name##MatcherP2 : public \
::testing::internal::MatcherBaseImpl<name##MatcherP2<p0##_type, \
p1##_type>> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##MatcherP2>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##MatcherP2::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -196,10 +190,8 @@
class name##MatcherP3 : public \
::testing::internal::MatcherBaseImpl<name##MatcherP3<p0##_type, \
p1##_type, p2##_type>> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##MatcherP3>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##MatcherP3::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -251,10 +243,8 @@
class name##MatcherP4 : public \
::testing::internal::MatcherBaseImpl<name##MatcherP4<p0##_type, \
p1##_type, p2##_type, p3##_type>> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##MatcherP4>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##MatcherP4::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -313,10 +303,8 @@
class name##MatcherP5 : public \
::testing::internal::MatcherBaseImpl<name##MatcherP5<p0##_type, \
p1##_type, p2##_type, p3##_type, p4##_type>> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##MatcherP5>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##MatcherP5::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -377,10 +365,8 @@
class name##MatcherP6 : public \
::testing::internal::MatcherBaseImpl<name##MatcherP6<p0##_type, \
p1##_type, p2##_type, p3##_type, p4##_type, p5##_type>> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##MatcherP6>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##MatcherP6::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -444,10 +430,8 @@
class name##MatcherP7 : public \
::testing::internal::MatcherBaseImpl<name##MatcherP7<p0##_type, \
p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type>> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##MatcherP7>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##MatcherP7::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -519,10 +503,8 @@
::testing::internal::MatcherBaseImpl<name##MatcherP8<p0##_type, \
p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type, \
p7##_type>> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##MatcherP8>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##MatcherP8::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -597,10 +579,8 @@
::testing::internal::MatcherBaseImpl<name##MatcherP9<p0##_type, \
p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type, \
p7##_type, p8##_type>> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##MatcherP9>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##MatcherP9::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -679,10 +659,8 @@
::testing::internal::MatcherBaseImpl<name##MatcherP10<p0##_type, \
p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type, \
p7##_type, p8##_type, p9##_type>> {\
- using __internal_base_type = \
- ::testing::internal::MatcherBaseImpl<name##MatcherP10>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using name##MatcherP10::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
diff --git a/googlemock/include/gmock/gmock-generated-matchers.h.pump b/googlemock/include/gmock/gmock-generated-matchers.h.pump
index fc0ffdcf..0ea3aad9 100644
--- a/googlemock/include/gmock/gmock-generated-matchers.h.pump
+++ b/googlemock/include/gmock/gmock-generated-matchers.h.pump
@@ -80,9 +80,8 @@ $var param_field_decls2 = [[$for j
#define $macro_name(name, description$for j [[, p$j]])\$template
class $class_name : public ::testing::internal::MatcherBaseImpl<$class_name$param_types> {\
- using __internal_base_type = ::testing::internal::MatcherBaseImpl<$class_name>;\
public:\
- using __internal_base_type::__internal_base_type;\
+ using $class_name::MatcherBaseImpl::MatcherBaseImpl;\
template <typename arg_type>\
class gmock_Impl : public ::testing::MatcherInterface<\
GTEST_REFERENCE_TO_CONST_(arg_type)> {\
diff --git a/googlemock/include/gmock/gmock-matchers.h b/googlemock/include/gmock/gmock-matchers.h
index 22211210..473b3aa8 100644
--- a/googlemock/include/gmock/gmock-matchers.h
+++ b/googlemock/include/gmock/gmock-matchers.h
@@ -462,28 +462,18 @@ class MatcherBaseImpl {
}
};
-// Template specialization for Matcher with 1 parameter.
-template <template <typename...> class Derived, typename T>
-class MatcherBaseImpl<Derived<T>> {
- public:
- explicit MatcherBaseImpl(T param) : param_(std::move(param)) {}
-
- template <typename F>
- operator ::testing::Matcher<F>() const { // NOLINT(runtime/explicit)
- return ::testing::Matcher<F>(
- new typename Derived<T>::template gmock_Impl<F>(param_));
- }
-
- private:
- const T param_;
-};
-
-// Template specialization for Matcher with multiple parameters.
+// Template specialization for Matcher with parameters.
template <template <typename...> class Derived, typename... Ts>
class MatcherBaseImpl<Derived<Ts...>> {
public:
- MatcherBaseImpl(Ts... params)
- : params_(std::move(params)...) {} // NOLINT(runtime/explicit)
+ // Mark the constructor explicit for single argument T to avoid implicit
+ // conversions.
+ template <typename E = std::enable_if<sizeof...(Ts) == 1>,
+ typename E::type* = nullptr>
+ explicit MatcherBaseImpl(Ts... params) : params_(std::move(params)...) {}
+ template <typename E = std::enable_if<sizeof...(Ts) != 1>,
+ typename = typename E::type>
+ MatcherBaseImpl(Ts... params) : params_(std::move(params)...) {} // NOLINT
template <typename F>
operator ::testing::Matcher<F>() const { // NOLINT(runtime/explicit)
diff --git a/googlemock/test/gmock-matchers_test.cc b/googlemock/test/gmock-matchers_test.cc
index c667ecbe..2bcbe5cf 100644
--- a/googlemock/test/gmock-matchers_test.cc
+++ b/googlemock/test/gmock-matchers_test.cc
@@ -2875,6 +2875,33 @@ TEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) {
EXPECT_EQ("", listener2.str());
}
+MATCHER(ConstructNoArg, "") { return true; }
+MATCHER_P(Construct1Arg, arg1, "") { return true; }
+MATCHER_P2(Construct2Args, arg1, arg2, "") { return true; }
+
+TEST(MatcherConstruct, ExplicitVsImplicit) {
+ {
+ // No arg constructor can be constructed with empty brace.
+ ConstructNoArgMatcher m = {};
+ (void)m;
+ // And with no args
+ ConstructNoArgMatcher m2;
+ (void)m2;
+ }
+ {
+ // The one arg constructor has an explicit constructor.
+ // This is to prevent the implicit conversion.
+ using M = Construct1ArgMatcherP<int>;
+ EXPECT_TRUE((std::is_constructible<M, int>::value));
+ EXPECT_FALSE((std::is_convertible<int, M>::value));
+ }
+ {
+ // Multiple arg matchers can be constructed with an implicit construction.
+ Construct2ArgsMatcherP2<int, double> m = {1, 2.2};
+ (void)m;
+ }
+}
+
MATCHER_P(Really, inner_matcher, "") {
return ExplainMatchResult(inner_matcher, arg, result_listener);
}