neo-devpack-solidity 0.22.0

Production-focused Solidity-to-NeoVM compilation system
Documentation
---
title: "Solidity Feature Support: C. Statements"
description: "C. Statements from Solidity Feature Support."
---

# C. Statements

[Back to Solidity Feature Support](/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)`).

```solidity
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.

---