mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix IR bug on deleting storage variables of function type.
Calling the zeroing function assumed that the stack slots needed for the type was always 1. This is false for function types.
This commit is contained in:
parent
6fd5ea01d1
commit
2c2c7a4473
@ -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)
|
||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user