diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 156d38b7a30..5bb96a8cd4d 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1556,6 +1556,7 @@ void SymbolDatabase::createSymbolDatabaseIncompleteVars() } } +// cppcheck-suppress functionConst - has side effects void SymbolDatabase::createSymbolDatabaseEscapeFunctions() { for (const Scope& scope : scopeList) { @@ -8574,7 +8575,8 @@ ValueType::MatchResult ValueType::matchParameter(const ValueType *call, const Va return ValueType::MatchResult::NOMATCH; // TODO } if (call->pointer > 0) { - if ((call->constness | func->constness) != func->constness) + const unsigned int mask = (1U << call->pointer) - 1; + if (((call->constness | func->constness) & mask) != (func->constness & mask)) return ValueType::MatchResult::NOMATCH; if ((call->volatileness | func->volatileness) != func->volatileness) return ValueType::MatchResult::NOMATCH; diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index a89af243608..8eb5735c986 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -5507,7 +5507,7 @@ static void valueFlowForLoopSimplifyAfter(Token* fortok, nonneg int varid, const } } -static void valueFlowForLoop(TokenList &tokenlist, const SymbolDatabase& symboldatabase, ErrorLogger &errorLogger, const Settings &settings) +static void valueFlowForLoop(const TokenList &tokenlist, const SymbolDatabase& symboldatabase, ErrorLogger &errorLogger, const Settings &settings) { for (const Scope &scope : symboldatabase.scopeList) { if (scope.type != ScopeType::eFor) diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 9e7eed4ebdd..7d146551d25 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -535,6 +535,7 @@ class TestSymbolDatabase : public TestFixture { TEST_CASE(findFunction59); TEST_CASE(findFunction60); TEST_CASE(findFunction61); + TEST_CASE(findFunction62); // #14272 - pointer passed to function is const TEST_CASE(findFunctionRef1); TEST_CASE(findFunctionRef2); // #13328 TEST_CASE(findFunctionContainer); @@ -8694,6 +8695,22 @@ class TestSymbolDatabase : public TestFixture { ASSERT(fun && !fun->function()); } + void findFunction62() { // #14272 + GET_SYMBOL_DB("class Token {\n" + " std::string stringifyList(const Token* end, bool attributes = true) const;\n" + " std::string stringifyList(bool varid = false) const;\n" + "};\n" + "\n" + "void foo(const Token * const tokIf) {\n" + " tokIf->stringifyList(tokIf);\n" + "}\n"); + const Token* functionCall = Token::findsimplematch(tokenizer.tokens(), "stringifyList ( tokIf )"); + ASSERT(functionCall); + ASSERT(functionCall->function()); + ASSERT(functionCall->function()->token); + ASSERT_EQUALS(2, functionCall->function()->token->linenr()); + } + void findFunctionRef1() { GET_SYMBOL_DB("struct X {\n" " const std::vector getInts() const & { return mInts; }\n"