diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index d1ac96f2b..0dd50ff1f 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -2500,7 +2500,7 @@ const Function* SymbolDatabase::findFunction(const Token *tok) const } // check for member function - else if (tok->strAt(-1) == ".") { + else if (Token::Match(tok->tokAt(-2), "!!this .")) { if (Token::Match(tok->tokAt(-2), "%var% .")) { const Token *tok1 = tok->tokAt(-2); diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index aa426433f..06441e610 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -88,6 +88,7 @@ private: TEST_CASE(initvar_nocopy1); // ticket #2474 TEST_CASE(initvar_nocopy2); // ticket #2484 TEST_CASE(initvar_nocopy3); // ticket #3611 + TEST_CASE(initvar_with_member_function_this); // ticket #4824 TEST_CASE(initvar_destructor); // No variables need to be initialized in a destructor TEST_CASE(initvar_func_ret_func_ptr); // ticket #4449 @@ -1134,6 +1135,15 @@ private: ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) Member variable 'A::b' is not initialized in the constructor.\n", errout.str()); } + void initvar_with_member_function_this() { + check("struct Foo {\n" + " Foo(int m) { this->setMember(m); }\n" + " void setMember(int m) { member = m; }\n" + " int member;\n" + "};"); + ASSERT_EQUALS("", errout.str()); + } + void initvar_destructor() { check("class Fred\n" "{\n"