Skip to content

Commit b5986f6

Browse files
committed
Fixed #7358 (valueflow: value is not known after conditional assignment)
1 parent 477d02b commit b5986f6

2 files changed

Lines changed: 25 additions & 8 deletions

File tree

lib/valueflow.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1158,9 +1158,14 @@ static bool valueFlowForward(Token * const startToken,
11581158
errorLogger,
11591159
settings);
11601160

1161-
if (isVariableChanged(startToken1, startToken1->link(), varid))
1161+
if (isVariableChanged(startToken1, startToken1->link(), varid)) {
11621162
removeValues(values, truevalues);
11631163

1164+
std::list<ValueFlow::Value>::iterator it;
1165+
for (it = values.begin(); it != values.end(); ++it)
1166+
it->changeKnownToPossible();
1167+
}
1168+
11641169
// goto '}'
11651170
tok2 = startToken1->link();
11661171

test/testvalueflow.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,13 +1754,25 @@ class TestValueFlow : public TestFixture {
17541754
ASSERT_EQUALS(3, value.intvalue);
17551755
ASSERT(value.isKnown());
17561756

1757-
code = "void f() {\n"
1758-
" int x = 15;\n"
1759-
" if (x == 15) { x += 7; }\n" // <- condition is true
1760-
"}";
1761-
value = valueOfTok(code, "==");
1762-
ASSERT_EQUALS(1, value.intvalue);
1763-
ASSERT(value.isKnown());
1757+
{
1758+
code = "void f() {\n"
1759+
" int x = 15;\n"
1760+
" if (x == 15) { x += 7; }\n" // <- condition is true
1761+
"}";
1762+
value = valueOfTok(code, "==");
1763+
ASSERT_EQUALS(1, value.intvalue);
1764+
ASSERT(value.isKnown());
1765+
1766+
code = "int f() {\n"
1767+
" int a = 0, x = 0;\n"
1768+
" a = index();\n"
1769+
" if (a != 0)\n"
1770+
" x = next();\n"
1771+
" return x + 1;\n"
1772+
"}\n";
1773+
value = valueOfTok(code, "+");
1774+
ASSERT(value.isPossible());
1775+
}
17641776

17651777
code = "void f() {\n"
17661778
" int x;\n"

0 commit comments

Comments
 (0)