← Back to all releases

Rust 1.88.0

Released on June 26, 2025

What's Changed

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.

- Add warn-by-default dangerous_implicit_autorefs lint 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_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

---------------

- 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::replace

- <*mut T>::replace

- std::ptr::swap_nonoverlapping

- Cell::replace

- Cell::get

- Cell::get_mut

- Cell::from_mut

- Cell::as_slice_of_cells

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.

- Stabilize the --test-runtool and --test-runtool-arg CLI 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 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.

- 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.