diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 2c01884c9ef..455b0cd67c2 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -1371,10 +1371,23 @@ static bool isForLoopCondition(const Token * const tok) parent->astParent()->astParent()->astOperand1()->str() == "for"; } +static bool isForLoopIncrement(const Token* const tok) +{ + if (!tok) + return false; + const Token *const parent = tok->astParent(); + return Token::simpleMatch(parent, ";") && parent->astOperand2() == tok && + Token::simpleMatch(parent->astParent(), ";") && + Token::simpleMatch(parent->astParent()->astParent(), "(") && + parent->astParent()->astParent()->astOperand1()->str() == "for"; +} + bool isUsedAsBool(const Token* const tok) { if (!tok) return false; + if (isForLoopIncrement(tok)) + return false; if (astIsBool(tok)) return true; if (Token::Match(tok, "!|&&|%oror%|%comp%")) diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 974637af0f7..81994ef7fc4 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -4973,6 +4973,13 @@ class TestCondition : public TestFixture { " }\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + check("void f() {\n" // #11434 + " const int N = 5;\n" + " bool a[N];\n" + " for (int i = 0; i < N; a[i++] = false);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void alwaysTrueTryCatch()