diff --git a/lib/checkunusedfunctions.cpp b/lib/checkunusedfunctions.cpp index 906ec15d1..50d9f4843 100644 --- a/lib/checkunusedfunctions.cpp +++ b/lib/checkunusedfunctions.cpp @@ -178,13 +178,13 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const char Fi funcname = funcname->next(); } - else if (Token::Match(tok, "[=(,] &| %var% :: %var%")) { + else if (Token::Match(tok, "[;{}.,()[=+-/|!?:] &| %var% :: %var%")) { funcname = tok->next(); if (funcname->str() == "&") funcname = funcname->next(); while (Token::Match(funcname,"%var% :: %var%")) funcname = funcname->tokAt(2); - if (!Token::Match(funcname, "%var% [,);]")) + if (!Token::Match(funcname, "%var% [(),;:}]")) continue; } diff --git a/test/testunusedfunctions.cpp b/test/testunusedfunctions.cpp index 80a04a630..0b969e81e 100644 --- a/test/testunusedfunctions.cpp +++ b/test/testunusedfunctions.cpp @@ -50,6 +50,7 @@ private: TEST_CASE(returnRef); TEST_CASE(attribute); // #3471 - FP __attribute__(constructor) TEST_CASE(initializer_list); + TEST_CASE(member_function_ternary); TEST_CASE(multipleFiles); // same function name in multiple files @@ -295,6 +296,20 @@ private: ASSERT_EQUALS("", errout.str()); } + void member_function_ternary() { + check("struct Foo {\n" + " void F1() {}\n" + " void F2() {}\n" + "};\n" + "int main(int argc, char *argv[]) {\n" + " Foo foo;\n" + " void (Foo::*ptr)();\n" + " ptr = (argc > 1 && !strcmp(argv[1], \"F2\")) ? &Foo::F2 : &Foo::F1;\n" + " (foo.*ptr)();\n" + "}"); + ASSERT_EQUALS("", errout.str()); + } + void multipleFiles() { CheckUnusedFunctions c;