diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 3aa9b7a6d74..e4ea2625624 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -738,7 +738,9 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const if (type == Variables::none || isPartOfClassStructUnion(i->typeStartToken())) continue; const Token* defValTok = i->nameToken()->next(); - if (Token::Match(i->nameToken()->previous(), "* %var% ) (")) // function pointer. Jump behind parameter list. + while (defValTok && defValTok->str() == "[") + defValTok = defValTok->link()->next(); + if (Token::simpleMatch(defValTok, ") (")) defValTok = defValTok->linkAt(1)->next(); for (; defValTok; defValTok = defValTok->next()) { if (defValTok->str() == "[") diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 44bc750daaa..0a29731e085 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -7034,6 +7034,13 @@ class TestUnusedVar : public TestFixture { " funcPtr();\n" "}"); ASSERT_EQUALS("", errout_str()); + + // #14661 + functionVariableUsage("int main() {\n" + " void (*const funcPtr[])(void) = {x};\n" + " funcPtr[0]();\n" + "}"); + ASSERT_EQUALS("", errout_str()); } void localvarAddr() { // #7747