From 4d22ada078d2a20a87163b0037a2f76a7a5d26e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 4 Sep 2016 16:36:04 +0200 Subject: [PATCH] Fixed #5839 (False positive: Function can be const, if this is passed to functor) --- lib/checkclass.cpp | 5 ++++- test/testclass.cpp | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 3a082500c..7cc0d6e6b 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1978,7 +1978,10 @@ bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, bool& memberAccessed = true; } // Member variable given as parameter - for (const Token* tok2 = tok1->tokAt(2); tok2 && tok2 != tok1->next()->link(); tok2 = tok2->next()) { + const Token *lpar = tok1->next(); + if (Token::simpleMatch(lpar, "( ) (")) + lpar = lpar->tokAt(2); + for (const Token* tok2 = lpar->next(); tok2 && tok2 != tok1->next()->link(); tok2 = tok2->next()) { if (tok2->str() == "(") tok2 = tok2->link(); else if (tok2->isName() && isMemberVar(scope, tok2)) { diff --git a/test/testclass.cpp b/test/testclass.cpp index abfbfb235..b561b43c3 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -5135,6 +5135,17 @@ private: " }\n" "};"); ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Foo::foo' can be static.\n", errout.str()); + + checkConst("struct A;\n" // #5839 - operator() + "struct B {\n" + " void operator()(A *a);\n" + "};\n" + "struct A {\n" + " void dostuff() {\n" + " B()(this);\n" + " }\n" + "};"); + ASSERT_EQUALS("", errout.str()); } void assigningPointerToPointerIsNotAConstOperation() {