diff --git a/libsolidity/formal/SMTEncoder.cpp b/libsolidity/formal/SMTEncoder.cpp index cacf83c95..9e572b536 100644 --- a/libsolidity/formal/SMTEncoder.cpp +++ b/libsolidity/formal/SMTEncoder.cpp @@ -1498,22 +1498,6 @@ void SMTEncoder::arrayAssignment() void SMTEncoder::indexOrMemberAssignment(Expression const& _expr, smtutil::Expression const& _rightHandSide) { - if (auto const* memberAccess = dynamic_cast(&_expr)) - { - if (dynamic_cast(expressionToDeclaration(memberAccess->expression()))) - { - if (auto const* var = dynamic_cast(memberAccess->annotation().referencedDeclaration)) - { - if (var->hasReferenceOrMappingType()) - resetReferences(*var); - - assignment(*var, _rightHandSide); - defineExpr(_expr, currentValue(*var)); - return; - } - } - } - auto toStore = _rightHandSide; auto const* lastExpr = &_expr; while (true) @@ -1556,6 +1540,14 @@ void SMTEncoder::indexOrMemberAssignment(Expression const& _expr, smtutil::Expre ); return; } + if (auto varDecl = identifierToVariable(*memberAccess)) + { + if (varDecl->hasReferenceOrMappingType()) + resetReferences(*varDecl); + + assignment(*varDecl, toStore); + break; + } auto symbStruct = dynamic_pointer_cast(m_context.expression(base)); solAssert(symbStruct, ""); @@ -2680,6 +2672,14 @@ VariableDeclaration const* SMTEncoder::identifierToVariable(Expression const& _e solAssert(m_context.knownVariable(*varDecl), ""); return varDecl; } + // But we are interested in "contract.var", because that is the same as just "var". + if (auto const* memberAccess = dynamic_cast(&_expr)) + if (dynamic_cast(expressionToDeclaration(memberAccess->expression()))) + if (auto const* varDecl = dynamic_cast(memberAccess->annotation().referencedDeclaration)) + { + solAssert(m_context.knownVariable(*varDecl), ""); + return varDecl; + } return nullptr; } diff --git a/test/libsolidity/smtCheckerTests/operators/assignment_contract_member_variable_array_2.sol b/test/libsolidity/smtCheckerTests/operators/assignment_contract_member_variable_array_2.sol new file mode 100644 index 000000000..fd69af542 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/operators/assignment_contract_member_variable_array_2.sol @@ -0,0 +1,8 @@ +pragma experimental SMTChecker; +contract A { + int[] a; + function f() public { + A.a[0] = 2; + } +} +