This site is being rebuilt and some pages are out of date. For current details, write to [email protected]. This notice goes away when the rebuild is done.

No analytics unless you allow it, no tracking. This site keeps in your browser the language you pick, the theme, its colour, which site you chose, the currency on the pricing page and that you closed this notice; signing in adds session cookies. The legal page has the details.

Sign in

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

Todaysolidity
// 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