| 1518 | } |
| 1519 | |
| 1520 | bool isUsedAsBool(const Token* const tok, const Settings& settings) |
| 1521 | { |
| 1522 | if (!tok) |
| 1523 | return false; |
| 1524 | if (isForLoopIncrement(tok)) |
| 1525 | return false; |
| 1526 | if (astIsBool(tok)) |
| 1527 | return true; |
| 1528 | if (Token::Match(tok, "!|&&|%oror%|%comp%")) |
| 1529 | return true; |
| 1530 | const Token* parent = tok->astParent(); |
| 1531 | if (!parent) |
| 1532 | return false; |
| 1533 | if (Token::simpleMatch(parent, "[")) |
| 1534 | return false; |
| 1535 | if (parent->isUnaryOp("*")) |
| 1536 | return false; |
| 1537 | if (Token::simpleMatch(parent, ".")) { |
| 1538 | if (astIsRHS(tok)) |
| 1539 | return isUsedAsBool(parent, settings); |
| 1540 | return false; |
| 1541 | } |
| 1542 | if (Token::Match(parent, "&&|!|%oror%")) |
| 1543 | return true; |
| 1544 | if (parent->isCast()) |
| 1545 | return !Token::simpleMatch(parent->astOperand1(), "dynamic_cast") && isUsedAsBool(parent, settings); |
| 1546 | if (parent->isUnaryOp("*")) |
| 1547 | return isUsedAsBool(parent, settings); |
| 1548 | if (Token::Match(parent, "==|!=") && tok->valueType() && tok->valueType()->pointer && |
| 1549 | tok->astSibling()->hasKnownIntValue() && tok->astSibling()->getKnownIntValue() == 0) |
| 1550 | return true; |
| 1551 | if (parent->str() == "(" && astIsRHS(tok) && Token::Match(parent->astOperand1(), "if|while")) |
| 1552 | return true; |
| 1553 | if (Token::simpleMatch(parent, "?") && astIsLHS(tok)) |
| 1554 | return true; |
| 1555 | if (isForLoopCondition(tok)) |
| 1556 | return true; |
| 1557 | if (!Token::Match(parent, "%cop%") && !(parent->str() == "(" && tok == parent->astOperand1())) { |
| 1558 | if (parent->str() == "," && parent->isInitComma()) |
| 1559 | return false; |
| 1560 | std::vector<ValueType> vtParents = getParentValueTypes(tok, settings); |
| 1561 | return std::any_of(vtParents.cbegin(), vtParents.cend(), [&](const ValueType& vt) { |
| 1562 | return vt.pointer == 0 && vt.type == ValueType::BOOL; |
| 1563 | }); |
| 1564 | } |
| 1565 | return false; |
| 1566 | } |
| 1567 | |
| 1568 | bool compareTokenFlags(const Token* tok1, const Token* tok2, bool macro) { |
| 1569 | if (macro) { |