diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 79d4a6dc9..fe788b5dd 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -2885,12 +2885,18 @@ static void valueFlowSwitchVariable(TokenList *tokenlist, SymbolDatabase* symbol std::list values; values.push_back(ValueFlow::Value(MathLib::toLongNumber(tok->next()->str()))); values.back().condition = tok; + const std::string info("case " + tok->next()->str() + ": " + vartok->str() + " is " + tok->next()->str() + " here."); + values.back().errorPath.push_back(ErrorPathItem(tok, info)); + if ((Token::simpleMatch(tok->previous(), "{") || Token::simpleMatch(tok->tokAt(-2), "break ;")) && !Token::Match(tok->tokAt(3), ";| case")) + values.back().setKnown(); while (Token::Match(tok->tokAt(3), ";| case %num% :")) { tok = tok->tokAt(3); if (!tok->isName()) tok = tok->next(); values.push_back(ValueFlow::Value(MathLib::toLongNumber(tok->next()->str()))); values.back().condition = tok; + const std::string info2("case " + tok->next()->str() + ": " + vartok->str() + " is " + tok->next()->str() + " here."); + values.back().errorPath.push_back(ErrorPathItem(tok, info2)); } for (std::list::const_iterator val = values.begin(); val != values.end(); ++val) { valueFlowReverse(tokenlist, @@ -2902,7 +2908,7 @@ static void valueFlowSwitchVariable(TokenList *tokenlist, SymbolDatabase* symbol settings); } if (vartok->variable()->scope()) // #7257 - valueFlowForward(tok, vartok->variable()->scope()->classEnd, vartok->variable(), vartok->varId(), values, false, false, tokenlist, errorLogger, settings); + valueFlowForward(tok->tokAt(3), vartok->variable()->scope()->classEnd, vartok->variable(), vartok->varId(), values, values.back().isKnown(), false, tokenlist, errorLogger, settings); } } } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 8bdd2d4c4..36f0ad918 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -1875,13 +1875,18 @@ private: code = "void f(int x) {\n" " a = x;\n" // <- x can be 14 " switch (x) {\n" - " case 14: a=x; break;\n" // <- x is 14 + " case 14: a=x+2; break;\n" // <- x is 14 " };\n" " a = x;\n" // <- x can be 14 "}"; ASSERT_EQUALS(true, testConditionalValueOfX(code, 2U, 14)); ASSERT_EQUALS(true, testConditionalValueOfX(code, 4U, 14)); ASSERT_EQUALS(true, testConditionalValueOfX(code, 6U, 14)); + + ValueFlow::Value value = valueOfTok(code, "+"); + ASSERT_EQUALS(16, value.intvalue); + ASSERT(value.isKnown()); + } void valueFlowForLoop() {