Rust 1.91.0
Released on October 30, 2025
What's Changed
- Lower pattern bindings in the order they're written and base drop order on primary bindings' order
- Stabilize declaration of C-style variadic functions for
sysv64,win64,efiapi, andaapcsABIs. - Add
dangling_pointers_from_localslint to warn against dangling pointers from local variables - Upgrade
semicolon_in_expressions_from_macrosfrom warn to deny - Stabilize LoongArch32 inline assembly
- Add warn-by-default
integer_to_ptr_transmuteslint against integer-to-pointer transmutes - Stabilize
sse4aandtbmtarget features - Add
target_env = "macabi"andtarget_env = "sim"cfgs as replacements for thetarget_abicfgs with the same values.
- Print thread ID in panic message
- Fix overly restrictive lifetime in
core::panic::Location::filereturn type - Guarantee parameter order for
_by()variants ofmin/max/minmaxinstd::cmp - Document assumptions about
CloneandEqtraits std::thread: Return error if setting thread stack size failsPath::file_prefixAtomicPtr::fetch_ptr_addAtomicPtr::fetch_ptr_subAtomicPtr::fetch_byte_addAtomicPtr::fetch_byte_subAtomicPtr::fetch_orAtomicPtr::fetch_andAtomicPtr::fetch_xor{integer}::strict_add{integer}::strict_sub{integer}::strict_mul{integer}::strict_div{integer}::strict_div_euclid{integer}::strict_rem{integer}::strict_rem_euclid{integer}::strict_neg{integer}::strict_shl{integer}::strict_shr{integer}::strict_powi{N}::strict_add_unsignedi{N}::strict_sub_unsignedi{N}::strict_absu{N}::strict_add_signedu{N}::strict_sub_signedPanicHookInfo::payload_as_strcore::iter::chainu{N}::checked_signed_diffcore::array::repeatPathBuf::add_extensionPathBuf::with_added_extensionDuration::from_minsDuration::from_hoursimpl PartialEqfor PathBuf impl PartialEqfor PathBuf impl PartialEqfor Path impl PartialEqfor Path impl PartialEqfor String impl PartialEqfor String impl PartialEqfor str impl PartialEqfor str Ipv4Addr::from_octetsIpv6Addr::from_octetsIpv6Addr::from_segmentsimplDefault for Pin > where Box : Default, T: ?Sized implDefault for Pin > where Rc : Default, T: ?Sized implDefault for Pin > where Arc : Default, T: ?Sized Cell::as_array_of_cellsu{N}::carrying_addu{N}::borrowing_subu{N}::carrying_mulu{N}::carrying_mul_addBTreeMap::extract_ifBTreeSet::extract_ifimpl Debug for windows::ffi::EncodeWide<'_>str::ceil_char_boundarystr::floor_char_boundaryimpl Sum for Saturatingimpl Sum<&Self> for Saturatingimpl Product for Saturatingimpl Product<&Self> for Saturating<[T; N]>::each_ref<[T; N]>::each_mutOsString::newPathBuf::newTypeId::ofptr::with_exposed_provenanceptr::with_exposed_provenance_mut
- 🎉 Stabilize
build.build-dir. - The
--targetflag and thebuild.targetconfiguration can now take literal
- Always require coroutine captures to be drop-live
- Apple: Always pass SDK root when linking with
cc, and pass it viaSDKROOTenv var. This should fix linking issues withrustcrunning inside Xcode. Libraries in/usr/local/libmay no longer be linked automatically, if you develop or use a crate that relies on this, you should explicitly setcargo::rustc-link-search=/usr/local/libin abuild.rsscript. - Relaxed bounds in associated type bound position like in
TraitRefare now correctly forbidden - Add unstable
#[sanitize(xyz = "on|off")]built-in attribute that shadows procedural macros with the same name - Fix the drop checker being more permissive for bindings declared with let-else
- Be more strict when parsing attributes, erroring on many invalid attributes
- Error on invalid
#[should_panic]attributes - Error on invalid
#[link]attributes - Mark all deprecation lints in name resolution as deny-by-default and also report in dependencies
- The lint
semicolon_in_expressions_from_macros, formacro_rules!macros in expression position that expand to end in a semicolon (;), is now deny-by-default. It was already warn-by-default, and a future compatibility warning (FCW) that warned even in dependencies. This lint will become a hard error in the future. - Trait impl modifiers (e.g.,
unsafe,!,default) in inherent impls are no longer syntactically valid - Start reporting future breakage for
ill_formed_attribute_inputin dependencies - Restrict the scope of temporaries created by the macros
pin!,format_args!,write!, andwriteln!inif letscrutinees in Rust Edition 2024. This applies Rust Edition 2024'sif lettemporary scope rules to these temporaries, which previously could live past theifexpression regardless of Edition. - Invalid numeric literal suffixes in tuple indexing, tuple struct indexing, and struct field name positions are now correctly rejected
- Closures marked with the keyword
staticare now syntactically invalid - Shebangs inside
--cfgand--check-cfgarguments are no longer allowed - Add future incompatibility lint for temporary lifetime shortening in Rust 1.92
cargo publishno longer keeps.cratetarballs as final build artifacts- Adjust Cargo messages to match rustc diagnostic style.
- Tools and projects relying on the
- Promote
aarch64-pc-windows-gnullvmandx86_64-pc-windows-gnullvmto Tier 2 with host tools. - Promote
aarch64-pc-windows-msvcto Tier 1 - In search results, rank doc aliases lower than non-alias items with the same name
- Raw pointers now work in type-based search like references. This means you can now search for things like
*const u8 ->, and additionally functions that take or return raw pointers will now display their signature properly in search results. - Update to LLVM 21
Full Changelog
Language
--------
- Lower pattern bindings in the order they're written and base drop order on primary bindings' order
- Stabilize declaration of C-style variadic functions for sysv64, win64, efiapi, and aapcs ABIs.
This brings these ABIs in line with the C ABI: variadic functions can be declared in extern blocks but not defined.
- Add dangling_pointers_from_locals lint to warn against dangling pointers from local variables
- Upgrade semicolon_in_expressions_from_macros from warn to deny
- Stabilize LoongArch32 inline assembly
- Add warn-by-default integer_to_ptr_transmutes lint against integer-to-pointer transmutes
- Stabilize sse4a and tbm target features
- Add target_env = "macabi" and target_env = "sim" cfgs as replacements for the target_abi cfgs with the same values.
Compiler
--------
- Don't warn on never-to-any as casts as unreachable
Platform Support
----------------
- Promote aarch64-pc-windows-gnullvm and x86_64-pc-windows-gnullvm to Tier 2 with host tools.
Note: llvm-tools and MSI installers are missing but will be added in future releases.
- Promote aarch64-pc-windows-msvc to Tier 1
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
---------
- Print thread ID in panic message
- Fix overly restrictive lifetime in core::panic::Location::file return type
- Guarantee parameter order for _by() variants of min / max/ minmax in std::cmp
- Document assumptions about Clone and Eq traits
- std::thread: Return error if setting thread stack size fails
This used to panic within the standard library.
Stabilized APIs
---------------
- {integer}::strict_div_euclid
- {integer}::strict_rem_euclid
- PanicHookInfo::payload_as_str
- PathBuf::with_added_extension
- impl
- impl
- impl
- impl Debug for windows::ffi::EncodeWide<'_>
- impl Sum<&Self> for Saturating
- impl Product<&Self> for Saturating
These previously stable APIs are now stable in const contexts:
- ptr::with_exposed_provenance
- ptr::with_exposed_provenance_mut
Cargo
-----
- 🎉 Stabilize build.build-dir.
This config sets the directory where intermediate build artifacts are stored.
These artifacts are produced by Cargo and rustc during the build process.
End users usually won't need to interact with them, and the layout inside
build-dir is an implementation detail that may change without notice.
#15833
#15840
- The --target flag and the build.target configuration can now take literal
"host-tuple" string, which will internally be substituted by the host
machine's target triple.
#15838 #16003 #16032Rustdoc
-----
- In search results, rank doc aliases lower than non-alias items with the same name
- Raw pointers now work in type-based search like references. This means you can now search for things like *const u8 ->, and additionally functions that take or return raw pointers will now display their signature properly in search results.
Compatibility Notes
-------------------
- Always require coroutine captures to be drop-live
- Apple: Always pass SDK root when linking with cc, and pass it via SDKROOT env var. This should fix linking issues with rustc running inside Xcode. Libraries in /usr/local/lib may no longer be linked automatically, if you develop or use a crate that relies on this, you should explicitly set cargo::rustc-link-search=/usr/local/lib in a build.rs script.
- Relaxed bounds in associated type bound position like in TraitRef are now correctly forbidden
- Fix the drop checker being more permissive for bindings declared with let-else
- Be more strict when parsing attributes, erroring on many invalid attributes
- Error on invalid #[should_panic] attributes
- Error on invalid #[link] attributes
- Mark all deprecation lints in name resolution as deny-by-default and also report in dependencies
- The lint semicolon_in_expressions_from_macros, for macro_rules! macros in expression position that expand to end in a semicolon (;), is now deny-by-default. It was already warn-by-default, and a future compatibility warning (FCW) that warned even in dependencies. This lint will become a hard error in the future.
- Trait impl modifiers (e.g., unsafe, !, default) in inherent impls are no longer syntactically valid
- Start reporting future breakage for ill_formed_attribute_input in dependencies
- Restrict the scope of temporaries created by the macros pin!, format_args!, write!, and writeln! in if let scrutinees in Rust Edition 2024. This applies Rust Edition 2024's if let temporary scope rules to these temporaries, which previously could live past the if expression regardless of Edition.
- Closures marked with the keyword static are now syntactically invalid
- Shebangs inside --cfg and --check-cfg arguments are no longer allowed
- Add future incompatibility lint for temporary lifetime shortening in Rust 1.92
Cargo compatibility notes:
- cargo publish no longer keeps .crate tarballs as final build artifacts
when build.build-dir is set. These tarballs were previously included due to
an oversight and are now treated as intermediate artifacts.
To get .crate tarballs as final artifacts, use cargo package.
In a future version, this change will apply regardless of build.build-dir.
- Adjust Cargo messages to match rustc diagnostic style.
This changes some of the terminal colors used by Cargo messages.
#15928- Tools and projects relying on the
internal details of Cargo'sbuild-dir
may not work for users changing their build-dir layout.
For those doing so, we'd recommend proactively testing these cases
particularly as we are considering changing the default location of the build-dir in the future
(cargo#16147).
If you can't migrate off of Cargo's internal details,
we'd like to learn more about your use case as we prepare to change the layout of the build-dir
(cargo#15010).
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.