Fix #12208 FN constParameterReference with nested struct/class (#5685)

This commit is contained in:
chrchr-github 2023-11-20 22:01:22 +01:00 committed by GitHub
parent f444696d5c
commit f9521cfb4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 5 deletions

View File

@ -5867,8 +5867,11 @@ const Function* SymbolDatabase::findFunction(const Token* const tok) const
if (tok1) if (tok1)
tok1 = tok1->tokAt(2); tok1 = tok1->tokAt(2);
if (currScope && tok1) if (currScope && tok1) {
return currScope->findFunction(tok1); const Function* func = currScope->findFunction(tok1);
if (func)
return func;
}
} }
} }

View File

@ -127,7 +127,7 @@
#include <unordered_set> #include <unordered_set>
#include <vector> #include <vector>
static void bailoutInternal(const std::string& type, TokenList &tokenlist, ErrorLogger *errorLogger, const Token *tok, const std::string &what, const std::string &file, int line, std::string function) static void bailoutInternal(const std::string& type, const TokenList &tokenlist, ErrorLogger *errorLogger, const Token *tok, const std::string &what, const std::string &file, int line, std::string function)
{ {
if (function.find("operator") != std::string::npos) if (function.find("operator") != std::string::npos)
function = "(valueFlow)"; function = "(valueFlow)";
@ -4011,7 +4011,7 @@ struct LifetimeStore {
} }
} }
static LifetimeStore fromFunctionArg(const Function * f, const Token *tok, const Variable *var, TokenList &tokenlist, const Settings* settings, ErrorLogger *errorLogger) { static LifetimeStore fromFunctionArg(const Function * f, const Token *tok, const Variable *var, const TokenList &tokenlist, const Settings* settings, ErrorLogger *errorLogger) {
if (!var) if (!var)
return LifetimeStore{}; return LifetimeStore{};
if (!var->isArgument()) if (!var->isArgument())
@ -7038,7 +7038,7 @@ static void valueFlowForLoopSimplify(Token* const bodyStart,
const Token* expr, const Token* expr,
bool globalvar, bool globalvar,
const MathLib::bigint value, const MathLib::bigint value,
TokenList& tokenlist, const TokenList& tokenlist,
ErrorLogger* errorLogger, ErrorLogger* errorLogger,
const Settings* settings) const Settings* settings)
{ {

View File

@ -452,6 +452,7 @@ private:
TEST_CASE(findFunction50); // #11904 - method with same name and arguments in derived class TEST_CASE(findFunction50); // #11904 - method with same name and arguments in derived class
TEST_CASE(findFunction51); // #11975 - method with same name in derived class TEST_CASE(findFunction51); // #11975 - method with same name in derived class
TEST_CASE(findFunction52); TEST_CASE(findFunction52);
TEST_CASE(findFunction53);
TEST_CASE(findFunctionContainer); TEST_CASE(findFunctionContainer);
TEST_CASE(findFunctionExternC); TEST_CASE(findFunctionExternC);
TEST_CASE(findFunctionGlobalScope); // ::foo TEST_CASE(findFunctionGlobalScope); // ::foo
@ -7671,6 +7672,21 @@ private:
ASSERT(g->function()->tokenDef->linenr() == 1); ASSERT(g->function()->tokenDef->linenr() == 1);
} }
void findFunction53() {
GET_SYMBOL_DB("namespace N {\n" // #12208
" struct S {\n"
" S(const int*);\n"
" };\n"
"}\n"
"void f(int& r) {\n"
" N::S(&r);\n"
"}\n");
const Token* S = Token::findsimplematch(tokenizer.tokens(), "S ( &");
ASSERT(S->function() && S->function()->tokenDef);
ASSERT(S->function()->tokenDef->linenr() == 3);
ASSERT(S->function()->isConstructor());
}
void findFunctionContainer() { void findFunctionContainer() {
{ {
GET_SYMBOL_DB("void dostuff(std::vector<int> v);\n" GET_SYMBOL_DB("void dostuff(std::vector<int> v);\n"