Radar · Solidity · Archive · Week 11 · Mar 9 – 15, 2026
0.8.34 – Yul IR bug fix and optimizer cleanup
Worth knowingecosystem
- What changed
- A bug in Yul IR code generation that could clear a storage variable instead of a transient storage variable at the same layout position (and vice‑versa) has been fixed. The Yul optimizer now removes redundant prerequisite steps from the default optimizer sequence.
- Production impact
- The source does not say.
- Try it
- Deploy a contract that uses transient storage and verify that its value persists after a function call.
- Source
- github.com/argotorg/solidity/releases/tag/v0.8.34
Understand it, then run it
Solidity 0.8.34 fixed a problem in the internal Yul IR that could mistakenly clear a normal storage variable when it should have cleared a temporary one, or the other way around. The compiler now generates the correct code so that data stored in contract state is not accidentally erased. The change also cleans up the optimizer: it removes unnecessary steps that were previously run by default, making compilation faster and the generated bytecode smaller. You won’t see any new syntax or functions; the compiler just behaves more reliably. If you compile a contract that writes to storage, the value will stay where you expect it to stay.
Run it now
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.37;
// This contract demonstrates that a storage variable is not cleared by a transient variable
contract Main {
uint256 public stored; // storage variable
function set(uint256 _x) public {
// transient variable in Yul (simulated here with a local variable)
uint256 temp = _x;
// store the value in storage
stored = temp;
}
function clearTransient() public {
// This function would have cleared the storage variable if the bug were present.
// In the fixed compiler, it only clears the local transient variable.
uint256 temp = 0;
temp = temp; // no effect on storage
}
}
Tests
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.37;
import "./main.sol";
contract MainTest {
Main main;
constructor() {
main = new Main();
}
function test_storagePersists() public {
main.set(42);
require(main.stored() == 42, "storage not set");
main.clearTransient();
require(main.stored() == 42, "storage cleared by transient");
}
}
The test report when we ran it on Solidity 0.8.37 (solc)
1 of 1 tests passed.
- test_storagePersists50,652 gas
- MainTest: 1,002 bytes of bytecode, deployed for 296,627 gas
solc 0.8.37 · prague
Run sends this program (for Solidity, the contract and its tests) to our own sandbox, where it is compiled and run once, with no network, and what it printed or the test report comes back here. Nothing is kept. Runs are counted per visitor for the day so everyone gets a turn; the details are on the legal page.
Written by gpt-oss-20b from the linked source · claims checked against the sources · archive, not individually reviewed