News 4 min read

Rust 1.100 makes the never type stable after 10 years


The Rust team released Rust 1.100.0 on November 12, 2026, and its headline change is one Rust developers have waited a decade for: the never type, written !, is now stable and can be named anywhere a type can. The release also stabilizes the core of the custom Allocator API, adds a DropGuard helper for cleanup code, and gives Cargo unused-dependency warnings and opt-in “dependency cooldowns” against supply chain attacks. You get it with rustup update stable, according to the official announcement.

What’s new

The never type is stable

The announcement says the never type is stable “after 10 years and 5 failed stabilization attempts”. ! is the type of code that never produces a value: return, break, a panic! or std::process::exit. Until now you could only write it as a function’s return type (-> !); from 1.100 you can use it anywhere, for example Result<T, !> for an operation that cannot fail.

std::convert::Infallible is now an alias for !, so older APIs that used Infallible work with ! directly.

This comes with a small breaking change. In the 2015, 2018 and 2021 editions, the “never type fallback” changes from () to !, which is what the 2024 edition already does. The Rust team says this “should largely be unnoticeable”, but it can affect rare code, such as ignoring the result of a function that returns a generic type, and the compiler may now flag more code as unreachable. If a dependency stops compiling because of it, update the dependency first: fixes have already been released for public crates that broke.

Custom allocators for Vec and Box

The core of allocator_api is stable. The new std::alloc::Allocator trait lets library authors write custom allocators and use them with Vec and Box, through new methods such as Vec::new_in, Vec::with_capacity_in and Box::new_in. Other collections and pointer types are not covered yet; the Rust team says more will be stabilized under its Allocators 1.0 goal.

DropGuard and conjure_zst

core::mem::DropGuard (also at std::mem::DropGuard) wraps a value and a closure, and runs the closure when the guard goes out of scope, whether the function returns, exits with ? or panics. Calling DropGuard::dismiss hands the value back without running the closure, which makes all-or-nothing operations with a rollback short to write.

std::mem::conjure_zst is a new unsafe function that is now the recommended way to create a value of a zero-sized type, instead of transmuting () or calling MaybeUninit::uninit().assume_init().

Cargo: unused dependencies, cooldowns and a new build-dir layout

  • Unused dependencies: Cargo now warns when a dependency in Cargo.toml is not used, through the new cargo::unused_dependencies lint, set to warn by default and configured in the [lints.cargo] table. The warning only appears when you build every target that could use the dependency, so cargo check --bin foo will not show it, and dev-dependencies are never reported.
  • Dependency cooldowns: a new min-publish-age setting tells Cargo to skip versions published more recently than a given age when it resolves dependencies, since malicious releases are often caught within hours or days. cargo install ignores it, and versions without a publish time in the registry index are never held back.
  • Fewer cache collisions: the build directory is now organized by build step, with the build-configuration hash applied to everything. This avoids extra or missed rebuilds, especially when several git worktrees share one build directory, but the announcement warns it may break build scripts and tests that relied on the old layout.

Smaller API additions

Among the other newly stable APIs: bool::toggle, Box::map, Rc::map, Arc::map, Box::take, Vec::from_fn, str::trim_prefix and str::trim_suffix (plus the slice and Path versions), impl Default for std::sync::Once and, on Windows, CommandExt::show_window.

What it means for developers

Run rustup update stable and build your projects, especially those on the 2015, 2018 or 2021 editions, where the never type fallback change applies. Then look at the new Cargo warnings: removing unused dependencies is a cheap way to cut build times.

If you maintain CI or release tooling that reads files from Cargo’s build directory, check it against the new layout; Cargo’s issue 17287 collects workarounds and use cases.

To turn on dependency cooldowns, add this to .cargo/config.toml, as shown in the announcement:

[registry]
global-min-publish-age = "3 days"

When you need a fresh release right away, the announcement shows how to override the check for one update with CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allow cargo update <crate> --precise <version>. The Rust team stresses that cooldowns reduce the risk from some supply chain attacks but are not a full defense, so keep reviewing dependency updates.

Rust keeps showing up in new developer tools; AWS Emulator, which runs AWS APIs locally for tests, is one recent example written in Rust. Rust 1.101.0 is due on December 24, 2026, on the usual six-week schedule listed at releases.rs.

Sources