diff --git a/lib/vf_settokenvalue.cpp b/lib/vf_settokenvalue.cpp index 1d6179fb9af..8c24b9c0225 100644 --- a/lib/vf_settokenvalue.cpp +++ b/lib/vf_settokenvalue.cpp @@ -256,7 +256,7 @@ namespace ValueFlow // Ensure that the comma isn't a function call if (!callParent || (!Token::Match(callParent->previous(), "%name%|> (") && !Token::simpleMatch(callParent, "{") && (!Token::Match(callParent, "( %name%") || settings.library.isNotLibraryFunction(callParent->next())) && - !(callParent->str() == "(" && (Token::simpleMatch(callParent->astOperand1(), "*") || Token::Match(callParent->astOperand1(), "%name%|("))))) { + !(callParent->str() == "(" && Token::Match(callParent->astOperand1(), "%name%|(|[|*|.")))) { setTokenValue(parent, std::move(value), settings); return; } diff --git a/test/testother.cpp b/test/testother.cpp index d5d6036718e..96e027692b3 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -13682,6 +13682,18 @@ class TestOther : public TestFixture { " return MACRO(true);\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("struct S {\n" // #15063 + " int (*f)(int, int);\n" + " int (*a[2])(int, int);\n" + "};\n" + "int g1(struct S* p, int x) {\n" + " return (p->f)(x, 10);\n" + "}\n" + "int g2(struct S s, int x) {\n" + " return s.a[0](x, 10);\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void knownArgumentHiddenVariableExpression() {