Open
Description
NOTE: We are trying this issue as a new way to work on the draft release notes.
Use the 📝 links to edit those that have a relnotes-tracking-issue
,
and they will be updated when we regenerate the notes periodically.
cc @rust-lang/release
Version 1.88.0 (2025-06-26)
Language
- Stabilize let chains in the 2024 edition
This 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 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
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 deny-by-default
dangerous_implicit_autorefs
lint against implicit autoref of raw pointer dereference
📝 - Add
invalid_null_arguments
lint to prevent invalid usage of null pointers- Uplifted from
clippy::invalid_null_ptr_usage
.
📝
- Uplifted from
- Changed 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
📝 - Promise
array::from_fn
is generated in order of increasing indices, for those passing it a stateful closure.
📝 - Expose '--no-capture' in place of
--nocapture
📝 - Guarantee that
f*::NAN
is a quiet NaN
📝 - Make all standard library extract_if iterators have consistent Debug impls
📝
Stabilized APIs
Cell::update
📝impl Default for *const T
impl Default for *mut T
📝- 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
📝
These previously stable APIs are now stable in const contexts:
NonNull<T>::replace
<*mut T>::replace
📝std::ptr::swap_nonoverlapping
📝- Const-stabilize
Cell::{replace, get, get_mut, from_mut, as_slice_of_cells}
📝
Cargo
Rustdoc
- Doctests can be ignored based on target names using
ignore-*
attributes. - Stabilized the
--test-runtool
and--test-runtool-arg
CLI options to specify a program (like qemu) and its arguments to run a doctest.
📝
Compatibility Notes
- 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.
📝 - 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.
📝 - 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
📝
Internal Changes
These changes do not affect any public interfaces of Rust, but they represent
significant improvements to the performance or internals of rustc and related
tools.