Open qwaz-theori opened 1 year ago
Yeah, looks like a bug. The compiler normally would not let you use ret
in an expression before it is initialized. After the assignment it would stop complaining. Here it's wrongly assuming it has already been assigned when processing the right-hand side.
After discussing it in the team it turns out that it was at least partially intentional. You can suppress a warning about an unused return variable by assigning it to itself - any expression involving the variable on the right-hand side of the assignment will do this. However, this was done way back, before you could assign to storage variables in inline assembly, which would be a better and more explicit way to silence it. The storage case is potentially more dangerous than other cases so we're still going to consider it a bug and disallow it.
The storage case is potentially more dangerous than other cases so we're still going to consider it a bug and disallow it.
Just to clarify: disallowing this right a way would still definitely be breaking. Our conclusion in the end was that we start emitting a warning for this now (which can then be silenced by an assembly assignment), and then turn that into an error in 0.9, right?
Yes.
Description
This code accesses
ret
storage pointer without initializing it. It should not compile, but the Solidity compiler accepts this code.Environment
Version: 0.8.18+commit.87f61d96.Linux.g++
Steps to Reproduce
Save the above file as
test.sol
and runsolc test.sol
.Without
ret = ret;
line, the expected warning message is printed: