Rust 1.88.0
Released on June 26, 2025
What's Changed
- Stabilize
#![feature(let_chains)]in the 2024 edition. - Stabilize
#![feature(naked_functions)]. - Stabilize
#![feature(cfg_boolean_literals)]. - 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. - Add
invalid_null_argumentslint to prevent invalid usage of null pointers. - Change trait impl candidate preference for builtin impls and trivial where-clauses.
- Check types of generic const parameter defaults
- 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. Cell::updateimpl Default for const Timpl Default for mut THashMap::extract_ifHashSet::extract_ifhint::select_unpredictableproc_macro::Span::lineproc_macro::Span::columnproc_macro::Span::startproc_macro::Span::endproc_macro::Span::fileproc_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_mutmod ffi::c_strNonNull::replace <*mut T>::replacestd::ptr::swap_nonoverlappingCell::replaceCell::getCell::get_mutCell::from_mutCell::as_slice_of_cells
- 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.
- 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.
Full Changelog
Language
--------
- Stabilize #![feature(let_chains)] in the 2024 edition.
This feature allows &&-chaining let statements inside if and while, allowing intermixture with boolean expressions. The patterns inside the let sub-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 as cfg predicates, 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.
The lint will be bumped to deny-by-default in the next version of Rust.
- Add invalid_null_arguments lint to prevent invalid usage of null pointers.
This lint is uplifted from clippy::invalid_null_ptr_usage.
- Change trait impl candidate preference for builtin impls and trivial where-clauses.
- Check types of generic const parameter defaults
Compiler
--------
- Stabilize -Cdwarf-version for selecting the version of DWARF debug information to generate.
Platform Support
----------------
- Demote i686-pc-windows-gnu to Tier 2.
Refer to Rust's [platform support page][platform-support-doc]
for more information on Rust's tiered platform support.
[platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html
Libraries
---------
- Remove backticks from #[should_panic] test failure message.
- Guarantee that [T; N]::from_fn is generated in order of increasing indices., for those passing it a stateful closure.
- The libtest flag --nocapture is deprecated in favor of the more consistent --no-capture flag.
- Guarantee that {float}::NAN is a quiet NaN.
Stabilized APIs
---------------
- proc_macro::Span::local_file
- <[T]>::as_chunks_unchecked_mut
These previously stable APIs are now stable in const contexts:
- std::ptr::swap_nonoverlapping
Cargo
-----
- Stabilize automatic garbage collection.
- use zlib-rs for gzip compression in rust code
Rustdoc
-----
- Doctests can be ignored based on target names using ignore-* attributes.
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 tt fragment 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.