diff --git a/lib/astutils.cpp b/lib/astutils.cpp index c91f41d9651..922c734511a 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -1546,8 +1546,8 @@ bool isUsedAsBool(const Token* const tok, const Settings& settings) return !Token::simpleMatch(parent->astOperand1(), "dynamic_cast") && isUsedAsBool(parent, settings); if (parent->isUnaryOp("*")) return isUsedAsBool(parent, settings); - if (Token::Match(parent, "==|!=") && (tok->astSibling()->isNumber() || tok->astSibling()->isKeyword()) && tok->astSibling()->hasKnownIntValue() && - tok->astSibling()->getKnownIntValue() == 0) + if (Token::Match(parent, "==|!=") && tok->valueType() && tok->valueType()->pointer && + tok->astSibling()->hasKnownIntValue() && tok->astSibling()->getKnownIntValue() == 0) return true; if (parent->str() == "(" && astIsRHS(tok) && Token::Match(parent->astOperand1(), "if|while")) return true; diff --git a/test/testcondition.cpp b/test/testcondition.cpp index ffeca5c5be7..10eb92578cc 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -3640,6 +3640,15 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2:16] -> [test.cpp:3:9]: (warning) Identical condition 'handle!=nullptr', second condition is always false [identicalConditionAfterEarlyExit]\n", errout_str()); + check("int f(const char* p) {\n" // #13717 + " if (p) {}\n" + " else if (!p) {}\n" + " else if (p == NULL) {}\n" + "}"); + ASSERT_EQUALS("[test.cpp:2:9] -> [test.cpp:3:14]: (style) Expression is always true because 'else if' condition is opposite to previous condition at line 2. [multiCondition]\n" + "[test.cpp:4:16]: (style) Expression is always false because 'else if' condition matches previous condition at line 3. [multiCondition]\n", + errout_str()); + check("void f(void* x, void* y) {\n" " if (x == nullptr && y == nullptr)\n" " return;\n"