diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index c87d12b3c..5d8ad45bf 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -1158,9 +1158,14 @@ static bool valueFlowForward(Token * const startToken, errorLogger, settings); - if (isVariableChanged(startToken1, startToken1->link(), varid)) + if (isVariableChanged(startToken1, startToken1->link(), varid)) { removeValues(values, truevalues); + std::list::iterator it; + for (it = values.begin(); it != values.end(); ++it) + it->changeKnownToPossible(); + } + // goto '}' tok2 = startToken1->link(); diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index d4bc03324..a2aeaf2a0 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -1754,13 +1754,25 @@ private: ASSERT_EQUALS(3, value.intvalue); ASSERT(value.isKnown()); - code = "void f() {\n" - " int x = 15;\n" - " if (x == 15) { x += 7; }\n" // <- condition is true - "}"; - value = valueOfTok(code, "=="); - ASSERT_EQUALS(1, value.intvalue); - ASSERT(value.isKnown()); + { + code = "void f() {\n" + " int x = 15;\n" + " if (x == 15) { x += 7; }\n" // <- condition is true + "}"; + value = valueOfTok(code, "=="); + ASSERT_EQUALS(1, value.intvalue); + ASSERT(value.isKnown()); + + code = "int f() {\n" + " int a = 0, x = 0;\n" + " a = index();\n" + " if (a != 0)\n" + " x = next();\n" + " return x + 1;\n" + "}\n"; + value = valueOfTok(code, "+"); + ASSERT(value.isPossible()); + } code = "void f() {\n" " int x;\n"