| 491 | } |
| 492 | |
| 493 | template<class Value, REQUIRES("Value must ValueFlow::Value", std::is_convertible<Value&, const ValueFlow::Value&> )> |
| 494 | static bool evalAssignment(Value& lhsValue, const std::string& assign, const ValueFlow::Value& rhsValue) |
| 495 | { |
| 496 | bool error = false; |
| 497 | if (lhsValue.isSymbolicValue() && rhsValue.isIntValue()) { |
| 498 | if (assign != "+=" && assign != "-=") |
| 499 | return false; |
| 500 | assignValueIfMutable(lhsValue.intvalue, calculateAssign(assign, lhsValue.intvalue, rhsValue.intvalue, &error)); |
| 501 | } else if (lhsValue.isIntValue() && rhsValue.isIntValue()) { |
| 502 | assignValueIfMutable(lhsValue.intvalue, calculateAssign(assign, lhsValue.intvalue, rhsValue.intvalue, &error)); |
| 503 | } else if (lhsValue.isFloatValue() && rhsValue.isIntValue()) { |
| 504 | assignValueIfMutable(lhsValue.floatValue, |
| 505 | calculateAssign(assign, lhsValue.floatValue, rhsValue.intvalue, &error)); |
| 506 | } else { |
| 507 | return false; |
| 508 | } |
| 509 | return !error; |
| 510 | } |
| 511 | |
| 512 | const Token* findMatch(const Token* tok) const |
| 513 | { |
no test coverage detected