| 3514 | } |
| 3515 | |
| 3516 | ExprUsage getExprUsage(const Token* tok, int indirect, const Settings& settings) |
| 3517 | { |
| 3518 | const Token* parent = tok->astParent(); |
| 3519 | if (indirect > 0 && parent) { |
| 3520 | while (Token::simpleMatch(parent, "[") && parent->astParent()) |
| 3521 | parent = parent->astParent(); |
| 3522 | if (Token::Match(parent, "%assign%") && (astIsRHS(tok) || astIsLHS(parent->astOperand1()))) |
| 3523 | return ExprUsage::NotUsed; |
| 3524 | if (Token::Match(parent, "++|--")) |
| 3525 | return ExprUsage::NotUsed; |
| 3526 | if (parent->isConstOp()) |
| 3527 | return ExprUsage::NotUsed; |
| 3528 | if (parent->isCast()) |
| 3529 | return ExprUsage::NotUsed; |
| 3530 | if (Token::simpleMatch(parent, ":") && Token::simpleMatch(parent->astParent(), "?")) |
| 3531 | return getExprUsage(parent->astParent(), indirect, settings); |
| 3532 | if (isUsedAsBool(tok, settings)) |
| 3533 | return ExprUsage::NotUsed; |
| 3534 | } |
| 3535 | if (tok->isUnaryOp("&") && !parent) |
| 3536 | return ExprUsage::NotUsed; |
| 3537 | if (indirect == 0) { |
| 3538 | if (Token::Match(parent, "%cop%|%assign%|++|--") && parent->str() != "=" && |
| 3539 | !parent->isUnaryOp("&") && |
| 3540 | !(astIsRHS(tok) && isLikelyStreamRead(parent))) |
| 3541 | return ExprUsage::Used; |
| 3542 | if (isLeafDot(tok)) { |
| 3543 | const Token* op = parent->astParent(); |
| 3544 | while (Token::simpleMatch(op, ".")) |
| 3545 | op = op->astParent(); |
| 3546 | if (Token::Match(op, "%assign%|++|--")) { |
| 3547 | if (op->str() == "=") { |
| 3548 | if (precedes(tok, op)) |
| 3549 | return ExprUsage::NotUsed; |
| 3550 | } else |
| 3551 | return ExprUsage::Used; |
| 3552 | } |
| 3553 | } |
| 3554 | if (Token::simpleMatch(parent, "=") && astIsRHS(tok)) { |
| 3555 | const Token* const lhs = parent->astOperand1(); |
| 3556 | if (lhs && lhs->variable() && lhs->variable()->isReference() && lhs == lhs->variable()->nameToken()) |
| 3557 | return ExprUsage::NotUsed; |
| 3558 | return ExprUsage::Used; |
| 3559 | } |
| 3560 | // Function call or index |
| 3561 | if (((Token::simpleMatch(parent, "(") && !parent->isCast()) || (Token::simpleMatch(parent, "[") && tok->valueType())) && |
| 3562 | (astIsLHS(tok) || Token::simpleMatch(parent, "( )"))) |
| 3563 | return ExprUsage::Used; |
| 3564 | } |
| 3565 | return getFunctionUsage(tok, indirect, settings); |
| 3566 | } |
| 3567 | |
| 3568 | static void getLHSVariablesRecursive(std::vector<const Variable*>& vars, const Token* tok) |
| 3569 | { |
no test coverage detected