From 893996d182fcf4ce07af8867a9afad39b116e653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 29 Jun 2014 10:57:39 +0200 Subject: [PATCH] Fixed #5937 (ValueFlow: wrong analysis of calculations with different variable operands) --- lib/valueflow.cpp | 2 ++ test/testvalueflow.cpp | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 3ade624d7..21476ed51 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -245,6 +245,8 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value) tok->values.push_back(value); it = tok->values.end(); --it; + if (it->varId == 0) + it->varId = tok->varId(); } Token *parent = const_cast(tok->astParent()); diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index ac15c79f4..e1ef4306e 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -169,6 +169,22 @@ private: " f(7);\n" "}"; ASSERT_EQUALS(15, valueOfTok(code, "+").intvalue); + + code = "void f(int x, int y) {\n" + " a = x + y;\n" + "}\n" + "void callf() {\n" + " f(1,1);\n" + " f(10,10);\n" + "}"; + values = tokenValues(code, "+"); + ASSERT_EQUALS(true, values.empty()); + if (!values.empty()) { + /* todo.. */ + ASSERT_EQUALS(2U, values.size()); + ASSERT_EQUALS(2, values.front().intvalue); + ASSERT_EQUALS(22, values.back().intvalue); + } } void valueFlowBeforeCondition() {