[SMTChecker] correct handling of FixedBytes constants initialized with string literal

This commit is contained in:
Martin Blicha 2021-03-03 16:48:32 +01:00
parent be5647735e
commit 0340510c53
5 changed files with 22 additions and 2 deletions

View File

@ -7,8 +7,8 @@ Compiler Features:
Bugfixes:
* SMTChecker: Fix internal error on ``FixedBytes`` constant initialized with string literal.
* SMTChecker: Fix internal error on pushing to ``string`` casted to ``bytes``.
AST Changes:

View File

@ -260,6 +260,7 @@ public:
}
friend Expression operator==(Expression _a, Expression _b)
{
smtAssert(_a.sort->kind == _b.sort->kind, "Trying to create an 'equal' expression with different sorts");
return Expression("=", std::move(_a), std::move(_b), Kind::Bool);
}
friend Expression operator!=(Expression _a, Expression _b)

View File

@ -940,7 +940,7 @@ void SMTEncoder::endVisit(Identifier const& _identifier)
{
solAssert(decl->value(), "");
decl->value()->accept(*this);
defineExpr(_identifier, expr(*decl->value()));
defineExpr(_identifier, expr(*decl->value(), _identifier.annotation().type));
}
}
else

View File

@ -0,0 +1,10 @@
pragma experimental SMTChecker;
contract MockContract {
bytes4 public constant SENTINEL_ANY_MOCKS = hex"01";
mapping(bytes4 => bytes4) methodIdMocks;
constructor() {
methodIdMocks[SENTINEL_ANY_MOCKS] = 0;
}
}

View File

@ -0,0 +1,9 @@
pragma experimental SMTChecker;
contract MockContract {
bytes4 public constant SENTINEL_ANY_MOCKS = hex"01";
constructor() {
assert(SENTINEL_ANY_MOCKS >= 0);
}
}