← Back to all releases

Rust 1.91.0

Released on October 30, 2025

What's Changed

  • 🎉 Stabilize build.build-dir.
  • The --target flag and the build.target configuration can now take literal

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

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

- Path::file_prefix

- AtomicPtr::fetch_ptr_add

- AtomicPtr::fetch_ptr_sub

- AtomicPtr::fetch_byte_add

- AtomicPtr::fetch_byte_sub

- AtomicPtr::fetch_or

- AtomicPtr::fetch_and

- AtomicPtr::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_pow

- i{N}::strict_add_unsigned

- i{N}::strict_sub_unsigned

- i{N}::strict_abs

- u{N}::strict_add_signed

- u{N}::strict_sub_signed

- PanicHookInfo::payload_as_str

- core::iter::chain

- u{N}::checked_signed_diff

- core::array::repeat

- PathBuf::add_extension

- PathBuf::with_added_extension

- Duration::from_mins

- Duration::from_hours

- impl PartialEq for PathBuf

- impl PartialEq for PathBuf

- impl PartialEq for Path

- impl PartialEq for Path

- impl PartialEq for String

- impl PartialEq for String

- impl PartialEq for str

- impl PartialEq for str

- Ipv4Addr::from_octets

- Ipv6Addr::from_octets

- Ipv6Addr::from_segments

- impl Default for Pin> where Box: Default, T: ?Sized

- impl Default for Pin> where Rc: Default, T: ?Sized

- impl Default for Pin> where Arc: Default, T: ?Sized

- Cell::as_array_of_cells

- u{N}::carrying_add

- u{N}::borrowing_sub

- u{N}::carrying_mul

- u{N}::carrying_mul_add

- BTreeMap::extract_if

- BTreeSet::extract_if

- impl Debug for windows::ffi::EncodeWide<'_>

- str::ceil_char_boundary

- str::floor_char_boundary

- impl Sum for Saturating

- impl Sum<&Self> for Saturating

- impl Product for Saturating

- impl Product<&Self> for Saturating

These previously stable APIs are now stable in const contexts:

- <[T; N]>::each_ref

- <[T; N]>::each_mut

- OsString::new

- PathBuf::new

- TypeId::of

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

(config doc)

(build cache doc)

#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 #16032

Rustdoc

-----

- 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

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

- Invalid numeric literal suffixes in tuple indexing, tuple struct indexing, and struct field name positions are now correctly rejected

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

#15910

- 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's build-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.

- Update to LLVM 21