| 2226 | } |
| 2227 | |
| 2228 | smtutil::Expression SMTEncoder::compoundAssignment(Assignment const& _assignment) |
| 2229 | { |
| 2230 | static std::map<Token, Token> const compoundToArithmetic{ |
| 2231 | {Token::AssignAdd, Token::Add}, |
| 2232 | {Token::AssignSub, Token::Sub}, |
| 2233 | {Token::AssignMul, Token::Mul}, |
| 2234 | {Token::AssignDiv, Token::Div}, |
| 2235 | {Token::AssignMod, Token::Mod} |
| 2236 | }; |
| 2237 | static std::map<Token, Token> const compoundToBitwise{ |
| 2238 | {Token::AssignBitAnd, Token::BitAnd}, |
| 2239 | {Token::AssignBitOr, Token::BitOr}, |
| 2240 | {Token::AssignBitXor, Token::BitXor}, |
| 2241 | {Token::AssignShl, Token::SHL}, |
| 2242 | {Token::AssignShr, Token::SHR}, |
| 2243 | {Token::AssignSar, Token::SAR} |
| 2244 | }; |
| 2245 | Token op = _assignment.assignmentOperator(); |
| 2246 | solAssert(compoundToArithmetic.count(op) || compoundToBitwise.count(op), ""); |
| 2247 | |
| 2248 | auto decl = identifierToVariable(_assignment.leftHandSide()); |
| 2249 | |
| 2250 | if (compoundToBitwise.count(op)) |
| 2251 | return bitwiseOperation( |
| 2252 | compoundToBitwise.at(op), |
| 2253 | decl ? currentValue(*decl) : expr(_assignment.leftHandSide(), _assignment.annotation().type), |
| 2254 | expr(_assignment.rightHandSide(), _assignment.annotation().type), |
| 2255 | _assignment.annotation().type |
| 2256 | ); |
| 2257 | |
| 2258 | auto values = arithmeticOperation( |
| 2259 | compoundToArithmetic.at(op), |
| 2260 | decl ? currentValue(*decl) : expr(_assignment.leftHandSide(), _assignment.annotation().type), |
| 2261 | expr(_assignment.rightHandSide(), _assignment.annotation().type), |
| 2262 | _assignment.annotation().type, |
| 2263 | _assignment |
| 2264 | ); |
| 2265 | return values.first; |
| 2266 | } |
| 2267 | |
| 2268 | void SMTEncoder::expressionToTupleAssignment(std::vector<std::shared_ptr<VariableDeclaration>> const& _variables, Expression const& _rhs) |
| 2269 | { |
nothing calls this directly
no test coverage detected