ethereum / solidity

Solidity, the Smart Contract Programming Language
https://soliditylang.org
GNU General Public License v3.0
23.29k stars 5.76k forks source link

assignment to struct in array #15164

Open SvenMeyer opened 5 months ago

SvenMeyer commented 5 months ago

I'll start with as little code as possible as likely "It's me not solc"

    struct Allocation {
        uint48 stakeTime;
        uint48 unlockTime;
        uint32 spare;
        uint128 stakeAmount;
    }

    mapping(address => Allocation[]) public userMap;

    Allocation[] storage allocations = userMap[_account];
    Allocation storage a;

    while (aid > i) {
        a = allocations[aid];
        if (a.unlockTime <= block.timestamp) {
            ++foundUnlocked;
            totalAmount += a.stakeAmount;
            // a = allocations[allocations.length - 1]; // Why does this does not work ????
            allocations[aid] = allocations[allocations.length - 1]; // this works
            allocations.pop();
        }
        --aid;
    }

I understand that array of struct if a reference type, but why can't I assign to a that it shows up in allocations[aid] (as it should point to the same storage slot) ?

If I assign individual variables within a struct it works, but that is of course not an efficient alternative.

    a = allocations[i];
    a.stakeAmount = totalAmount.toUint128();
    a.stakeTime = uint48(block.timestamp);
    a.unlockTime = uint48(block.timestamp);

What am I missing ?

EduardoMelo00 commented 5 months ago

hey @SvenMeyer

How can we reproduce the code ?

Maybe we can help you with the entire code.