C. Statements
Back to Solidity Feature Support
| Feature | Status | Notes |
|---|---|---|
if / else | ✅ | Standard conditional branching. |
for loop | ✅ | Init, condition, post, body all lowered. |
while loop | ✅ | Condition + body. |
do...while loop | ✅ | Body + condition. |
break | ✅ | Loop break. |
continue | ✅ | Loop continue. |
return | ✅ | Single and multi-value returns. |
emit Event(...) | ✅ | Maps to Runtime.Notify. Indexed params supported. |
revert(...) | ✅ | Maps to NeoVM ABORT with message. |
revert CustomError(...) | ✅ | Named revert with args. |
| Variable declaration | ✅ | Local variable definitions with optional initializer. |
Block { ... } | ✅ | Scoped statement blocks. |
unchecked { ... } | ✅ | Suppresses Solidity 0.8 checked-arithmetic guards inside the block; wrapping semantics are preserved for supported integer arithmetic. |
assembly { ... } | ⚠️ | Limited Yul subset lowering; unsupported EVM-only operations warn and emit no assembly logic for that block. |
try / catch | ✅ | Maps to NeoVM TRY/ENDTRY. Single catch clause preferred. |
catch Error(string) | ✅ | Named catch with parameter binding. |
catch Panic(uint256) | ✅ | Matches the EVM-canonical keccak256("Panic(uint256)")[..4] (= 0x4e487b71) selector on the revert envelope and decodes the 32-byte BE code into the catch binding (Task #103). |
catch (bytes) | ✅ | Low-level catch with raw bytes. |
Partial statement details
catch Panic(uint256) — The compiler emits the EVM-canonical revert envelope (selector || abi.encode(code)) for assert(false) (0x01), checked-arithmetic overflow and underflow (0x11), div/mod by zero (0x12), enum-cast range violations (0x21), empty-array .pop() (0x31), and abi.decode short-buffer faults (0x41). The catch Panic(uint code) dispatcher guards on the 4-byte selector and decodes code via StdLib.abiDecode, so panic codes such as 0x11 and 0x12 are reachable with Ethereum-compatible semantics.
unchecked { ... } — Checked arithmetic outside an unchecked block emits fixed-width range guards and reverts with Panic(0x11) on overflow or underflow. Inside unchecked, those overflow guards are suppressed and supported fixed-width arithmetic wraps according to Solidity semantics. unchecked does not suppress non-overflow panics such as division by zero (Panic(0x12)).
unchecked {
uint256 result = a + b; // wraps instead of reverting on overflow
}assembly { ... } — Inline assembly parses as Yul and lowers a compatibility subset for common library patterns: Yul locals and assignments, reads from Solidity locals and parameters, bounded mstore/mload/return, transient tstore/tload, returndatasize, guarded returndatacopy, arithmetic, bitwise, shift, comparison helpers, and simple nested control flow. EVM-only operations such as raw sload, sstore, call, and create should be rewritten with Solidity or Neo devpack/native-contract helpers.
