diff options
Diffstat (limited to 'googlemock')
-rw-r--r-- | googlemock/include/gmock/gmock-generated-matchers.h | 44 | ||||
-rw-r--r-- | googlemock/include/gmock/gmock-generated-matchers.h.pump | 3 | ||||
-rw-r--r-- | googlemock/include/gmock/gmock-matchers.h | 28 | ||||
-rw-r--r-- | googlemock/test/gmock-matchers_test.cc | 27 |
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 346b145..539d657 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 fc0ffdc..0ea3aad 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 2221121..473b3aa 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 c667ecb..2bcbe5c 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); } |