Rust versions / 1.86
Rust release · Apr 3, 2025
Rust 1.86: what's new, what was stabilized
Short answerRust 1.86 was released on Apr 3, 2025: 1 language stabilization (Stabilize upcasting trait objects to supertraits.); 20 newly stable APIs ({float}::next_down, {float}::next_up, <[_]>::get_disjoint_mut, <[_]>::get_disjoint_unchecked_mut, ...); 4 compatibility notes that can affect existing code.
← Rust 1.85All versionsRust 1.87 →
Language features stabilized
- Stabilize upcasting trait objects to supertraits.
20 APIs stabilized
{float}::next_down, {float}::next_up, <[_]>::get_disjoint_mut, <[_]>::get_disjoint_unchecked_mut, slice::GetDisjointMutError, HashMap::get_disjoint_mut, HashMap::get_disjoint_unchecked_mut, NonZero::count_ones, Vec::pop_if, sync::Once::wait, sync::Once::wait_force, sync::OnceLock::wait, hint::black_box, io::Cursor::get_mut, io::Cursor::set_position, str::is_char_boundary, str::split_at, str::split_at_checked, str::split_at_mut, str::split_at_mut_checked
Can it break my build?
The release lists these compatibility notes. Most only affect rare code, but read them before you raise your toolchain in CI:
- The
wasm_c_abifuture compatibility warning is now a hard error. - [Remove long-deprecated no-op attributes
#![no_start]and#![crate_id].](https://github.com/rust-lang/rust/pull/134300) - The future incompatibility lint
cenum_impl_drop_casthas been made into a hard error. This means it is now an error to cast a field-less enum to an integer if the enum implementsDrop. - SSE2 is now required for "i686" 32-bit x86 hard-float targets; disabling it causes a warning that will become a hard error eventually.
Use it
rustup update stable # get the newest release
rustup install 1.86 # or exactly this one
rustup override set 1.86 # pin a project to itTo require at least this version from users of your crate, set rust-version = "1.86" under [package] in Cargo.toml. Cargo then refuses to build it on older compilers with a clear message, and with resolver 3 (the default on the 2024 edition, Rust 1.85+) it also prefers dependency versions that support it.
Full release notes
Language
- Stabilize upcasting trait objects to supertraits.
- [Allow safe functions to be marked with the
#[target_feature]attribute.](https://github.com/rust-lang/rust/pull/134090) - The
missing_abilint now warns-by-default. - Rust now lints about double negations, to catch cases that might have intended to be a prefix decrement operator (
--x) as written in other languages. This was previously a clippy lint,clippy::double_neg, and is now available directly in Rust asdouble_negations. - More pointers are now detected as definitely not-null based on their alignment in const eval.
- Empty
repr()attribute applied to invalid items are now correctly rejected. - [Inner attributes
#![test]and#![rustfmt::skip]are no longer accepted in more places than intended.](https://github.com/rust-lang/rust/pull/134276)
<a id="1.86.0-Compiler"></a>
Compiler
- Debug-assert that raw pointers are non-null on access.
- Change
-Oto mean-C opt-level=3instead of-C opt-level=2to match Cargo's defaults. - Fix emission of
overflowing_literalsunder certain macro environments.
<a id="1.86.0-Platform-Support"></a>
Platform Support
- Replace
i686-unknown-redoxtarget withi586-unknown-redox. - Increase baseline CPU of
i686-unknown-hurd-gnuto Pentium 4. - New tier 3 targets:
{aarch64-unknown,x86_64-pc}-nto-qnx710_iosock. For supporting Neutrino QNX 7.1 withio-socketnetwork stack.{aarch64-unknown,x86_64-pc}-nto-qnx800. For supporting Neutrino QNX 8.0 (no_std-only).{x86_64,i686}-win7-windows-gnu. Intended for backwards compatibility with Windows 7.{x86_64,i686}-win7-windows-msvcare the Windows MSVC counterparts that already exist as Tier 3 targets.amdgcn-amd-amdhsa.x86_64-pc-cygwin.{mips,mipsel}-mti-none-elf. Initial bare-metal support.m68k-unknown-none-elf.armv7a-nuttx-{eabi,eabihf},aarch64-unknown-nuttx, andthumbv7a-nuttx-{eabi,eabihf}.
Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support.
<a id="1.86.0-Libraries"></a>
Libraries
- The type of
FromBytesWithNulErrorinCStr::from_bytes_with_nul(bytes: &[u8]) -> Result<&Self, FromBytesWithNulError>was changed from an opaque struct to an enum, allowing users to examine why the conversion failed. - Remove
RustcDecodableandRustcEncodable. - Deprecate libtest's
--logfileoption. - On recent versions of Windows,
std::fs::remove_filewill now remove read-only files.
<a id="1.86.0-Stabilized-APIs"></a>
Stabilized APIs
{float}::next_down{float}::next_up- [
<[_]>::get_disjoint_mut](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.get_disjoint_mut) - [
<[_]>::get_disjoint_unchecked_mut](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.get_disjoint_unchecked_mut) slice::GetDisjointMutErrorHashMap::get_disjoint_mutHashMap::get_disjoint_unchecked_mutNonZero::count_onesVec::pop_ifsync::Once::waitsync::Once::wait_forcesync::OnceLock::wait
These APIs are now stable in const contexts:
hint::black_boxio::Cursor::get_mutio::Cursor::set_positionstr::is_char_boundarystr::split_atstr::split_at_checkedstr::split_at_mutstr::split_at_mut_checked
<a id="1.86.0-Cargo"></a>
Cargo
- When merging, replace rather than combine configuration keys that refer to a program path and its arguments.
- Error if both
--packageand--workspaceare passed but the requested package is missing. This was previously silently ignored, which was considered a bug since missing packages should be reported. - Deprecate the token argument in
cargo loginto avoid shell history leaks. - Simplify the implementation of
SourceIDcomparisons. This may potentially change behavior if the canonicalized URL compares differently in alternative registries.
<a id="1.86.0-Rustdoc"></a>
Rustdoc
<a id="1.86.0-Compatibility-Notes"></a>
Compatibility Notes
- The
wasm_c_abifuture compatibility warning is now a hard error. Users ofwasm-bindgenshould upgrade to at least version 0.2.89, otherwise compilation will fail. - [Remove long-deprecated no-op attributes
#![no_start]and#![crate_id].](https://github.com/rust-lang/rust/pull/134300) - The future incompatibility lint
cenum_impl_drop_casthas been made into a hard error. This means it is now an error to cast a field-less enum to an integer if the enum implementsDrop. - SSE2 is now required for "i686" 32-bit x86 hard-float targets; disabling it causes a warning that will become a hard error eventually. To compile for pre-SSE2 32-bit x86, use a "i586" target instead.
<a id="1.86.0-Internal-Changes"></a>
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.
- Build the rustc on AArch64 Linux with ThinLTO + PGO. The ARM 64-bit compiler (AArch64) on Linux is now optimized with ThinLTO and PGO, similar to the optimizations we have already performed for the x86-64 compiler on Linux. This should make it up to 30% faster.
Release notes from the Rust project's RELEASES.md (MIT or Apache-2.0); summaries above are ours.
Up next
Next releaseRust 1.87Released May 15, 2025.Read it next →Also worth your time
Did this answer your question?