diff --git a/googlemock/include/gmock/gmock-function-mocker.h b/googlemock/include/gmock/gmock-function-mocker.h index 9c5d2c9fd..2e97aa7d7 100644 --- a/googlemock/include/gmock/gmock-function-mocker.h +++ b/googlemock/include/gmock/gmock-function-mocker.h @@ -226,8 +226,6 @@ using internal::FunctionMocker; _Args, _Spec) \ GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args); \ GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec); \ - GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ - GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)); \ GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \ GMOCK_INTERNAL_DEFINE_MOCK_METHOD_IMPL( \ GMOCK_PP_NARG0 _Args, _MockClass, _MethodName, \ @@ -236,7 +234,9 @@ using internal::FunctionMocker; GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Spec), \ GMOCK_INTERNAL_GET_CALLTYPE_SPEC(_Spec), \ GMOCK_INTERNAL_GET_REF_SPEC(_Spec), \ - (GMOCK_INTERNAL_SIGNATURE(_Ret, _Args))) + (GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)), \ + GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ + GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args))) #define GMOCK_INTERNAL_DEFINE_MOCK_METHOD_ARG_6(...) \ GMOCK_INTERNAL_DEFINE_MOCK_METHOD_WRONG_ARITY(__VA_ARGS__) @@ -336,14 +336,13 @@ using internal::FunctionMocker; #define GMOCK_INTERNAL_DEFINE_MOCK_METHOD_IMPL( \ _N, _MockClass, _MethodName, _Constness, _Override, _Final, _NoexceptSpec, \ - _CallType, _RefSpec, _Signature) \ - typename ::testing::internal::Function::Result \ - GMOCK_INTERNAL_EXPAND(_CallType) _MockClass::_MethodName( \ + _CallType, _RefSpec, _Signature, _InClassAssertions) \ + auto GMOCK_INTERNAL_EXPAND(_CallType) _MockClass::_MethodName( \ GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N)) \ - GMOCK_PP_IF(_Constness, const, ) \ - _RefSpec _NoexceptSpec GMOCK_PP_IF(_Override, override, ) \ - GMOCK_PP_IF(_Final, final, ) { \ + GMOCK_PP_IF(_Constness, const, ) _RefSpec _NoexceptSpec -> \ + typename ::testing::internal::Function::Result { \ + _InClassAssertions; \ auto& mocker = gmock_get_mocker_##_MethodName( \ ::testing::internal::TypeTag{}); \ @@ -351,10 +350,10 @@ using internal::FunctionMocker; return mocker.Invoke( \ GMOCK_PP_REPEAT(GMOCK_INTERNAL_FORWARD_ARG, _Signature, _N)); \ } \ - ::testing::MockSpec \ - _MockClass::gmock_##_MethodName( \ - GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N)) \ - GMOCK_PP_IF(_Constness, const, ) _RefSpec { \ + auto _MockClass::gmock_##_MethodName( \ + GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N)) \ + GMOCK_PP_IF(_Constness, const, ) \ + _RefSpec->::testing::MockSpec { \ auto& mocker = gmock_get_mocker_##_MethodName( \ ::testing::internal::TypeTag{}); \ @@ -362,12 +361,11 @@ using internal::FunctionMocker; return mocker.With( \ GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N)); \ } \ - ::testing::MockSpec \ - _MockClass::gmock_##_MethodName( \ - const ::testing::internal::WithoutMatchers&, \ - GMOCK_PP_IF(_Constness, const, )::testing::internal::Function< \ - GMOCK_PP_REMOVE_PARENS(_Signature)>*) \ - const _RefSpec _NoexceptSpec { \ + auto _MockClass::gmock_##_MethodName( \ + const ::testing::internal::WithoutMatchers&, \ + GMOCK_PP_IF(_Constness, const, )::testing::internal::Function< \ + GMOCK_PP_REMOVE_PARENS(_Signature)>*) const _RefSpec _NoexceptSpec \ + ->::testing::MockSpec { \ return ::testing::internal::ThisRefAdjuster::Adjust(*this) \ .gmock_##_MethodName(GMOCK_PP_REPEAT( \ @@ -1047,11 +1045,11 @@ using internal::FunctionMocker; #define GMOCK_INTERNAL_DEFINE_MOCK_METHODN(constness, ct, Class, Method, \ args_num, ...) \ - GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ - args_num, ::testing::internal::identity_t<__VA_ARGS__>); \ GMOCK_INTERNAL_DEFINE_MOCK_METHOD_IMPL( \ args_num, Class, Method, GMOCK_PP_NARG0(constness), 0, 0, , ct, , \ - (::testing::internal::identity_t<__VA_ARGS__>)) + (::testing::internal::identity_t<__VA_ARGS__>), \ + GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ + args_num, ::testing::internal::identity_t<__VA_ARGS__>)) #define GMOCK_MOCKER_(arity, constness, Method) \ GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) diff --git a/googlemock/test/gmock-function-mocker_test.cc b/googlemock/test/gmock-function-mocker_test.cc index 35d1d806e..249694f1e 100644 --- a/googlemock/test/gmock-function-mocker_test.cc +++ b/googlemock/test/gmock-function-mocker_test.cc @@ -592,6 +592,9 @@ TEST(SplitMockTest, CallMockMethods) { EXPECT_CALL(mock_split, func_legacy(16, 17)).WillOnce(Return(18)); EXPECT_CALL(mock_split, func_legacy_const(19)).WillOnce(Return(20)); + EXPECT_CALL(mock_split, func_inherited(21)).WillOnce(Return(22)); + EXPECT_CALL(mock_split, func_nested_typedef(23)).WillOnce(Return(24)); + EXPECT_EQ(mock_split.func(1), 2); EXPECT_EQ(std::as_const(mock_split).func_const(3), 4); @@ -603,6 +606,9 @@ TEST(SplitMockTest, CallMockMethods) { EXPECT_EQ(mock_split.func_legacy(16, 17), 18); EXPECT_EQ(std::as_const(mock_split).func_legacy_const(19), 20); + + EXPECT_EQ(mock_split.func_inherited(21), 22); + EXPECT_EQ(mock_split.func_nested_typedef(23), 24); } class MockB { diff --git a/googlemock/test/split-mock_test_helper.cc b/googlemock/test/split-mock_test_helper.cc index 64537e566..18f5f69d4 100644 --- a/googlemock/test/split-mock_test_helper.cc +++ b/googlemock/test/split-mock_test_helper.cc @@ -55,3 +55,9 @@ DEFINE_MOCK_METHOD2(MockSplitDeclarationAndDefinition, func_legacy, int(int, int)); DEFINE_MOCK_CONST_METHOD1(MockSplitDeclarationAndDefinition, func_legacy_const, int(int)); + +DEFINE_MOCK_METHOD(MockSplitDeclarationAndDefinition, int, func_inherited, + (int), (override final)); + +DEFINE_MOCK_METHOD(MockSplitDeclarationAndDefinition, NESTED_TYPEDEF, + func_nested_typedef, (NESTED_TYPEDEF)); \ No newline at end of file diff --git a/googlemock/test/split-mock_test_helper.h b/googlemock/test/split-mock_test_helper.h index bea110c7a..9ce62a6da 100644 --- a/googlemock/test/split-mock_test_helper.h +++ b/googlemock/test/split-mock_test_helper.h @@ -35,7 +35,12 @@ #include "gmock/gmock-function-mocker.h" -struct MockSplitDeclarationAndDefinition { +struct MockSplitDeclarationAndDefinitionBase { + virtual int func_inherited(int) = 0; +}; + +struct MockSplitDeclarationAndDefinition + : MockSplitDeclarationAndDefinitionBase { MockSplitDeclarationAndDefinition(); ~MockSplitDeclarationAndDefinition(); @@ -50,6 +55,11 @@ struct MockSplitDeclarationAndDefinition { DECLARE_MOCK_METHOD2(func_legacy, int(int, int)); DECLARE_MOCK_CONST_METHOD1(func_legacy_const, int(int)); + + DECLARE_MOCK_METHOD(int, func_inherited, (int), (override final)); + + using NESTED_TYPEDEF = int; + DECLARE_MOCK_METHOD(NESTED_TYPEDEF, func_nested_typedef, (NESTED_TYPEDEF)); }; #endif // GOOGLEMOCK_TEST_SPLIT_MOCK_TEST_HELPER_H_