diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 4b9056083..4d19f2c91 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1351,7 +1351,7 @@ bool CheckClass::isMemberVar(const Scope *scope, const Token *tok) { const Token *tok1 = tok; - while (tok->previous() && !Token::Match(tok->previous(), "}|{|;|public:|protected:|private:|return|:|?")) + while (tok->previous() && !Token::Match(tok->previous(), "}|{|;(||public:|protected:|private:|return|:|?")) { if (Token::simpleMatch(tok->previous(), "* this")) return true; @@ -1489,6 +1489,12 @@ bool CheckClass::checkConstFunc(const Scope *scope, const Token *tok) isconst = false; break; } + else if (Token::simpleMatch(tok1->previous(), ") <<") && + isMemberVar(scope, tok1->tokAt(-2))) + { + isconst = false; + break; + } // increment/decrement (member variable?).. else if (Token::Match(tok1, "++|--")) diff --git a/test/testclass.cpp b/test/testclass.cpp index f8b2515f4..7f80a053b 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -164,6 +164,7 @@ private: TEST_CASE(const41); // ticket #2255 TEST_CASE(const42); // ticket #2282 TEST_CASE(const43); // ticket #2377 + TEST_CASE(const44); // ticket #2595 TEST_CASE(assigningPointerToPointerIsNotAConstOperation); TEST_CASE(assigningArrayElementIsNotAConstOperation); TEST_CASE(constoperator1); // operator< can often be const @@ -4981,6 +4982,21 @@ private: ASSERT_EQUALS("", errout.str()); } + void const44() // ticket 2595 + { + checkConst("class A\n" + "{\n" + "public:\n" + " bool bOn;\n" + " bool foo()\n" + " {\n" + " return 0 != (bOn = bOn && true);\n" + " }\n" + "};\n"); + + ASSERT_EQUALS("", errout.str()); + } + void assigningPointerToPointerIsNotAConstOperation() { checkConst("struct s\n"