Solidity documentation 0.8.14:
push():
Dynamic storage arrays and bytes (not string) have a member function called push() that you can use to append a zero-initialised element at the end of the array. It returns a reference to the element, so that it can be used like x.push().t = 2 or x.push() = b.
My contract:
pragma solidity ^0.8.0;
contract Demo {
uint[] public storageDynamicUintArray;
struct A {
uint a;
}
A[] public storageDynamicArrayOfA;
function pushToStorageDynamicUintArray() public {
require(storageDynamicUintArray.length == 0, "storageDynamicUintArray.length == 0");
uint item = storageDynamicUintArray.push(); // item is reference or new variable?
require(storageDynamicUintArray.length == 1, "storageDynamicUintArray.length == 1");
item = 1;
require(item == 1, "item == 1");
require(storageDynamicUintArray[0] == 0, "storageDynamicUintArray[0] == 0");
}
function pushToStorageDynamicArrayOfA() public {
require(storageDynamicArrayOfA.length == 0, "storageDynamicArrayOfA.length == 0");
A memory memoryItem = storageDynamicArrayOfA.push(); // item is reference or new variable?
require(storageDynamicArrayOfA.length == 1, "storageDynamicArrayOfA.length == 1");
memoryItem.a = 1;
require(memoryItem.a == 1, "memoryItem.a == 1");
require(storageDynamicArrayOfA[0].a == 0, "storageDynamicArrayOfA[0].a == 0");
A storage storageItem = storageDynamicArrayOfA.push(); // item is reference!
require(storageDynamicArrayOfA.length == 2, "storageDynamicArrayOfA.length == 2");
storageItem.a = 2;
require(storageItem.a == 2, "storageItem.a == 2");
require(storageDynamicArrayOfA[1].a == 2, "storageDynamicArrayOfA[1].a == 2");
}
}
In case uint array - push() retuns looks like a new variable. Not reference. In case A array - push() retuns looks like a new variable if I using memory location for variable.
Does the documentation look wrong?