CheckUnusedVar: Fix FP for assignment in while
This commit is contained in:
parent
e69e952c46
commit
dea41e2390
|
@ -770,7 +770,6 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// bailout when for_each is used
|
// bailout when for_each is used
|
||||||
if (Token::Match(tok, "%name% (") && Token::simpleMatch(tok->linkAt(1), ") {") && !Token::Match(tok, "if|for|while|switch")) {
|
if (Token::Match(tok, "%name% (") && Token::simpleMatch(tok->linkAt(1), ") {") && !Token::Match(tok, "if|for|while|switch")) {
|
||||||
// does the name contain "for_each" or "foreach"?
|
// does the name contain "for_each" or "foreach"?
|
||||||
|
@ -861,9 +860,6 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (Token::Match(tok->tokAt(-2), "while|if") && tok->strAt(1) == "=" && tok->varId() && tok->varId() == tok->tokAt(2)->varId()) {
|
|
||||||
variables.use(tok->tokAt(2)->varId(), tok);
|
|
||||||
}
|
|
||||||
// assignment
|
// assignment
|
||||||
else if (Token::Match(tok, "*| ++|--| %name% ++|--| %assign%") ||
|
else if (Token::Match(tok, "*| ++|--| %name% ++|--| %assign%") ||
|
||||||
Token::Match(tok, "*| ( const| %type% *| ) %name% %assign%")) {
|
Token::Match(tok, "*| ( const| %type% *| ) %name% %assign%")) {
|
||||||
|
@ -893,6 +889,17 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
|
||||||
const unsigned int varid1 = tok->varId();
|
const unsigned int varid1 = tok->varId();
|
||||||
const Token * const start = tok;
|
const Token * const start = tok;
|
||||||
|
|
||||||
|
// assignment in while head..
|
||||||
|
bool inwhile = false;
|
||||||
|
{
|
||||||
|
const Token *parent = tok->astParent();
|
||||||
|
while (parent) {
|
||||||
|
if (Token::simpleMatch(parent->previous(), "while ("))
|
||||||
|
inwhile = true;
|
||||||
|
parent = parent->astParent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tok = doAssignment(variables, tok, dereference, scope);
|
tok = doAssignment(variables, tok, dereference, scope);
|
||||||
|
|
||||||
if (tok && tok->isAssignmentOp() && tok->str() != "=") {
|
if (tok && tok->isAssignmentOp() && tok->str() != "=") {
|
||||||
|
@ -914,7 +921,7 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
|
||||||
variables.read(varid1, tok);
|
variables.read(varid1, tok);
|
||||||
} else {
|
} else {
|
||||||
Variables::VariableUsage *var = variables.find(varid1);
|
Variables::VariableUsage *var = variables.find(varid1);
|
||||||
if (var && start->strAt(-1) == ",") {
|
if (var && (inwhile || start->strAt(-1) == ",")) {
|
||||||
variables.use(varid1, tok);
|
variables.use(varid1, tok);
|
||||||
} else if (var && var->_type == Variables::reference) {
|
} else if (var && var->_type == Variables::reference) {
|
||||||
variables.writeAliases(varid1, tok);
|
variables.writeAliases(varid1, tok);
|
||||||
|
|
|
@ -144,7 +144,6 @@ private:
|
||||||
TEST_CASE(localvarFor); // for ( ; var; )
|
TEST_CASE(localvarFor); // for ( ; var; )
|
||||||
TEST_CASE(localvarForEach); // #4155 - BOOST_FOREACH, hlist_for_each, etc
|
TEST_CASE(localvarForEach); // #4155 - BOOST_FOREACH, hlist_for_each, etc
|
||||||
TEST_CASE(localvarShift1); // 1 >> var
|
TEST_CASE(localvarShift1); // 1 >> var
|
||||||
TEST_CASE(localvarShift2); // x = x >> 1
|
|
||||||
TEST_CASE(localvarShift3); // x << y
|
TEST_CASE(localvarShift3); // x << y
|
||||||
TEST_CASE(localvarCast);
|
TEST_CASE(localvarCast);
|
||||||
TEST_CASE(localvarClass);
|
TEST_CASE(localvarClass);
|
||||||
|
@ -156,6 +155,7 @@ private:
|
||||||
TEST_CASE(localvarNULL); // #4203 - Setting NULL value is not redundant - it is safe
|
TEST_CASE(localvarNULL); // #4203 - Setting NULL value is not redundant - it is safe
|
||||||
TEST_CASE(localvarUnusedGoto); // #4447, #4558 goto
|
TEST_CASE(localvarUnusedGoto); // #4447, #4558 goto
|
||||||
TEST_CASE(localvarRangeBasedFor); // #7075
|
TEST_CASE(localvarRangeBasedFor); // #7075
|
||||||
|
TEST_CASE(localvarAssignInWhile);
|
||||||
|
|
||||||
TEST_CASE(localvarCpp11Initialization);
|
TEST_CASE(localvarCpp11Initialization);
|
||||||
|
|
||||||
|
@ -3238,15 +3238,6 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void localvarShift2() {
|
|
||||||
functionVariableUsage("int foo()\n"
|
|
||||||
"{\n"
|
|
||||||
" int var = 1;\n"
|
|
||||||
" while (var = var >> 1) { }\n"
|
|
||||||
"}");
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void localvarShift3() { // #3509
|
void localvarShift3() { // #3509
|
||||||
functionVariableUsage("int foo()\n"
|
functionVariableUsage("int foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
@ -3859,6 +3850,22 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void localvarAssignInWhile() {
|
||||||
|
functionVariableUsage("void foo() {\n"
|
||||||
|
" int a = 0;\n"
|
||||||
|
" do {\n"
|
||||||
|
" dostuff(a);\n"
|
||||||
|
" } while((a + = x) < 30);\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
functionVariableUsage("int foo() {\n"
|
||||||
|
" int var = 1;\n"
|
||||||
|
" while (var = var >> 1) { }\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void chainedAssignment() {
|
void chainedAssignment() {
|
||||||
// #5466
|
// #5466
|
||||||
functionVariableUsage("void NotUsed(double* pdD, int n) {\n"
|
functionVariableUsage("void NotUsed(double* pdD, int n) {\n"
|
||||||
|
|
Loading…
Reference in New Issue