Rust versions / 1.90
Rust release · Sep 18, 2025
Rust 1.90: what's new, what was stabilized
Short answerRust 1.90 was released on Sep 18, 2025: 28 newly stable APIs (u{n}::checked_sub_signed, u{n}::overflowing_sub_signed, u{n}::saturating_sub_signed, u{n}::wrapping_sub_signed, ...); 7 compatibility notes that can affect existing code.
← Rust 1.89All versionsRust 1.91 →
28 APIs stabilized
u{n}::checked_sub_signed, u{n}::overflowing_sub_signed, u{n}::saturating_sub_signed, u{n}::wrapping_sub_signed, impl Copy for IntErrorKind, impl Hash for IntErrorKind, impl PartialEq<&CStr> for CStr, impl PartialEq<CString> for CStr, impl PartialEq<Cow<CStr>> for CStr, impl PartialEq<&CStr> for CString, impl PartialEq<CStr> for CString, impl PartialEq<Cow<CStr>> for CString, impl PartialEq<&CStr> for Cow<CStr>, impl PartialEq<CStr> for Cow<CStr>, impl PartialEq<CString> for Cow<CStr>, <[T]>::reverse, f32::floor, f32::ceil, f32::trunc, f32::fract, f32::round, f32::round_ties_even, f64::floor, f64::ceil, f64::trunc, f64::fract, f64::round, f64::round_ties_even
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:
- 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
Use it
rustup update stable # get the newest release
rustup install 1.90 # or exactly this one
rustup override set 1.90 # pin a project to itTo require at least this version from users of your crate, set rust-version = "1.90" 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
- 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: 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 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
<a id="1.90-Compiler"></a>
Compiler
- 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
<a id="1.90-Platform-Support"></a>
Platform Support
Refer to Rust's platform support page for more information on Rust's tiered platform support.
<a id="1.90-Libraries"></a>
Libraries
- Stabilize
u*::{checked,overflowing,saturating,wrapping}_sub_signed - Allow comparisons between
CStr,CString, andCow<CStr> - 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
<a id="1.90-Stabilized-APIs"></a>
Stabilized APIs
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 PartialEq<CString> for CStrimpl PartialEq<Cow<CStr>> for CStrimpl PartialEq<&CStr> for CStringimpl PartialEq<CStr> for CStringimpl PartialEq<Cow<CStr>> for CStringimpl PartialEq<&CStr> for Cow<CStr>impl PartialEq<CStr> for Cow<CStr>impl PartialEq<CString> for Cow<CStr>
These previously stable APIs are now stable in const contexts:
- [
<[T]>::reverse](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.reverse) f32::floorf32::ceilf32::truncf32::fractf32::roundf32::round_ties_evenf64::floorf64::ceilf64::truncf64::fractf64::roundf64::round_ties_even
<a id="1.90-Cargo"></a>
Cargo
- Add
http.proxy-cainfoconfig for proxy certs - Use
gixforcargo package - feat(publish): Stabilize multi-package publishing
<a id="1.90-Rustdoc"></a>
Rustdoc
- 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
<a id="1.90-Compatibility-Notes"></a>
Compatibility Notes
- Use
lldby default onx86_64-unknown-linux-gnu. See also <https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/>. - Make
core::iter::Fuse'sDefaultimpl constructI::default()internally as promised in the docs instead of always being empty - Set
MSG_NOSIGNALforUnixStreamThis 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_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
Release notes from the Rust project's RELEASES.md (MIT or Apache-2.0); summaries above are ours.
Up next
Next releaseRust 1.91Released Oct 30, 2025.Read it next →Also worth your time
Did this answer your question?