mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix Yul codegen when dynamic array is used as rhs of assignment
This commit is contained in:
parent
d55bbd4aa5
commit
0fcb1427c9
@ -1588,7 +1588,7 @@ void IRGeneratorForStatements::writeToLValue(IRLValue const& _lvalue, IRVariable
|
||||
solAssert(dynamic_cast<ReferenceType const*>(&_lvalue.type), "");
|
||||
auto const* valueReferenceType = dynamic_cast<ReferenceType const*>(&_value.type());
|
||||
solAssert(valueReferenceType && valueReferenceType->dataStoredIn(DataLocation::Memory), "");
|
||||
m_code << "mstore(" + _memory.address + ", " + _value.name() + ")\n";
|
||||
m_code << "mstore(" + _memory.address + ", " + _value.part("mpos").name() + ")\n";
|
||||
}
|
||||
},
|
||||
[&](IRLValue::Stack const& _stack) { assign(_stack.variable, _value); },
|
||||
|
@ -0,0 +1,14 @@
|
||||
contract C {
|
||||
function f(uint n) public pure returns (uint) {
|
||||
uint[][] memory a = new uint[][](2);
|
||||
for (uint i = 0; i < 2; ++i)
|
||||
a[i] = new uint[](3);
|
||||
a[1][1] = n;
|
||||
uint[] memory b = a[1];
|
||||
return b[1];
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(uint256): 42 -> 42
|
12
test/libsolidity/semanticTests/viaYul/array_2d_new.sol
Normal file
12
test/libsolidity/semanticTests/viaYul/array_2d_new.sol
Normal file
@ -0,0 +1,12 @@
|
||||
contract C {
|
||||
function f(uint n) public pure returns (uint) {
|
||||
uint[][] memory a = new uint[][](2);
|
||||
for (uint i = 0; i < 2; ++i)
|
||||
a[i] = new uint[](3);
|
||||
return a[0][0] = n;
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(uint256): 42 -> 42
|
@ -0,0 +1,19 @@
|
||||
contract C {
|
||||
function f(uint n) public pure returns (uint) {
|
||||
uint[][][] memory a = new uint[][][](2);
|
||||
for (uint i = 0; i < 2; ++i)
|
||||
{
|
||||
a[i] = new uint[][](3);
|
||||
for (uint j = 0; j < 3; ++j)
|
||||
a[i][j] = new uint[](4);
|
||||
}
|
||||
a[1][1][1] = n;
|
||||
uint[][] memory b = a[1];
|
||||
uint[] memory c = b[1];
|
||||
return c[1];
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(uint256): 42 -> 42
|
16
test/libsolidity/semanticTests/viaYul/array_3d_new.sol
Normal file
16
test/libsolidity/semanticTests/viaYul/array_3d_new.sol
Normal file
@ -0,0 +1,16 @@
|
||||
contract C {
|
||||
function f(uint n) public pure returns (uint) {
|
||||
uint[][][] memory a = new uint[][][](2);
|
||||
for (uint i = 0; i < 2; ++i)
|
||||
{
|
||||
a[i] = new uint[][](3);
|
||||
for (uint j = 0; j < 3; ++j)
|
||||
a[i][j] = new uint[](4);
|
||||
}
|
||||
return a[1][1][1] = n;
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(uint256): 42 -> 42
|
Loading…
Reference in New Issue
Block a user