Rust 1.86.0
Released on April 3, 2025
What's Changed
- Stabilize upcasting trait objects to supertraits.
- Allow safe functions to be marked with the
#[target_feature]attribute. - 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.
- 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. {float}::next_down{float}::next_up<[_]>::get_disjoint_mut<[_]>::get_disjoint_unchecked_mutslice::GetDisjointMutErrorHashMap::get_disjoint_mutHashMap::get_disjoint_unchecked_mutNonZero::count_onesVec::pop_ifsync::Once::waitsync::Once::wait_forcesync::OnceLock::waithint::black_boxio::Cursor::get_mutio::Cursor::set_positionstr::is_char_boundarystr::split_atstr::split_at_checkedstr::split_at_mutstr::split_at_mut_checked
- 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.
- The
wasm_c_abifuture compatibility warning is now a hard error. - Remove long-deprecated no-op attributes
#![no_start]and#![crate_id]. - 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.
- 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.{aarch64-unknown,x86_64-pc}-nto-qnx800.{x86_64,i686}-win7-windows-gnu.amdgcn-amd-amdhsa.x86_64-pc-cygwin.{mips,mipsel}-mti-none-elf.m68k-unknown-none-elf.armv7a-nuttx-{eabi,eabihf},aarch64-unknown-nuttx, andthumbv7a-nuttx-{eabi,eabihf}.- Add a sans-serif font setting.
- Build the rustc on AArch64 Linux with ThinLTO + PGO.
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.
Initial bare-metal support.
- 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
---------------
- <[_]>::get_disjoint_unchecked_mut
- HashMap::get_disjoint_unchecked_mut
These APIs are now stable in const contexts:
Cargo
-----
- 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.
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.