diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index ab86c2f19..db430ba83 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -746,6 +746,14 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const break; } + if (Token::Match(tok,"%var% (") && Token::simpleMatch(tok->linkAt(1),") {") && !Token::Match(tok, "for|while|if|catch")) { + const Token * const endTok = tok->linkAt(1)->linkAt(1); + for (const Token *tok2 = endTok->link(); tok2 && tok2 != endTok; tok2 = tok2->next()) { + if (tok2->varId()) + variables.erase(tok2->varId()); + } + } + if (Token::Match(tok->previous(), "[;{}]")) { for (const Token* tok2 = tok->next(); tok2; tok2 = tok2->next()) { if (tok2->varId()) { diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 3b6ea244d..5c2708e8c 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -135,6 +135,7 @@ private: TEST_CASE(localvarIfElse); // return tmp1 ? tmp2 : tmp3; TEST_CASE(localvarOpAssign); // a |= b; TEST_CASE(localvarFor); // for ( ; var; ) + TEST_CASE(localvarForEach); // BOOST_FOREACH, hlist_for_each, etc TEST_CASE(localvarShift1); // 1 >> var TEST_CASE(localvarShift2); // x = x >> 1 TEST_CASE(localvarShift3); // x << y @@ -2948,6 +2949,18 @@ private: ASSERT_EQUALS("", errout.str()); } + void localvarForEach() { + functionVariableUsage("void foo() {\n" + " int i = -1;\n" + " int a[] = {1,2,3};\n" + " FOREACH_X (int x, a) {\n" + " if (i==x) return x;\n" + " i = x;\n" + " }\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + } + void localvarShift1() { functionVariableUsage("int foo()\n" "{\n"