| 824 | } |
| 825 | |
| 826 | static bool bifurcate(const Token* tok, const std::set<nonneg int>& varids, const Settings& settings, int depth) |
| 827 | { |
| 828 | if (depth < 0) |
| 829 | return false; |
| 830 | if (!tok) |
| 831 | return true; |
| 832 | if (tok->hasKnownIntValue()) |
| 833 | return true; |
| 834 | if (tok->isConstOp()) |
| 835 | return bifurcate(tok->astOperand1(), varids, settings, depth) && bifurcate(tok->astOperand2(), varids, settings, depth); |
| 836 | if (tok->varId() != 0) { |
| 837 | if (varids.count(tok->varId()) > 0) |
| 838 | return true; |
| 839 | const Variable* var = tok->variable(); |
| 840 | if (!var) |
| 841 | return false; |
| 842 | if (!var->isLocal() && !var->isArgument()) |
| 843 | return false; |
| 844 | const Token* start = var->declEndToken(); |
| 845 | if (!start) |
| 846 | return false; |
| 847 | if (start->strAt(-1) == ")" || start->strAt(-1) == "}") |
| 848 | return false; |
| 849 | if (Token::Match(start, "; %varid% =", var->declarationId())) |
| 850 | start = start->tokAt(2); |
| 851 | if (var->isConst() || !bifurcateVariableChanged(var, varids, start, tok, settings, depth)) |
| 852 | return var->isArgument() || bifurcate(start->astOperand2(), varids, settings, depth - 1); |
| 853 | return false; |
| 854 | } |
| 855 | return false; |
| 856 | } |
| 857 | |
| 858 | // Check if its an alias of the variable or is being aliased to this variable |
| 859 | template<typename V> |
no test coverage detected