When compiling the following contract with solc v0.8.7:
pragma solidity ^0.8.0;
contract Test {
struct MyStruct {
uint256 a;
}
function foo(MyStruct storage bar) public;
}
we get the following error message:
TypeError: Data location must be "memory" or "calldata" for parameter in function, but "storage" was given.
function foo(MyStruct storage bar) public;
^------------------^
This is not particularly helpful as functions can actually receive storage
arguments, but only if they are internal
or private
. The error message is not particularly insightful on this distinction, nor helps the developer achieve their task.
Suggestion
A simple improvement could be:
Data location must be "memory" or "calldata" for parameter in "public" or "external" function
Even better, a suggestion could be appended at the end:
TypeError: Data location must be "memory" or "calldata" for parameter in "public" or "external" function, but
"storage" was given.
function foo(MyStruct storage bar) public;
^------------------^
Use "internal" or "private" functions to pass storage pointers.