From e5e6f37e416d2d95ca68adb971c3f40de2fd1b3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Tue, 5 Sep 2017 22:03:29 +0200 Subject: [PATCH] Fixed #7405 (false positive: (warning) Opposite conditions in nested 'if' blocks lead to a dead code block.) --- lib/checkcondition.cpp | 7 +++++++ test/testcondition.cpp | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 206c178da..fcec7bb3f 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -593,6 +593,13 @@ void CheckCondition::multiCondition2() (!tok->varId() && nonlocal)) { if (Token::Match(tok, "%name% %assign%|++|--")) break; + if (Token::Match(tok->astParent(), "*|.|[")) { + const Token *parent = tok; + while (Token::Match(parent->astParent(), ".|[") || (Token::simpleMatch(parent->astParent(), "*") && !parent->astParent()->astOperand2())) + parent = parent->astParent(); + if (Token::Match(parent->astParent(), "%assign%")) + break; + } if (Token::Match(tok, "%name% <<|>>") && (!tok->valueType() || !tok->valueType()->isIntegral())) break; if (Token::Match(tok, "%name% [")) { diff --git a/test/testcondition.cpp b/test/testcondition.cpp index ae45a786c..8dc0f7c3b 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -1522,6 +1522,13 @@ private: "}"); ASSERT_EQUALS("", errout.str()); + check("void test(float *f) {\n" // #7405 + " if(*f>10) {\n" + " (*f) += 0.1f;\n" + " if(*f<10) {}\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout.str()); } void oppositeInnerConditionClass() {