@@ -1575,10 +1575,19 @@ void CheckConditionImpl::alwaysTrueFalse()
15751575 continue ;
15761576 if (Token::simpleMatch (tok->astParent (), " return" ) && Token::Match (tok, " .|%var%" ))
15771577 continue ;
1578- if (Token::Match (tok, " %num%|%bool%|%char%" ))
1579- continue ;
1580- if (Token::Match (tok, " ! %num%|%bool%|%char%" ))
1581- continue ;
1578+ bool warnForNumber = false ;
1579+ if (Token::Match (tok, " %num%|%bool%|%char%" )) {
1580+ const bool isZeroOrOne = (tok->getKnownIntValue () >> 1 ) == 0 ;
1581+ warnForNumber = !isZeroOrOne && tok->tokType () == Token::eNumber && tok->astParent () == condition->astParent ();
1582+ if (!warnForNumber)
1583+ continue ;
1584+ }
1585+ if (Token::Match (tok, " ! %num%|%bool%|%char%" )) {
1586+ const bool isZeroOrOne = tok->next ()->hasKnownIntValue () && (tok->next ()->getKnownIntValue () >> 1 ) == 0 ;
1587+ warnForNumber = !isZeroOrOne && tok->next ()->tokType () == Token::eNumber && tok->astParent () == condition->astParent ();
1588+ if (!warnForNumber)
1589+ continue ;
1590+ }
15821591 if (Token::Match (tok, " %oror%|&&" )) {
15831592 bool bail = false ;
15841593 for (const Token* op : { tok->astOperand1 (), tok->astOperand2 () }) {
@@ -1603,7 +1612,7 @@ void CheckConditionImpl::alwaysTrueFalse()
16031612 true ))
16041613 continue ;
16051614
1606- if (!pedantic && isConstVarExpression (tok, [](const Token* tok) {
1615+ if (!pedantic && !warnForNumber && isConstVarExpression (tok, [](const Token* tok) {
16071616 return Token::Match (tok, " [|(|&|+|-|*|/|%|^|>>|<<" ) && !Token::simpleMatch (tok, " ( )" );
16081617 }))
16091618 continue ;
0 commit comments