diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 76c49b2c833..edf754ff616 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -8035,10 +8035,13 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to } } //Is iterator fetching function called? - } else if (Token::simpleMatch(tok->astOperand1(), "::") && - tok->astOperand2() && - tok->astOperand2()->isVariable()) { - const auto* const paramVariable = tok->astOperand2()->variable(); + } else if (Token::simpleMatch(tok->astOperand1(), "::") && Token::Match(tok->astOperand2(), "%var%|.|[")) { + const Token* varTok = tok->astOperand2(); + while (Token::simpleMatch(varTok, "[")) + varTok = varTok->astOperand1(); + while (Token::simpleMatch(varTok, ".")) + varTok = varTok->astOperand2(); + const Variable* const paramVariable = varTok ? varTok->variable() : nullptr; if (!paramVariable || !paramVariable->valueType() || !paramVariable->valueType()->container) { diff --git a/test/cfg/std.cpp b/test/cfg/std.cpp index a3c66724acb..1224c6b57ac 100644 --- a/test/cfg/std.cpp +++ b/test/cfg/std.cpp @@ -5033,15 +5033,22 @@ struct T_constParameter_std_begin { std::vector v; }; +struct U_constParameter_std_begin { + std::vector v[1][1]; +}; + void f(S_constParameter_std_begin& s) { std::for_each(std::begin(s.a), std::end(s.a), [](int& i) { ++i; }); } -// cppcheck-suppress constParameterReference - FP void f(T_constParameter_std_begin& t) { std::for_each(std::begin(t.v), std::end(t.v), [](int& i) { ++i; }); } +void f(U_constParameter_std_begin& u) { + std::for_each(std::begin(u.v[0][0]), std::end(u.v[0][0]), [](int& i) { ++i; }); +} + void g_constVariable_std_begin(int* p) { *p = 0; } int f_constVariable_std_begin() { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 05dd0ab9b8f..8348e0cd44b 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -9969,6 +9969,18 @@ class TestSymbolDatabase : public TestFixture { ASSERT(tok && tok->valueType()); ASSERT_EQUALS("iterator(std :: vector <)", tok->valueType()->str()); } + { + GET_SYMBOL_DB("struct S { std::vector v[1][1]; };\n" + "void f(S& s) {\n" + " auto it = std::begin(s.v[0][0]);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + + const Token* tok = tokenizer.tokens(); + tok = Token::findsimplematch(tok, "auto"); + ASSERT(tok && tok->valueType()); + ASSERT_EQUALS("iterator(std :: vector <)", tok->valueType()->str()); + } { GET_SYMBOL_DB("void f(std::vector::iterator beg, std::vector::iterator end) {\n" " auto it = std::find(beg, end, 0);\n"