From 6557ff7fe099edec2706b38fe6718538c1b5abee Mon Sep 17 00:00:00 2001 From: chrchr Date: Thu, 15 Jun 2023 19:35:18 +0200 Subject: [PATCH] Fix #11769 cppcheckError for function with lambda as default parameter --- lib/symboldatabase.cpp | 8 +++++++- test/testsymboldatabase.cpp | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index c1817f301d9..da189b629fc 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -4311,7 +4311,13 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s initArgCount++; if (tok->strAt(1) == "[") { const Token* lambdaStart = tok->next(); - tok = type == eLambda ? findLambdaEndTokenWithoutAST(lambdaStart) : findLambdaEndToken(lambdaStart); + if (type == eLambda) + tok = findLambdaEndTokenWithoutAST(lambdaStart); + else { + tok = findLambdaEndToken(lambdaStart); + if (!tok) + tok = findLambdaEndTokenWithoutAST(lambdaStart); + } if (!tok) throw InternalError(lambdaStart, "Analysis failed (lambda not recognized). If the code is valid then please report this failure.", InternalError::INTERNAL); } diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 6c664e16992..a1c264d26f6 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -246,6 +246,7 @@ class TestSymbolDatabase : public TestFixture { TEST_CASE(functionArgs17); TEST_CASE(functionArgs18); // #10376 TEST_CASE(functionArgs19); // #10376 + TEST_CASE(functionArgs20); TEST_CASE(functionImplicitlyVirtual); @@ -2707,6 +2708,17 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS(3, func->argCount()); } + void functionArgs20() { // #11769 + const char code[] = "void f(void *(*g)(void *) = [](void *p) { return p; }) {}"; + GET_SYMBOL_DB(code); + ASSERT(db != nullptr); + const Scope *scope = db->functionScopes.front(); + const Function *func = scope->function; + ASSERT_EQUALS(1, func->argCount()); + const Variable* arg = func->getArgumentVar(0); + TODO_ASSERT(arg->hasDefault()); + } + void functionImplicitlyVirtual() { GET_SYMBOL_DB("class base { virtual void f(); };\n" "class derived : base { void f(); };\n"