diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index e4ea2625624..756193c9449 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -565,7 +565,7 @@ static const Token* doAssignment(Variables &variables, const Token *tok, bool de variables.readAll(varid2, tok); } } - } else if (var1->mType == Variables::reference) { + } else if (var1->mType == Variables::reference || var1->mType == Variables::referenceArray) { variables.alias(varid1, varid2, true); } else if (var1->mType == Variables::standard && addressOf) { variables.alias(varid1, varid2, true); @@ -738,6 +738,8 @@ 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% )")) + defValTok = defValTok->next(); while (defValTok && defValTok->str() == "[") defValTok = defValTok->link()->next(); if (Token::simpleMatch(defValTok, ") (")) diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 0a29731e085..9c288f84b78 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -198,6 +198,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(localvarreturn); // ticket #9167 TEST_CASE(localvarmaybeunused); TEST_CASE(localvarrvalue); // ticket #13977 + TEST_CASE(localvarreferencearray); // ticket #14637 TEST_CASE(localvarthrow); // ticket #3687 @@ -6554,6 +6555,16 @@ class TestUnusedVar : public TestFixture { ASSERT_EQUALS("[test.cpp:3:21]: (style) Variable 'm' is assigned a value that is never used. [unreadVariable]\n", errout_str()); } + void localvarreferencearray() { // ticket #14637 + functionVariableUsage("int f() {\n" + " int a[1];\n" + " int(&r)[1] = a;\n" + " r[0] = 0;\n" + " return r[0];\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + } + void localvarthrow() { // ticket #3687 functionVariableUsage("void foo() {\n" " try {}"