diff --git a/lib/vf_settokenvalue.cpp b/lib/vf_settokenvalue.cpp index fe94225083b..315f4a40129 100644 --- a/lib/vf_settokenvalue.cpp +++ b/lib/vf_settokenvalue.cpp @@ -613,7 +613,7 @@ namespace ValueFlow } // unary minus - else if (parent->isUnaryOp("-")) { + else if (parent->isUnaryOp("-") && !astIsUnsigned(parent)) { for (const Value &val : tok->values()) { if (!val.isIntValue() && !val.isFloatValue()) continue; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 0c8addb3b94..6a1ebe9d95e 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -1261,6 +1261,12 @@ class TestValueFlow : public TestFixture { ASSERT_EQUALS(1U, values.size()); ASSERT_EQUALS(-10, values.back().intvalue); + code = "bool f(unsigned a) {\n" // #14848 + " bool x = -a < 1;\n" + " return x;\n" + "}"; + ASSERT_EQUALS(false, testValueOfXKnown(code, 3U, 1)); + // Logical and code = "void f(bool b) {\n" " bool x = false && b;\n"