diff --git a/include/gmock/gmock-actions.h b/include/gmock/gmock-actions.h index 215af4f9..f88ac80d 100644 --- a/include/gmock/gmock-actions.h +++ b/include/gmock/gmock-actions.h @@ -494,11 +494,11 @@ class ReturnAction { // single-argument constructor (e.g. Result is std::vector) and R // has a type conversion operator template. In that case, value_(value) // won't compile as the compiler doesn't known which constructor of - // Result to call. implicit_cast forces the compiler to convert R to + // Result to call. ImplicitCast_ forces the compiler to convert R to // Result without considering explicit constructors, thus resolving the // ambiguity. value_ is then initialized using its copy constructor. explicit Impl(R value) - : value_(::testing::internal::implicit_cast(value)) {} + : value_(::testing::internal::ImplicitCast_(value)) {} virtual Result Perform(const ArgumentTuple&) { return value_; } diff --git a/include/gmock/gmock-generated-nice-strict.h b/include/gmock/gmock-generated-nice-strict.h index 4fb69fdc..6099e81e 100644 --- a/include/gmock/gmock-generated-nice-strict.h +++ b/include/gmock/gmock-generated-nice-strict.h @@ -71,7 +71,7 @@ class NiceMock : public MockClass { // we have to avoid a possible clash with members of MockClass. NiceMock() { ::testing::Mock::AllowUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } // C++ doesn't (yet) allow inheritance of constructors, so we have @@ -79,32 +79,32 @@ class NiceMock : public MockClass { template explicit NiceMock(const A1& a1) : MockClass(a1) { ::testing::Mock::AllowUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { ::testing::Mock::AllowUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { ::testing::Mock::AllowUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4) : MockClass(a1, a2, a3, a4) { ::testing::Mock::AllowUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5) : MockClass(a1, a2, a3, a4, a5) { ::testing::Mock::AllowUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template (this)); + internal::ImplicitCast_(this)); } template (this)); + internal::ImplicitCast_(this)); } template (this)); + internal::ImplicitCast_(this)); } template (this)); + internal::ImplicitCast_(this)); } template (this)); + internal::ImplicitCast_(this)); } virtual ~NiceMock() { ::testing::Mock::UnregisterCallReaction( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } private: @@ -167,38 +167,38 @@ class StrictMock : public MockClass { // we have to avoid a possible clash with members of MockClass. StrictMock() { ::testing::Mock::FailUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template explicit StrictMock(const A1& a1) : MockClass(a1) { ::testing::Mock::FailUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { ::testing::Mock::FailUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { ::testing::Mock::FailUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4) : MockClass(a1, a2, a3, a4) { ::testing::Mock::FailUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5) : MockClass(a1, a2, a3, a4, a5) { ::testing::Mock::FailUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template (this)); + internal::ImplicitCast_(this)); } template (this)); + internal::ImplicitCast_(this)); } template (this)); + internal::ImplicitCast_(this)); } template (this)); + internal::ImplicitCast_(this)); } template (this)); + internal::ImplicitCast_(this)); } virtual ~StrictMock() { ::testing::Mock::UnregisterCallReaction( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } private: diff --git a/include/gmock/gmock-generated-nice-strict.h.pump b/include/gmock/gmock-generated-nice-strict.h.pump index 784635bd..b7964db3 100644 --- a/include/gmock/gmock-generated-nice-strict.h.pump +++ b/include/gmock/gmock-generated-nice-strict.h.pump @@ -74,7 +74,7 @@ class NiceMock : public MockClass { // we have to avoid a possible clash with members of MockClass. NiceMock() { ::testing::Mock::AllowUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } // C++ doesn't (yet) allow inheritance of constructors, so we have @@ -82,7 +82,7 @@ class NiceMock : public MockClass { template explicit NiceMock(const A1& a1) : MockClass(a1) { ::testing::Mock::AllowUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } $range i 2..n @@ -91,14 +91,14 @@ $range j 1..i template <$for j, [[typename A$j]]> NiceMock($for j, [[const A$j& a$j]]) : MockClass($for j, [[a$j]]) { ::testing::Mock::AllowUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } ]] virtual ~NiceMock() { ::testing::Mock::UnregisterCallReaction( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } private: @@ -112,13 +112,13 @@ class StrictMock : public MockClass { // we have to avoid a possible clash with members of MockClass. StrictMock() { ::testing::Mock::FailUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } template explicit StrictMock(const A1& a1) : MockClass(a1) { ::testing::Mock::FailUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } $for i [[ @@ -126,14 +126,14 @@ $range j 1..i template <$for j, [[typename A$j]]> StrictMock($for j, [[const A$j& a$j]]) : MockClass($for j, [[a$j]]) { ::testing::Mock::FailUninterestingCalls( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } ]] virtual ~StrictMock() { ::testing::Mock::UnregisterCallReaction( - internal::implicit_cast(this)); + internal::ImplicitCast_(this)); } private: diff --git a/include/gmock/gmock-spec-builders.h b/include/gmock/gmock-spec-builders.h index 1676056c..df2aef16 100644 --- a/include/gmock/gmock-spec-builders.h +++ b/include/gmock/gmock-spec-builders.h @@ -1388,7 +1388,7 @@ class FunctionMockerBase : public UntypedFunctionMockerBase { mock_obj_ = mock_obj; } Mock::Register(mock_obj, this); - return *::testing::internal::down_cast*>(this); + return *::testing::internal::DownCast_*>(this); } // The following two functions are from UntypedFunctionMockerBase. diff --git a/scripts/generator/cpp/ast.py b/scripts/generator/cpp/ast.py index 47dc9a07..6f61f877 100755 --- a/scripts/generator/cpp/ast.py +++ b/scripts/generator/cpp/ast.py @@ -1483,7 +1483,13 @@ class AstBuilder(object): assert class_token.token_type == tokenize.SYNTAX, class_token token = class_token else: - self._AddBackToken(class_token) + # Skip any macro (e.g. storage class specifiers) after the + # 'class' keyword. + next_token = self._GetNextToken() + if next_token.token_type == tokenize.NAME: + self._AddBackToken(next_token) + else: + self._AddBackTokens([class_token, next_token]) name_tokens, token = self.GetName() class_name = ''.join([t.name for t in name_tokens]) bases = None diff --git a/scripts/generator/cpp/gmock_class_test.py b/scripts/generator/cpp/gmock_class_test.py index 607d5cf7..494720cd 100755 --- a/scripts/generator/cpp/gmock_class_test.py +++ b/scripts/generator/cpp/gmock_class_test.py @@ -193,6 +193,22 @@ void()); self.assertEqualIgnoreLeadingWhitespace( expected, self.GenerateMocks(source)) + def testClassWithStorageSpecifierMacro(self): + source = """ +class STORAGE_SPECIFIER Test { + public: + virtual void Foo(); +}; +""" + expected = """\ +class MockTest : public Test { +public: +MOCK_METHOD0(Foo, +void()); +}; +""" + self.assertEqualIgnoreLeadingWhitespace( + expected, self.GenerateMocks(source)) if __name__ == '__main__': unittest.main() diff --git a/scripts/gmock_doctor.py b/scripts/gmock_doctor.py index 15e2433c..f7932b5e 100755 --- a/scripts/gmock_doctor.py +++ b/scripts/gmock_doctor.py @@ -169,7 +169,7 @@ def _NeedToReturnReferenceDiagnoser(msg): gcc_regex = (r'In member function \'testing::internal::ReturnAction.*\n' + _GCC_FILE_LINE_RE + r'instantiated from here\n' r'.*gmock-actions\.h.*error: creating array with negative size') - clang_regex = (r'error: array size is negative\r?\n' + clang_regex = (r'error:.*array.*negative.*\r?\n' r'(.*\n)*?' + _CLANG_NON_GMOCK_FILE_LINE_RE + r'note: in instantiation of function template specialization ' @@ -414,10 +414,10 @@ def _NeedToUseReturnNullDiagnoser(msg): gcc_regex = ('instantiated from \'testing::internal::ReturnAction' '::operator testing::Action\(\) const.*\n' + _GCC_FILE_LINE_RE + r'instantiated from here\n' - r'.*error: no matching function for call to \'implicit_cast\(' + r'.*error: no matching function for call to \'ImplicitCast_\(' r'long int&\)') clang_regex = (r'\bgmock-actions.h:.* error: no matching function for ' - r'call to \'implicit_cast\'\r?\n' + r'call to \'ImplicitCast_\'\r?\n' r'(.*\n)*?' + _CLANG_NON_GMOCK_FILE_LINE_RE + r'note: in instantiation ' r'of function template specialization ' @@ -501,7 +501,7 @@ def _WrongMockMethodMacroDiagnoser(msg): r'.*\n' r'.*candidates are.*FunctionMocker<[^>]+A(?P\d+)\)>') clang_regex = (_CLANG_NON_GMOCK_FILE_LINE_RE + - r'error: array size is negative\r?\n' + r'error:.*array.*negative.*r?\n' r'(.*\n)*?' r'(?P=file):(?P=line):(?P=column): error: too few arguments ' r'to function call, expected (?P\d+), '