← Back to all releases

Rust 1.86.0

Released on April 3, 2025

What's Changed

Full Changelog

Language

--------

- Stabilize upcasting trait objects to supertraits.

- Allow safe functions to be marked with the #[target_feature] attribute.

- The missing_abi lint 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 as double_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.

Compiler

--------

- Debug-assert that raw pointers are non-null on access.

- Change -O to mean -C opt-level=3 instead of -C opt-level=2 to match Cargo's defaults.

- Fix emission of overflowing_literals under certain macro environments.

Platform Support

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

- Replace i686-unknown-redox target with i586-unknown-redox.

- Increase baseline CPU of i686-unknown-hurd-gnu to Pentium 4.

- New tier 3 targets:

- {aarch64-unknown,x86_64-pc}-nto-qnx710_iosock.

For supporting Neutrino QNX 7.1 with io-socket network 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-msvc are 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, and thumbv7a-nuttx-{eabi,eabihf}.

Refer to Rust's [platform support page][platform-support-doc]

for more information on Rust's tiered platform support.

Libraries

---------

- The type of FromBytesWithNulError in CStr::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 RustcDecodable and RustcEncodable.

- Deprecate libtest's --logfile option.

- On recent versions of Windows, std::fs::remove_file will now remove read-only files.

Stabilized APIs

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

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

These APIs are now stable in const contexts:

- 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

Cargo

-----

- When merging, replace rather than combine configuration keys that refer to a program path and its arguments.

- Error if both --package and --workspace are 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 login to avoid shell history leaks.

- Simplify the implementation of SourceID comparisons. This may potentially change behavior if the canonicalized URL compares differently in alternative registries.

Rustdoc

-----

- Add a sans-serif font setting.

Compatibility Notes

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

- The wasm_c_abi future compatibility warning is now a hard error.

Users of wasm-bindgen should upgrade to at least version 0.2.89, otherwise compilation will fail.

- Remove long-deprecated no-op attributes #![no_start] and #![crate_id].

- The future incompatibility lint cenum_impl_drop_cast has 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 implements Drop.

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

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.