diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 7d7ccd7b023..5982f3fa0d2 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1007,7 +1007,7 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const // assignment else if ((Token::Match(tok, "%name% [") && Token::simpleMatch(skipBracketsAndMembers(tok->next()), "=")) || - (tok->isUnaryOp("*") && Token::simpleMatch(tok->astParent(), "=") && Token::simpleMatch(tok->astOperand1(), "+"))) { + (tok->isUnaryOp("*") && astIsLHS(tok) && Token::simpleMatch(tok->astParent(), "=") && Token::simpleMatch(tok->astOperand1(), "+"))) { const Token *eq = tok; while (eq && !eq->isAssignmentOp()) eq = eq->astParent(); diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 7a4996f9bc2..749dd206b6b 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -244,6 +244,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(crash1); TEST_CASE(crash2); + TEST_CASE(crash3); TEST_CASE(usingNamespace); // #4585 TEST_CASE(lambdaFunction); // #5078 @@ -6916,6 +6917,14 @@ class TestUnusedVar : public TestFixture { "}"); // #4695 } + void crash3() { + functionVariableUsage("void f(int a, int b, const int* p) {\n" // #12531 + " const int* s[] = { p, p + 1, p + 2 };\n" + " a = *(s[a] + b);\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:3]: (style) Variable 'a' is assigned a value that is never used.\n", errout_str()); + } + void usingNamespace() { functionVariableUsage("int foo() {\n" " using namespace ::com::sun::star::i18n;\n"