feature-checklist.md

June 25, 2026 · View on GitHub

Last Updated: 2026-06-18

Status reflects concrete execution against the Rust UI test suite. Many limitations trace back to a single missing component: an address model (a representation of addresses in memory). Types whose values own heap-allocated data (Box, Vec, etc.) additionally need dynamic (heap) allocation of that data, built on the address model. A Supported label can be followed by an address-model caveat (e.g. references work, but not references into heap/static data, which are not modeled yet). Therefore, please read the Notes for a full description of the supported features. Such dependencies are flagged in bold as Requires the address model / Requires heap allocation.

Items

FeatureStatusNotes
Functions, methods, associated functionsSupportedindirect calls through a stored function pointer: see Function pointer types
Associated constantsSupported
StructsPartially supportedconstruction and field access work; decoding reordered/padded layouts from raw bytes not yet
EnumsPartially supportedconstruction and matching work; decoding with-field / niche-encoded variants from raw bytes not yet
Const functionsSupported
Async functionsNot supporteddesugars to coroutines (also not supported)
MacrosN/A (MIR)
Type aliasesSupportedresolved before MIR
Const itemsSupportedvalue constants work; Requires the address model for constants holding references into data (&str, &[T])
Static itemsNot supportedRequires the address model

Struct/enum definitions

FeatureStatusNotes
Type parametersSupportedmonomorphized before MIR
Where clausesSupportedresolved at type-check
Lifetime parametersSupportederased in MIR
Const genericsSupportedmonomorphized; complex generic_const_exprs (unstable) not yet (see impl types)
Custom discriminantsSupported
Public / private fieldsN/A (MIR)

Expressions and Statements

FeatureStatusNotes
Variables, assignment, mutable variablesSupported
if, elseSupported
Patterns, match, if let, match guardsSupportedslice rest-patterns ([head, tail @ ..]) not yet
Block expressionsSupported
ItemsSupported
loop, whileSupported
forSupporteddesugars to iterators
?Supported
Async blocksNot supporteddesugars to coroutines (also not supported)
awaitNot supporteddesugars to coroutines (also not supported)
Unsafe blocksSupported
&Supported
&mut, place expressionsSupported
==, !=Supported
Type cast (as)Partially supportednumeric and pointer casts work; Requires the address model for integer↔pointer casts; float casts not yet
Compound assigments (+=, etc.)Supported
Array expressionsSupportedincluding multi-dimensional
Range expressionsSupported
Index expressionsSupportedelement indexing works; range-indexing into a sub-slice: see Patterns
Tuple expressionsSupported
Struct/enum constructorsSupported
Field accessSupportedunion cross-field access: see Unions
Function and method callsSupportedindirect calls through a stored function pointer: see Function pointer types
ClosuresSupported
Labels, break, continueSupported
Return statementsSupported

Integer arithmetic

FeatureStatusNotes
Arithmetic for unsignedSupported
Arithmetic for signed (+, -, *, /, %)Supported
Bitwise operations (&, |, !, >>, <<)Supported
Arch-dependent types (usize, isize)Not supported (fixed width)usize/isize work as fixed 64-bit

Types and standard library functionality

FeatureStatusNotes
Integer typesSupported
boolSupported
charNot supportedchar values not yet modeled
StringsNot supportedstr not yet; String Requires heap allocation
VecNot supportedRequires heap allocation
Option / ResultSupportedconstruction and matching work; decoding niche/with-field variants from raw bytes not yet (see Enums)
Floating pointNot supportedfloat decoding and arithmetic not yet implemented
SlicesPartially supportedindexing and split_at work; slice rest-patterns and fat-pointer length metadata not yet
ArraysPartially supportedindexing and multi-dimensional arrays work; slice rest-patterns ([head, tail @ ..]) not yet
PointersPartially supportedplace-based pointers partly work (some pointer casts still produce thunks and fail); Requires the address model for integer↔pointer casts
References (&)Supportedreferences to stack data work; Requires the address model for references to constant/static/heap data
Mutable references (&mut)Supportedreferences to stack data work; Requires the address model for references to constant/static/heap data
Never type (!)Not supported
Function pointer typesPartially supportedpassing a function or closure as an argument works; calling indirectly through a stored function pointer not yet
Closure typesSupporteddyn Fn dispatch: see Trait objects
Coroutines / generatorsNot supportedunderlies async
Trait objects (dyn)Not supportedneeds dynamic dispatch via vtables; Box<dyn> also Requires heap allocation
impl typesPartially supportedreturn-position and argument impl Trait work; some opaque-type cases not yet
Cell, RefCellPartially supportedCell works; RefCell (borrow tracking) not yet
IteratorsSupported
HashMapNot supportedRequires heap allocation
Smart pointers (Box, Rc, Arc)Not supportedRequires heap allocation
PinNot supported
Hardware intrinsicsPartially supportedseveral implemented; many (including SIMD) not yet
Printing, I/ONot supported
Panic-unwindingNot supportedpanics that abort are detected; unwinding / catch_unwind not yet

Traits

FeatureStatusNotes
User-defined traitsSupported
Default implementationsSupported
Trait bounds on trait declarationsSupported
Traits with type argumentsSupported
Associated typesSupported
Generic associated typesSupported
Higher-ranked trait boundsSupported
CloneSupported
Marker traits (Copy)Supported
Marker traits (Send, Sync)Not supportedmarkers erased in MIR; meaningful only with concurrency which is not supported
Standard traits (Hash, Debug)Not supportedformatting / hashing machinery not implemented
User-defined destructors (Drop)Not supporteddestructors do not run (Drop is a no-op); control flow continues
Sized (size_of, align_of)Supportedsize_of_val on unsized types: see Hardware intrinsics
Deref, DerefMutPartially supporteduser Deref/DerefMut impls work; Box/Rc deref Requires heap allocation

Multi-threading

FeatureStatusNotes
Mutex, RwLock (from standard library)Not supportedRequires heap allocation and concurrency
Verified lock implementationsNot supported
AtomicsNot supported
spawn and joinNot supportedno threading model
Interior mutabilityPartially supportedCell works; RefCell not yet (see Cell/RefCell)

Unsafe

FeatureStatusNotes
Raw pointersPartially supportedplace-based pointers partly work (some pointer casts still produce thunks and fail); Requires the address model for integer↔pointer casts
TransmutePartially supportedbyte / wrapper / enum transmutes work; Requires the address model for transmutes involving pointer/address values
UnionsPartially supportedreading the field last written works; cross-field type-punning not yet
UnsafeCellNot supportedRequires the address model: direct use fails on a pointer-alignment check; Cell, built on it, works (see Cell/RefCell)
FFI / extern functionsNot supportedexternal functions have no MIR body to execute

Crates and code organization

FeatureStatusNotes
Multi-crate projectsPartially supported
Verified crate + unverified cratesNot supported
ModulesSupported
rustdocNot supported

Methodology and evidence

The statuses above were derived from three sources, cross-checked:

  1. A full run of the Rust UI test suite under the LLVM (concrete) backend (~2888 tests).
  2. The repository's integration tests: the curated prove-rs suite (each *-fail.rs is expected to fail), the decode-value cases, and verify-rust-std.
  3. Targeted checks: small programs run directly to probe a specific feature.

A feature is only marked Supported when it both has a passing test that exercises it and no failing test has it as the root cause. Distinguishing "root cause" from "where execution stops" matters: a test often gets stuck far from the real problem (e.g. an arithmetic test that fails only because it prints its result). To attribute correctly we tracked thunks (when the semantics cannot yet rewrite an evaluation it records it as a thunk, noting where that thunk was created) and traced each failure back to the thunk that caused it. This allows us to say that a feature works while its nominal-category failures are due to other unsupported features.

In the table below, Passing gives tests that exercise the feature and succeed (integration tests are under kmir/src/tests/integration/data/, UI tests under tests/ui/). Failures attributed to gives, for the not-fully-passing rows, representative failing tests in the same area with the other feature their failure actually traces to. UI directories are nominal groupings, so a directory rarely passes entirely even when the named feature works. A few directories do pass entirely, noted as such.

RowStatusPassingFailures attributed to
IteratorsSupportediterator-simple, iter_next_1/2/3, iter-eq-copied-take-dereftruncate; tests/ui/iterators/iter-map-fold-type-lengthiter-sum-overflow → panic-unwinding; iter-count-overflow → loop-to-2⁶⁴ timeout; iter-range → printing
ArraysPartially supportedarray_match, array_write, array_nest_compare (nested [[u16;3];2]); tests/ui/array-slice-vec/{array_const_index-2,copy-out-of-array-1}own gap: tests/ui/array-slice-vec/{subslice-patterns-const-eval,vec-matching-fold} (slice rest-patterns). Other fails → heap (box-of-array-of-drop-1)
SlicesPartially supportedslice-split-atsame slice rest-pattern gap as Arrays
for / Range / Index / Struct-enum constructorsSupportedstruct, enum; tests/ui/structs-enums/{class-methods,borrow-tuple-fields}; for/range via iterator-simple + targeted 1..5 checkstests/ui/structs-enums/class-cast-to-trait → heap (Vec alloc); align-struct → unimplemented min_align_of_val intrinsic
Type/lifetime/const generics, where clausesSupportedmonomorphized/erased before MIR; 284 generics / 106 lifetimes / 46 const-generics passing UI tests, e.g. tests/ui/generics/generic-fn-twice, tests/ui/lifetimes/issue-84604, tests/ui/const-generics/const-arg-in-fntests/ui/const-generics fails → heap/transmute and unimplemented generic_const_exprs (OpaqueCast)
Associated constantsSupportedtests/ui/associated-consts/{assoc-const,associated-const-const-eval} (19 passing in dir, 1 fail)associated-const-in-global-const → constant-into-allocation (address model)
Const functionsSupportedrun like normal functions; tests/ui/const-generics/min_const_generics/const_fn_in_generics, targeted const fn checks
Type aliasesSupportedresolved before MIR; tests/ui/type-alias-enum-variants/ (both tests pass)
Const itemsSupportedvalue constants work (targeted const C: u32 checks; no dedicated UI dir); constants holding references into data (&str, &[T]) need the address model
Function pointer typesPartially supportedfn-item/closure-as-argument: 488-support-function-pointer-callscalling indirectly through a stored/cast function pointer not yet (the tests/ui/ indirect-call failures)
impl typesPartially supportedtests/ui/impl-trait/{closure-in-impl-trait-arg,example-st}, targeted impl Fn/impl Intoequality-rpassOpaqueCast/Subtype projection; others → heap/transmute
TransmutePartially supportedtransmute-bytes, transmute_transparent_wrapper_up/down, transmute-u8-to-enum; tests/ui/transmute/ (passes wholesale)own gap: transmute-maybe-uninit-fail; pointer/address-typed transmutes → address model
UnionsPartially supportedtests/ui/union/{union-derive-rpass,union-inherent-method,union-backcomp}own gap: union-pat-refutability, union-const-eval-field (cross-field punning); union-align → unimplemented min_align_of_val
Cell / Interior mutabilityPartially supportedCell: interior-mut2 (no dedicated UI dir)RefCell: interior-mut-fail (borrow tracking)
Raw pointers / PointersPartially supportedplace-based: offset_read, pointer-castraw-ptr-cast-fail → pointer-alignment check / ptr as usize (address model)
Sized (size_of, align_of)Supportedalign_and_size (all integer widths; no dedicated UI dir)
Deref/DerefMutPartially supporteduser impls: tests/ui/autoref-autoderef/autoderef-privacyBox/Rc deref → heap
Hardware intrinsicsPartially supportedintrinsics (rotate_left, bswap, ctpop, ctlz_nonzero); tests/ui/intrinsics/{intrinsic-assume,intrinsic-raw_eq-const}const-eval-select-x86_64 → SIMD; intrinsic-alignment → unimplemented pref_align_of
Smart pointers (Box/Rc/Arc)Not supportedbox_heap_alloc-fail (expected fail) → heap
Static itemsNot supportedvolatile_load_static-fail, volatile_store_static-fail (expected fail) → address model
UnsafeCellNot supportedinterior-mut3-fail (expected fail) → pointer-alignment / address model
Floating pointNot supportedverify-rust-std/0011-floats-ints (to_int_unchecked parked); no passing float test
Enums (decode of with-field/niche variants)Partially supportedfieldless variants decode fine (enum-direct-tag-decode)decode-value SKIP: enum-1-variant-1-field, enum-option-nonzero-none, … (with-field/niche decode)
StringsNot supporteddecode-value SKIP str
charNot supportedno char value representation (decode rule unimplemented); only size/alignment known
Coroutines / generatorsNot supportedtests/ui/coroutine/ (all 33 fail, e.g. addassign-yield) → aggregateKindCoroutine unhandled
FFI / extern functionsNot supportedexternal functions have no MIR body (e.g. tests/ui/abi/anon-extern-mod)