diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 03b1cd75056..a0799b4b41c 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -317,8 +317,15 @@ void CheckCondition::checkBadBitmaskCheck() const bool isZero1 = (tok->astOperand1()->hasKnownIntValue() && tok->astOperand1()->values().front().intvalue == 0); const bool isZero2 = (tok->astOperand2()->hasKnownIntValue() && tok->astOperand2()->values().front().intvalue == 0); + if (!isZero1 && !isZero2) + continue; - if ((isZero1 || isZero2) && !tok->isExpandedMacro() && !(isZero1 && tok->astOperand1()->isExpandedMacro()) && !(isZero2 && tok->astOperand2()->isExpandedMacro())) + auto isOperandExpanded = [](const Token *op) { + return op->isExpandedMacro() || op->isEnumerator(); + }; + if (!tok->isExpandedMacro() && + !(isZero1 && isOperandExpanded(tok->astOperand1())) && + !(isZero2 && isOperandExpanded(tok->astOperand2()))) badBitmaskCheckError(tok, /*isNoOp*/ true); } } diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 436878c1819..c9e33172da1 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -912,6 +912,11 @@ class TestCondition : public TestFixture { "#endif\n" " 0;"); ASSERT_EQUALS("", errout.str()); + + check("enum precedence { PC0, UNARY };\n" + "int x = PC0 | UNARY;\n" + "int y = UNARY | PC0;\n"); + ASSERT_EQUALS("", errout.str()); }