diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index e824ba75a5a..fdf7394aa3a 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -3682,7 +3682,7 @@ static void valueFlowSymbolicOperators(const SymbolDatabase& symboldatabase, con continue; if (vartok->exprId() == 0) continue; - if (Token::Match(tok, "<<|>>|/") && !astIsLHS(vartok)) + if (Token::Match(tok, "<<|>>|/|-") && !astIsLHS(vartok)) continue; if (Token::Match(tok, "<<|>>|^|+|-|%or%") && constant->intvalue != 0) continue; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 6eb807bdd11..36410a60508 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -8910,6 +8910,18 @@ class TestValueFlow : public TestFixture { " return x;\n" "}\n"; ASSERT_EQUALS(false, testValueOfXKnown(code, 3U, "a", 0)); + + code = "void f(int n) {\n" + " int x = 0 - n;\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(false, testValueOfX(code, 3U, "n", ValueFlow::Value::ValueType::SYMBOLIC)); + + code = "void f(int n) {\n" + " int x = n - 0;\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfX(code, 3U, "n", ValueFlow::Value::ValueType::SYMBOLIC)); } void valueFlowSymbolicStrlen()