Rust 1.90.0
Released on September 18, 2025
What's Changed
- Split up the
unknown_or_malformed_diagnostic_attributeslint. This lint has been split up into four finer-grained lints, withunknown_or_malformed_diagnostic_attributesnow being the lint group that contains these lints: - Allow constants whose final value has references to mutable/external memory, but reject such constants as patterns
- Allow volatile access to non-Rust memory, including address 0
- Use
lldby default onx86_64-unknown-linux-gnu. - Tier 3
musltargets now link dynamically by default. Affected targets: mips64-unknown-linux-muslabi64powerpc64-unknown-linux-muslpowerpc-unknown-linux-muslpowerpc-unknown-linux-muslsperiscv32gc-unknown-linux-musls390x-unknown-linux-muslthumbv7neon-unknown-linux-musleabihf
- Stabilize
u*::{checked,overflowing,saturating,wrapping}_sub_signed - Allow comparisons between
CStr,CString, andCow - Remove some unsized tuple impls since unsized tuples can't be constructed
- Set
MSG_NOSIGNALforUnixStream proc_macro::Ident::newnow supports$crate.- Guarantee the pointer returned from
Thread::into_rawhas at least 8 bytes of alignment u{n}::checked_sub_signedu{n}::overflowing_sub_signedu{n}::saturating_sub_signedu{n}::wrapping_sub_signedimpl Copy for IntErrorKindimpl Hash for IntErrorKindimpl PartialEq<&CStr> for CStrimpl PartialEqfor CStr impl PartialEq> for CStr impl PartialEq<&CStr> for CStringimpl PartialEqfor CString impl PartialEq> for CString impl PartialEq<&CStr> for Cowimpl PartialEqfor Cow impl PartialEqfor Cow <[T]>::reversef32::floorf32::ceilf32::truncf32::fractf32::roundf32::round_ties_evenf64::floorf64::ceilf64::truncf64::fractf64::roundf64::round_ties_even
- Use
lldby default onx86_64-unknown-linux-gnu. - Make
core::iter::Fuse'sDefaultimpl constructI::default()internally as promised in the docs instead of always being empty - Set
MSG_NOSIGNALforUnixStream - On Unix
std::env::home_dirwill use the fallback if theHOMEenvironment variable is empty - We now reject unsupported
extern "{abi}"s consistently in all positions. This primarily affects the use of implementing traits on anextern "{abi}"function pointer, likeextern "stdcall" fn(), on a platform that doesn't support that, like aarch64-unknown-linux-gnu. Direct usage of these unsupported ABI strings by declaring or defining functions was already rejected, so this is only a change for consistency. - const-eval: error when initializing a static writes to that static
- Check that the
proc_macro_derivemacro has correct arguments when applied to the crate root
- Demote
x86_64-apple-darwinto Tier 2 with host tools - Add ways to collapse all impl blocks. Previously the "Summary" button and "-" keyboard shortcut would never collapse
implblocks, now they do when shift is held - Display unsafe attributes with
unsafe()wrappers
Full Changelog
Language
--------
- Split up the unknown_or_malformed_diagnostic_attributes lint. This lint has been split up into four finer-grained lints, with unknown_or_malformed_diagnostic_attributes now being the lint group that contains these lints:
1. unknown_diagnostic_attributes: unknown to the current compiler
2. misplaced_diagnostic_attributes: placed on the wrong item
3. malformed_diagnostic_attributes: malformed attribute syntax or options
4. malformed_diagnostic_format_literals: malformed format string literal
- Allow volatile access to non-Rust memory, including address 0
Compiler
--------
- Use lld by default on x86_64-unknown-linux-gnu.
- Tier 3 musl targets now link dynamically by default. Affected targets:
- mips64-unknown-linux-muslabi64
- powerpc64-unknown-linux-musl
- powerpc-unknown-linux-musl
- powerpc-unknown-linux-muslspe
- riscv32gc-unknown-linux-musl
- s390x-unknown-linux-musl
- thumbv7neon-unknown-linux-musleabihf
Platform Support
----------------
- Demote x86_64-apple-darwin to Tier 2 with host tools
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
---------
- Stabilize u*::{checked,overflowing,saturating,wrapping}_sub_signed
- Allow comparisons between CStr, CString, and Cow
- Remove some unsized tuple impls since unsized tuples can't be constructed
- Set MSG_NOSIGNAL for UnixStream
- proc_macro::Ident::new now supports $crate.
- Guarantee the pointer returned from Thread::into_raw has at least 8 bytes of alignment
Stabilized APIs
---------------
- u{n}::overflowing_sub_signed
- impl PartialEq<&CStr> for CStr
- impl PartialEq<&CStr> for CString
- impl PartialEq<&CStr> for Cow
These previously stable APIs are now stable in const contexts:
Cargo
-----
- Add http.proxy-cainfo config for proxy certs
- feat(publish): Stabilize multi-package publishing
Rustdoc
-----
- Add ways to collapse all impl blocks. Previously the "Summary" button and "-" keyboard shortcut would never collapse impl blocks, now they do when shift is held
- Display unsafe attributes with unsafe() wrappers
Compatibility Notes
-------------------
- Use lld by default on x86_64-unknown-linux-gnu.
See also
- Set MSG_NOSIGNAL for UnixStream
This may change program behavior but results in the same behavior as other primitives (e.g., stdout, network sockets).
Programs relying on signals to terminate them should update handling of sockets to handle errors on write by exiting.
- On Unix std::env::home_dir will use the fallback if the HOME environment variable is empty
- We now reject unsupported extern "{abi}"s consistently in all positions. This primarily affects the use of implementing traits on an extern "{abi}" function pointer, like extern "stdcall" fn(), on a platform that doesn't support that, like aarch64-unknown-linux-gnu. Direct usage of these unsupported ABI strings by declaring or defining functions was already rejected, so this is only a change for consistency.
- const-eval: error when initializing a static writes to that static
- Check that the proc_macro_derive macro has correct arguments when applied to the crate root