Merge pull request #11003 from ethereum/ir-bug-incorrect-return-variable-count

Fix IR bug on deleting storage variables of function type.
This commit is contained in:
chriseth 2021-02-24 13:24:31 +01:00 committed by GitHub
commit 2d48052ae5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 1 deletions

View File

@ -3888,11 +3888,13 @@ string YulUtilFunctions::storageSetToZeroFunction(Type const& _type)
if (_type.isValueType())
return Whiskers(R"(
function <functionName>(slot, offset) {
<store>(slot, offset, <zeroValue>())
let <values> := <zeroValue>()
<store>(slot, offset, <values>)
}
)")
("functionName", functionName)
("store", updateStorageValueFunction(_type, _type))
("values", suffixedVariableNameList("zero_", 0, _type.sizeOnStack()))
("zeroValue", zeroValueFunction(_type))
.render();
else if (_type.category() == Type::Category::Array)

View File

@ -0,0 +1,39 @@
contract C {
function() external public x;
uint public y = 0;
function increment() public {
++y;
}
function set() external {
x = this.increment;
}
function incrementIndirectly() public {
x();
}
function deleteFunction() public {
// used to lead to an ICE during IR
delete x;
}
}
// ====
// compileViaYul: also
// ----
// x() -> 0
// y() -> 0
// increment() ->
// y() -> 1
// set() ->
// x() -> 0xfdd67305928fcac8d213d1e47bfa6165cd0b87bd09de08a0000000000000000
// increment() ->
// y() -> 2
// incrementIndirectly() ->
// y() -> 3
// deleteFunction() ->
// increment() ->
// y() -> 4
// incrementIndirectly() -> FAILURE
// y() -> 4