neo-devpack-solidity 0.22.0

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

# B. Expressions

[Back to Solidity Feature Support](/solidity/feature-support)

| Feature                                       | Status | Notes                                                                                                    |
| --------------------------------------------- | :----: | -------------------------------------------------------------------------------------------------------- |
| Arithmetic (`+`, `-`, `*`, `/`, `%`)          |   ✅   | Binary ops via `try_lower_expression_binary_ops`.                                                        |
| Comparison (`==`, `!=`, `<`, `>`, `<=`, `>=`) |   ✅   | Via `try_lower_expression_comparisons`.                                                                  |
| Logical (`&&`, `\|\|`, `!`)                   |   ✅   | Short-circuit evaluation.                                                                                |
| Bitwise (`&`, `\|`, `^`, `~`, `<<`, `>>`)     |   ✅   | Full bitwise support.                                                                                    |
| Unary (`++`, `--`, `-`, `!`)                  |   ✅   | Pre/post increment/decrement.                                                                            |
| Ternary (`? :`)                               |   ✅   | `ConditionalOperator` lowered with labels.                                                               |
| Assignment (`=`, `+=`, `-=`, etc.)            |   ✅   | Compound assignments in `assignments/compound.rs`.                                                       |
| `delete`                                      |   ✅   | State vars, mapping entries, locals, array elements, struct fields.                                      |
| Tuple expressions `(a, b, c)`                 |   ✅   | Lowered to NeoVM arrays.                                                                                 |
| Tuple destructuring `(a, b) = f()`            |   ⚠️   | Supported. Some complex nested target forms may require intermediate locals.                             |
| Type casting                                  |   ✅   | Explicit casts between compatible types.                                                                 |
| `type(X).min` / `type(X).max`                 |   ✅   | Supported for integer types.                                                                             |
| `type(T).name`                                |   ✅   | Compile-time string constant.                                                                            |
| `type(I).interfaceId`                         |   ✅   | Computed from selector XOR of interface methods.                                                         |
| `abi.encode(...)`                             |   ⚠️   | Supported in context of `address.call`/`staticcall`. Standalone use is limited.                          |
| `abi.encodePacked(...)`                       |   ⚠️   | Same as `abi.encode` — used for Neo contract call encoding.                                              |
| `abi.encodeWithSignature(...)`                |   ⚠️   | Low-level call payloads rewrite to Neo contract calls; standalone use approximates calldata as `selector \|\| abi.encode(args)`. |
| `abi.encodeWithSelector(...)`                 |   ⚠️   | Low-level call payloads rewrite to Neo contract calls; standalone use approximates calldata as `selector \|\| abi.encode(args)`. |
| `abi.encodeCall(...)`                         |   ✅   | Maps to `StdLib.serialize`.                                                                              |
| `abi.decode(...)`                             |   ✅   | Maps to `StdLib.deserialize`. Type tuple parsed from second argument.                                    |
| Named function call args `f({x: 1})`          |   ✅   | Named args reordered to positional order at IR level.                                                    |

## Partial expression details

**Tuple destructuring** — Standard patterns like `(uint a, uint b) = getValues()` work. Deeply nested destructuring targets (e.g., destructuring into struct members or nested tuples in a single statement) may require the compiler to introduce intermediate locals.

**`abi.encode` / `abi.encodePacked` / `abi.encodeWithSignature` / `abi.encodeWithSelector`** — These functions are primarily designed for cross-contract call encoding on Neo, not for producing Ethereum-ABI-compatible byte sequences. When used as arguments to `address.call()` or `address.staticcall()`, the compiler rewrites them into Neo contract-call lowering. Standalone use now returns a Neo-side approximation: `abi.encode*` emits `StdLib.serialize(...)`, while `encodeWithSignature` / `encodeWithSelector` emit `selector || abi.encode(args)`. These byte sequences are useful on Neo, but not guaranteed to be EVM-identical raw calldata.

```solidity
// ✅ Works — encoding for cross-contract call
address(target).call(abi.encodeWithSignature("transfer(address,uint256)", to, amount));

// ⚠️ Limited — standalone encoding may differ from EVM ABI
bytes memory encoded = abi.encode(a, b, c);
bytes memory payload = abi.encodeWithSignature("transfer(address,uint256)", to, amount);
```

---