Fixed #6996 (ValueFlow: known and possible values)
This commit is contained in:
parent
f5bd00f153
commit
3bc21b8138
|
@ -358,6 +358,11 @@ static bool isVariableChanged(const Token *start, const Token *end, const unsign
|
||||||
/** Add token value. Return true if value is added. */
|
/** Add token value. Return true if value is added. */
|
||||||
static bool addValue(Token *tok, const ValueFlow::Value &value)
|
static bool addValue(Token *tok, const ValueFlow::Value &value)
|
||||||
{
|
{
|
||||||
|
if (value.isKnown()) {
|
||||||
|
// Clear all other values since value is known
|
||||||
|
tok->values.clear();
|
||||||
|
}
|
||||||
|
|
||||||
// if value already exists, don't add it again
|
// if value already exists, don't add it again
|
||||||
std::list<ValueFlow::Value>::iterator it;
|
std::list<ValueFlow::Value>::iterator it;
|
||||||
for (it = tok->values.begin(); it != tok->values.end(); ++it) {
|
for (it = tok->values.begin(); it != tok->values.end(); ++it) {
|
||||||
|
|
|
@ -1775,6 +1775,15 @@ private:
|
||||||
value = valueOfTok(code, "+");
|
value = valueOfTok(code, "+");
|
||||||
ASSERT_EQUALS(13, value.intvalue);
|
ASSERT_EQUALS(13, value.intvalue);
|
||||||
ASSERT(value.isPossible());
|
ASSERT(value.isPossible());
|
||||||
|
|
||||||
|
// known and possible value
|
||||||
|
code = "void f() {\n"
|
||||||
|
" int x = 1;\n"
|
||||||
|
" int y = 2 + x;\n" // <- known value, don't care about condition
|
||||||
|
" if (x == 2) {}\n"
|
||||||
|
"}";
|
||||||
|
ASSERT_EQUALS(true, testValueOfX(code, 3U, 1)); // value of x can be 1
|
||||||
|
ASSERT_EQUALS(false, testValueOfX(code, 3U, 2)); // value of x can't be 2
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue