diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index be7194ece..d9c50d040 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -95,8 +95,12 @@ static bool bailoutFunctionPar(const Token *tok, const ValueFlow::Value &value, static const Token * skipValueInConditionalExpression(const Token * const valuetok) { // Walk up the ast + const Token *prev = valuetok; for (const Token *tok = valuetok->astParent(); tok; tok = tok->astParent()) { - if (!Token::Match(tok, "%oror%|&&|?|:")) + const bool prevIsLhs = (prev == tok->astOperand1()); + prev = tok; + + if (prevIsLhs || !Token::Match(tok, "%oror%|&&|?|:")) continue; // Is variable protected in LHS.. diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 6896d8501..2110bd3ca 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -350,9 +350,9 @@ private: " if (x != NULL) { }\n" "}"; ASSERT_EQUALS(true, testValueOfX(code, 2U, 0)); - TODO_ASSERT_EQUALS(true, false, testValueOfX(code, 3U, 0)); - ASSERT_EQUALS(false, testValueOfX(code, 3U, 0)); - ASSERT_EQUALS(false, testValueOfX(code, 3U, 0)); + ASSERT_EQUALS(true, testValueOfX(code, 3U, 0)); + ASSERT_EQUALS(false, testValueOfX(code, 4U, 0)); + ASSERT_EQUALS(false, testValueOfX(code, 5U, 0)); bailout("void f(int x) {\n" " if (x != 123) { b = x; }\n"