Update Jun 26, 2025 tracked by Updatify
Rust 1.88.0
Language
-
Stabilize
#![feature(let_chains)]in the 2024 edition. This feature allows&&-chainingletstatements insideifandwhile, allowing intermixture with boolean expressions. The patterns inside theletsub-expressions can be irrefutable or refutable. -
Stabilize
#![feature(naked_functions)]. Naked functions allow writing functions with no compiler-generated epilogue and prologue, allowing full control over the generated assembly for a particular function. -
Stabilize
#![feature(cfg_boolean_literals)]. This allows using boolean literals ascfgpredicates, e.g.#[cfg(true)]and#[cfg(false)]. -
Fully de-stabilize the
#[bench]attribute. Usage of#[bench]without#![feature(custom_test_frameworks)]already triggered a deny-by-default future-incompatibility lint since Rust 1.77, but will now become a hard error. -
Add warn-by-default
dangerous_implicit_autorefslint against implicit autoref of raw pointer dereference. The lint will be bumped to deny-by-default in the next version of Rust. -
Add
invalid_null_argumentslint to prevent invalid usage of null pointers. This lint is uplifted fromclippy::invalid_null_ptr_usage. - Change trait impl candidate preference for builtin impls and trivial where-clauses.
- Check types of generic const parameter defaults
Compiler
Platform Support
Refer to Rust’s platform support page for more information on Rust’s tiered platform support.
Libraries
-
Remove backticks from
#[should_panic]test failure message. -
Guarantee that
[T; N]::from_fnis generated in order of increasing indices., for those passing it a stateful closure. -
The libtest flag
--nocaptureis deprecated in favor of the more consistent--no-captureflag. -
Guarantee that
{float}::NANis a quiet NaN.
Stabilized APIs
-
Cell::update -
impl Default for *const T -
impl Default for *mut T -
HashMap::extract_if -
HashSet::extract_if -
hint::select_unpredictable -
proc_macro::Span::line -
proc_macro::Span::column -
proc_macro::Span::start -
proc_macro::Span::end -
proc_macro::Span::file -
proc_macro::Span::local_file -
<[T]>::as_chunks -
<[T]>::as_chunks_mut -
<[T]>::as_chunks_unchecked -
<[T]>::as_chunks_unchecked_mut -
<[T]>::as_rchunks -
<[T]>::as_rchunks_mut -
mod ffi::c_str
These previously stable APIs are now stable in const contexts:
-
NonNull<T>::replace -
<*mut T>::replace -
std::ptr::swap_nonoverlapping -
Cell::replace -
Cell::get -
Cell::get_mut -
Cell::from_mut -
Cell::as_slice_of_cells
Cargo
Rustdoc
-
Doctests can be ignored based on target names using
ignore-*attributes. -
Stabilize the
--test-runtooland--test-runtool-argCLI options to specify a program (like qemu) and its arguments to run a doctest.
Compatibility Notes
-
Finish changing the internal representation of pasted tokens. Certain invalid declarative macros that were previously accepted in obscure circumstances are now correctly rejected by the compiler. Use of a
ttfragment specifier can often fix these macros. -
Fully de-stabilize the
#[bench]attribute. Usage of#[bench]without#![feature(custom_test_frameworks)]already triggered a deny-by-default future-incompatibility lint since Rust 1.77, but will now become a hard error. - Fix borrow checking some always-true patterns. The borrow checker was overly permissive in some cases, allowing programs that shouldn’t have compiled.
- Update the minimum external LLVM to 19.
- Make it a hard error to use a vector type with a non-Rust ABI without enabling the required target feature.