FwdAnalysis: Fix false negatives for struct members
This commit is contained in:
parent
30220fa7fc
commit
21eb1c5e22
|
@ -1137,8 +1137,16 @@ struct FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const
|
||||||
|
|
||||||
if (exprVarIds.find(tok->varId()) != exprVarIds.end()) {
|
if (exprVarIds.find(tok->varId()) != exprVarIds.end()) {
|
||||||
const Token *parent = tok;
|
const Token *parent = tok;
|
||||||
while (Token::Match(parent->astParent(), ".|::|["))
|
bool other = false;
|
||||||
|
while (Token::Match(parent->astParent(), ".|::|[")) {
|
||||||
parent = parent->astParent();
|
parent = parent->astParent();
|
||||||
|
if (Token::Match(parent, ". %var%") && parent->next()->varId() && exprVarIds.find(parent->next()->varId()) == exprVarIds.end()) {
|
||||||
|
other = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (other)
|
||||||
|
continue;
|
||||||
if (Token::simpleMatch(parent->astParent(), "=") && parent == parent->astParent()->astOperand1()) {
|
if (Token::simpleMatch(parent->astParent(), "=") && parent == parent->astParent()->astOperand1()) {
|
||||||
if (!local && hasFunctionCall(parent->astParent()->astOperand2())) {
|
if (!local && hasFunctionCall(parent->astParent()->astOperand2())) {
|
||||||
// TODO: this is a quick bailout
|
// TODO: this is a quick bailout
|
||||||
|
|
|
@ -5981,6 +5981,14 @@ private:
|
||||||
" x.a = _mm_set1_ps(2.0);\n"
|
" x.a = _mm_set1_ps(2.0);\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:8]: (style) Variable 'x.a' is reassigned a value before the old one has been used.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:8]: (style) Variable 'x.a' is reassigned a value before the old one has been used.\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" struct AB ab;\n"
|
||||||
|
" ab.x = 23;\n"
|
||||||
|
" ab.y = 41;\n"
|
||||||
|
" ab.x = 1;\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Variable 'ab.x' is reassigned a value before the old one has been used.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void redundantVarAssignment_7133() {
|
void redundantVarAssignment_7133() {
|
||||||
|
|
Loading…
Reference in New Issue