Skip to content

Conversation

@gewitternacht
Copy link
Contributor

Most standard library collections break if Clone has a non-standard implementation which violates x.clone() == x. Here the resulting broken behaviour of different collections is shown. I originally created an issue at rust-lang/hashbrown#629, but the conclusion there was that x.clone() resulting in an object that compares equal to the original one is probably a very universal assumption. However, this assumption is (to my knowledge) not documented anywhere.

I propose to make this assumption explicit in the Clone trait documentation. The property that seems the most reasonable to me is the following: When implementing both Clone and PartialEq, then

x == x -> x.clone() == x

is expected to hold. This way, when also implementing Eq, it automatically follows that x.clone() == x has to hold, which should be enough for the collections to not break. At the same time, the property also works for the "normal" elements of a type with PartialEq. For the wording, I tried to follow the Hash and Eq documentation.

As I am fairly new to Rust, it might well be that this property cannot be generally expected – it seems reasonable to me, but any counter-examples or critique, both content- and wording-wise, would be very welcome. If the property turns out to be too general, I would suggest to at least document the assumption of x.clone() == x for the collections somehow.

An additional thought of mine:
If it is indeed generally expected that x == x -> x.clone() == x, then, for the sake of completeness, one could also define that x != x -> y != y for y = x.clone() should hold, i.e., that an object that did not compare equal to itself before cloning, should also not compare equal to itself afterwards.

@rustbot
Copy link
Collaborator

rustbot commented Jul 22, 2025

r? @Mark-Simulacrum

rustbot has assigned @Mark-Simulacrum.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jul 22, 2025
@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

/// Violating this property is a logic error. The behavior resulting from a logic error is not
/// specified, but users of the trait must ensure that such logic errors do *not* result in
/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
/// methods.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a bit confusing to say "these methods" here IMO - maybe "this property"?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, I could change it to "... rely on this property being satisfied."

The reason behind the "correctness of these methods" wording is that it is phrased like this in the documentation on Hash and Eq, as well as the Eq and PartialEq trait documentation. I found it confusing there, too, but I thought it was just because I lacked experience with the terminology.
So, would you say the wording in these other places is confusing, too? And if so, should I make it part of this PR to change it there, too? (my first time doing a PR like this, so I'm still learning best practices)

@Mark-Simulacrum Mark-Simulacrum added T-libs-api Relevant to the library API team, which will review and decide on the PR/issue. S-waiting-on-team DEPRECATED: Use the team-based variants `S-waiting-on-t-lang`, `S-waiting-on-t-compiler`, ... needs-fcp This change is insta-stable, or significant enough to need a team FCP to proceed. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 27, 2025
@Mark-Simulacrum
Copy link
Member

Moving into libs-api queue for FCP, since this is a new property (even if likely already required implicitly) so merits some team discussion.

@Amanieu Amanieu removed the T-libs Relevant to the library team, which will review and decide on the PR/issue. label Jul 30, 2025
/// // Note: With the manual implementations the above line will compile.
/// ```
///
/// ## `Clone` and `PartialEq`/`Eq`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's unclear whether this should apply to PartialEq.

However this definitely needs to be extended to include Hash and Ord since HashMap and BTreeMap rely on this. It could also have vague wording that this may extend to other traits as well.

Copy link
Contributor Author

@gewitternacht gewitternacht Aug 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's unclear whether this should apply to PartialEq.

Do you mean this in the sense that the property cannot be required of PartialEq and Clone as we might have to deliberalty break it in some contexts? Or in the sense that we just don't know of anything that depends on this property for PartialEq?
In case of the latter, I would argue that the documentation of Clone – "creation of a duplicate value" – very strongly suggests that I get the "same" thing by cloning, and PartialEq defines "sameness" of objects. E.g., if f == 1.0_f64, I expect that f.clone() == 1.0_f64, too. But without the property x == x -> x.clone() == x, this is never explicitly guaranteed anywhere.

However this definitely needs to be extended to include Hash and Ord since HashMap and BTreeMap rely on this. It could also have vague wording that this may extend to other traits as well.

I only wrote about PartialEq/Eq because x.clone() == x already ensures that clone preserves the hash and ordering of elements, when put together with the guarantees that are required of Hash (see "Hash and Eq") and Ord (due to the conditions for PartialOrd). But I could make this interaction explicit.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now that I think about it, you are correct and PartialEq is the right place to introduce this requirement.

@Amanieu
Copy link
Member

Amanieu commented Aug 10, 2025

@bors r+ rollup

@bors
Copy link
Collaborator

bors commented Aug 10, 2025

📌 Commit fadc961 has been approved by Amanieu

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-team DEPRECATED: Use the team-based variants `S-waiting-on-t-lang`, `S-waiting-on-t-compiler`, ... labels Aug 10, 2025
Zalathar added a commit to Zalathar/rust that referenced this pull request Aug 11, 2025
…=Amanieu

document assumptions about `Clone` and `Eq` traits

Most standard library collections break if `Clone` has a non-standard implementation which violates `x.clone() == x`. [Here](https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=b7fc6dfa8410cbb673eb8d38393d81de) the resulting broken behaviour of different collections is shown. I originally created an issue at rust-lang/hashbrown#629, but the conclusion there was that `x.clone()` resulting in an object that compares equal to the original one is probably a very universal assumption. However, this assumption is (to my knowledge) not documented anywhere.

I propose to make this assumption explicit in the `Clone` trait documentation. The property that seems the most reasonable to me is the following: When implementing both `Clone` and `PartialEq`, then
```text
x == x -> x.clone() == x
```
is expected to hold. This way, when also implementing `Eq`, it automatically follows that `x.clone() == x` has to hold, which should be enough for the collections to not break. At the same time, the property also works for the "normal" elements of a type with `PartialEq`. For the wording, I tried to follow the [`Hash` and `Eq`](https://doc.rust-lang.org/std/hash/trait.Hash.html#hash-and-eq) documentation.

As I am fairly new to Rust, it might well be that this property cannot be generally expected – it seems reasonable to me, but any counter-examples or critique, both content- and wording-wise, would be very welcome. If the property turns out to be too general, I would suggest to at least document the assumption of `x.clone() == x` for the collections somehow.

An additional thought of mine:
If it is indeed generally expected that `x == x -> x.clone() == x`, then, for the sake of completeness, one could also define that `x != x -> y != y for y = x.clone()` should hold, i.e., that an object that did not compare equal to itself before cloning, should also not compare equal to itself afterwards.
bors added a commit that referenced this pull request Aug 11, 2025
Rollup of 7 pull requests

Successful merges:

 - #143949 (Constify remaining traits/impls for `const_ops`)
 - #144330 (document assumptions about `Clone` and `Eq` traits)
 - #144350 (std: sys: io: io_slice: Add UEFI types)
 - #144558 (Point at the `Fn()` or `FnMut()` bound that coerced a closure, which caused a move error)
 - #145149 (Make config method invoke inside parse use dwn_ctx)
 - #145227 (Tweak spans providing type context on errors when involving macros)
 - #145228 (Remove unnecessary parentheses in `assert!`s)

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit 2c314f9 into rust-lang:master Aug 11, 2025
10 checks passed
@rustbot rustbot added this to the 1.91.0 milestone Aug 11, 2025
rust-timer added a commit that referenced this pull request Aug 11, 2025
Rollup merge of #144330 - gewitternacht:document-clone-eq, r=Amanieu

document assumptions about `Clone` and `Eq` traits

Most standard library collections break if `Clone` has a non-standard implementation which violates `x.clone() == x`. [Here](https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=b7fc6dfa8410cbb673eb8d38393d81de) the resulting broken behaviour of different collections is shown. I originally created an issue at rust-lang/hashbrown#629, but the conclusion there was that `x.clone()` resulting in an object that compares equal to the original one is probably a very universal assumption. However, this assumption is (to my knowledge) not documented anywhere.

I propose to make this assumption explicit in the `Clone` trait documentation. The property that seems the most reasonable to me is the following: When implementing both `Clone` and `PartialEq`, then
```text
x == x -> x.clone() == x
```
is expected to hold. This way, when also implementing `Eq`, it automatically follows that `x.clone() == x` has to hold, which should be enough for the collections to not break. At the same time, the property also works for the "normal" elements of a type with `PartialEq`. For the wording, I tried to follow the [`Hash` and `Eq`](https://doc.rust-lang.org/std/hash/trait.Hash.html#hash-and-eq) documentation.

As I am fairly new to Rust, it might well be that this property cannot be generally expected – it seems reasonable to me, but any counter-examples or critique, both content- and wording-wise, would be very welcome. If the property turns out to be too general, I would suggest to at least document the assumption of `x.clone() == x` for the collections somehow.

An additional thought of mine:
If it is indeed generally expected that `x == x -> x.clone() == x`, then, for the sake of completeness, one could also define that `x != x -> y != y for y = x.clone()` should hold, i.e., that an object that did not compare equal to itself before cloning, should also not compare equal to itself afterwards.
github-actions bot pushed a commit to model-checking/verify-rust-std that referenced this pull request Aug 13, 2025
…=Amanieu

document assumptions about `Clone` and `Eq` traits

Most standard library collections break if `Clone` has a non-standard implementation which violates `x.clone() == x`. [Here](https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=b7fc6dfa8410cbb673eb8d38393d81de) the resulting broken behaviour of different collections is shown. I originally created an issue at rust-lang/hashbrown#629, but the conclusion there was that `x.clone()` resulting in an object that compares equal to the original one is probably a very universal assumption. However, this assumption is (to my knowledge) not documented anywhere.

I propose to make this assumption explicit in the `Clone` trait documentation. The property that seems the most reasonable to me is the following: When implementing both `Clone` and `PartialEq`, then
```text
x == x -> x.clone() == x
```
is expected to hold. This way, when also implementing `Eq`, it automatically follows that `x.clone() == x` has to hold, which should be enough for the collections to not break. At the same time, the property also works for the "normal" elements of a type with `PartialEq`. For the wording, I tried to follow the [`Hash` and `Eq`](https://doc.rust-lang.org/std/hash/trait.Hash.html#hash-and-eq) documentation.

As I am fairly new to Rust, it might well be that this property cannot be generally expected – it seems reasonable to me, but any counter-examples or critique, both content- and wording-wise, would be very welcome. If the property turns out to be too general, I would suggest to at least document the assumption of `x.clone() == x` for the collections somehow.

An additional thought of mine:
If it is indeed generally expected that `x == x -> x.clone() == x`, then, for the sake of completeness, one could also define that `x != x -> y != y for y = x.clone()` should hold, i.e., that an object that did not compare equal to itself before cloning, should also not compare equal to itself afterwards.
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Nov 4, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [rust](https://github.com/rust-lang/rust) | minor | `1.90.0` -> `1.91.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>rust-lang/rust (rust)</summary>

### [`v1.91.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1910-2025-10-30)

[Compare Source](rust-lang/rust@1.90.0...1.91.0)

\==========================

<a id="1.91.0-Language"></a>

## Language

- [Lower pattern bindings in the order they're written and base drop order on primary bindings' order](rust-lang/rust#143764)
- [Stabilize declaration of C-style variadic functions for `sysv64`, `win64`, `efiapi`, and `aapcs` ABIs](rust-lang/rust#144066).
  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](rust-lang/rust#144322)
- [Upgrade `semicolon_in_expressions_from_macros` from warn to deny](rust-lang/rust#144369)
- [Stabilize LoongArch32 inline assembly](rust-lang/rust#144402)
- [Add warn-by-default `integer_to_ptr_transmutes` lint against integer-to-pointer transmutes](rust-lang/rust#144531)
- [Stabilize `sse4a` and `tbm` target features](rust-lang/rust#144542)
- [Add `target_env = "macabi"` and `target_env = "sim"` cfgs](rust-lang/rust#139451) as replacements for the `target_abi` cfgs with the same values.

<a id="1.91.0-Compiler"></a>

## Compiler

- [Don't warn on never-to-any `as` casts as unreachable](rust-lang/rust#144804)

<a id="1.91.0-Platform-Support"></a>

## Platform Support

- [Promote `aarch64-pc-windows-gnullvm` and `x86_64-pc-windows-gnullvm` to Tier 2 with host tools.](rust-lang/rust#143031)
  Note: llvm-tools and MSI installers are missing but will be added in future releases.
- [Promote `aarch64-pc-windows-msvc` to Tier 1](rust-lang/rust#145682)

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

<a id="1.91.0-Libraries"></a>

## Libraries

- [Print thread ID in panic message](rust-lang/rust#115746)
- [Fix overly restrictive lifetime in `core::panic::Location::file` return type](rust-lang/rust#132087)
- [Guarantee parameter order for `_by()` variants of `min` / `max`/ `minmax` in `std::cmp`](rust-lang/rust#139357)
- [Document assumptions about `Clone` and `Eq` traits](rust-lang/rust#144330)
- [`std::thread`: Return error if setting thread stack size fails](rust-lang/rust#144210)
  This used to panic within the standard library.

<a id="1.91.0-Stabilized-APIs"></a>

## Stabilized APIs

- [`Path::file_prefix`](https://doc.rust-lang.org/stable/std/path/struct.Path.html#method.file_prefix)
- [`AtomicPtr::fetch_ptr_add`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_ptr_add)
- [`AtomicPtr::fetch_ptr_sub`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_ptr_sub)
- [`AtomicPtr::fetch_byte_add`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_byte_add)
- [`AtomicPtr::fetch_byte_sub`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_byte_sub)
- [`AtomicPtr::fetch_or`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_or)
- [`AtomicPtr::fetch_and`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_and)
- [`AtomicPtr::fetch_xor`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_xor)
- [`{integer}::strict_add`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_add)
- [`{integer}::strict_sub`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_sub)
- [`{integer}::strict_mul`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_mul)
- [`{integer}::strict_div`](https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_div)
- [`{integer}::strict_div_euclid`](https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_div_euclid)
- [`{integer}::strict_rem`](https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_rem)
- [`{integer}::strict_rem_euclid`](https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_rem_euclid)
- [`{integer}::strict_neg`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_neg)
- [`{integer}::strict_shl`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_shl)
- [`{integer}::strict_shr`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_shr)
- [`{integer}::strict_pow`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_pow)
- [`i{N}::strict_add_unsigned`](https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_add_unsigned)
- [`i{N}::strict_sub_unsigned`](https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_sub_unsigned)
- [`i{N}::strict_abs`](https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_abs)
- [`u{N}::strict_add_signed`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_add_signed)
- [`u{N}::strict_sub_signed`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_sub_signed)
- [`PanicHookInfo::payload_as_str`](https://doc.rust-lang.org/stable/std/panic/struct.PanicHookInfo.html#method.payload_as_str)
- [`core::iter::chain`](https://doc.rust-lang.org/stable/core/iter/fn.chain.html)
- [`u{N}::checked_signed_diff`](https://doc.rust-lang.org/stable/std/primitive.u16.html#method.checked_signed_diff)
- [`core::array::repeat`](https://doc.rust-lang.org/stable/core/array/fn.repeat.html)
- [`PathBuf::add_extension`](https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.add_extension)
- [`PathBuf::with_added_extension`](https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.with_added_extension)
- [`Duration::from_mins`](https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.from_mins)
- [`Duration::from_hours`](https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.from_hours)
- [`impl PartialEq<str> for PathBuf`](https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#impl-PartialEq%3Cstr%3E-for-PathBuf)
- [`impl PartialEq<String> for PathBuf`](https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#impl-PartialEq%3CString%3E-for-PathBuf)
- [`impl PartialEq<str> for Path`](https://doc.rust-lang.org/stable/std/path/struct.Path.html#impl-PartialEq%3Cstr%3E-for-Path)
- [`impl PartialEq<String> for Path`](https://doc.rust-lang.org/stable/std/path/struct.Path.html#impl-PartialEq%3CString%3E-for-Path)
- [`impl PartialEq<PathBuf> for String`](https://doc.rust-lang.org/stable/std/string/struct.String.html#impl-PartialEq%3CPathBuf%3E-for-String)
- [`impl PartialEq<Path> for String`](https://doc.rust-lang.org/stable/std/string/struct.String.html#impl-PartialEq%3CPath%3E-for-String)
- [`impl PartialEq<PathBuf> for str`](https://doc.rust-lang.org/stable/std/primitive.str.html#impl-PartialEq%3CPathBuf%3E-for-str)
- [`impl PartialEq<Path> for str`](https://doc.rust-lang.org/stable/std/primitive.str.html#impl-PartialEq%3CPath%3E-for-str)
- [`Ipv4Addr::from_octets`](https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.from_octets)
- [`Ipv6Addr::from_octets`](https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.from_octets)
- [`Ipv6Addr::from_segments`](https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.from_segments)
- [`impl<T> Default for Pin<Box<T>> where Box<T>: Default, T: ?Sized`](https://doc.rust-lang.org/stable/std/default/trait.Default.html#impl-Default-for-Pin%3CBox%3CT%3E%3E)
- [`impl<T> Default for Pin<Rc<T>> where Rc<T>: Default, T: ?Sized`](https://doc.rust-lang.org/stable/std/default/trait.Default.html#impl-Default-for-Pin%3CRc%3CT%3E%3E)
- [`impl<T> Default for Pin<Arc<T>> where Arc<T>: Default, T: ?Sized`](https://doc.rust-lang.org/stable/std/default/trait.Default.html#impl-Default-for-Pin%3CArc%3CT%3E%3E)
- [`Cell::as_array_of_cells`](https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#method.as_array_of_cells)
- [`u{N}::carrying_add`](https://doc.rust-lang.org/stable/std/primitive.u64.html#method.carrying_add)
- [`u{N}::borrowing_sub`](https://doc.rust-lang.org/stable/std/primitive.u64.html#method.borrowing_sub)
- [`u{N}::carrying_mul`](https://doc.rust-lang.org/stable/std/primitive.u64.html#method.carrying_mul)
- [`u{N}::carrying_mul_add`](https://doc.rust-lang.org/stable/std/primitive.u64.html#method.carrying_mul_add)
- [`BTreeMap::extract_if`](https://doc.rust-lang.org/stable/std/collections/struct.BTreeMap.html#method.extract_if)
- [`BTreeSet::extract_if`](https://doc.rust-lang.org/stable/std/collections/struct.BTreeSet.html#method.extract_if)
- [`impl Debug for windows::ffi::EncodeWide<'_>`](https://doc.rust-lang.org/stable/std/os/windows/ffi/struct.EncodeWide.html#impl-Debug-for-EncodeWide%3C'_%3E)
- [`str::ceil_char_boundary`](https://doc.rust-lang.org/stable/std/primitive.str.html#method.ceil_char_boundary)
- [`str::floor_char_boundary`](https://doc.rust-lang.org/stable/std/primitive.str.html#method.floor_char_boundary)
- [`impl Sum for Saturating<u{N}>`](https://doc.rust-lang.org/stable/std/num/struct.Saturating.html#impl-Sum-for-Saturating%3Cu32%3E)
- [`impl Sum<&Self> for Saturating<u{N}>`](https://doc.rust-lang.org/stable/std/num/struct.Saturating.html#impl-Sum%3C%26Saturating%3Cu32%3E%3E-for-Saturating%3Cu32%3E)
- [`impl Product for Saturating<u{N}>`](https://doc.rust-lang.org/stable/std/num/struct.Saturating.html#impl-Product-for-Saturating%3Cu32%3E)
- [`impl Product<&Self> for Saturating<u{N}>`](https://doc.rust-lang.org/stable/std/num/struct.Saturating.html#impl-Product%3C%26Saturating%3Cu32%3E%3E-for-Saturating%3Cu32%3E)

These previously stable APIs are now stable in const contexts:

- [`<[T; N]>::each_ref`](https://doc.rust-lang.org/stable/std/primitive.array.html#method.each_ref)
- [`<[T; N]>::each_mut`](https://doc.rust-lang.org/stable/std/primitive.array.html#method.each_mut)
- [`OsString::new`](https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.new)
- [`PathBuf::new`](https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.new)
- [`TypeId::of`](https://doc.rust-lang.org/stable/std/any/struct.TypeId.html#method.of)
- [`ptr::with_exposed_provenance`](https://doc.rust-lang.org/stable/std/ptr/fn.with_exposed_provenance.html)
- [`ptr::with_exposed_provenance_mut`](https://doc.rust-lang.org/stable/std/ptr/fn.with_exposed_provenance_mut.html)

<a id="1.91.0-Cargo"></a>

## 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](https://doc.rust-lang.org/stable/cargo/reference/config.html#buildbuild-dir))
  ([build cache doc](https://doc.rust-lang.org/stable/cargo/reference/build-cache.html))
  [#&#8203;15833](rust-lang/cargo#15833)
  [#&#8203;15840](rust-lang/cargo#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.
  [#&#8203;15838](rust-lang/cargo#15838)
  [#&#8203;16003](rust-lang/cargo#16003)
  [#&#8203;16032](rust-lang/cargo#16032)

<a id="1.91.0-Rustdoc"></a>

## Rustdoc

- [In search results, rank doc aliases lower than non-alias items with the same name](rust-lang/rust#145100)
- [Raw pointers now work in type-based search like references](rust-lang/rust#145731). 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.

<a id="1.91.0-Compatibility-Notes"></a>

## Compatibility Notes

- [Always require coroutine captures to be drop-live](rust-lang/rust#144156)
- [Apple: Always pass SDK root when linking with `cc`, and pass it via `SDKROOT` env var](rust-lang/rust#131477). 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<AssocTy: ?Sized>` are now correctly forbidden](rust-lang/rust#135331)
- [Add unstable `#[sanitize(xyz = "on|off")]` built-in attribute that shadows procedural macros with the same name](rust-lang/rust#142681)
- [Fix the drop checker being more permissive for bindings declared with let-else](rust-lang/rust#143028)
- [Be more strict when parsing attributes, erroring on many invalid attributes](rust-lang/rust#144689)
  - [Error on invalid `#[should_panic]` attributes](rust-lang/rust#143808)
  - [Error on invalid `#[link]` attributes](rust-lang/rust#143193)
- [Mark all deprecation lints in name resolution as deny-by-default and also report in dependencies](rust-lang/rust#143929)
- 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](rust-lang/rust#144386)
- [Start reporting future breakage for `ill_formed_attribute_input` in dependencies](rust-lang/rust#144544)
- [Restrict the scope of temporaries created by the macros `pin!`, `format_args!`, `write!`, and `writeln!` in `if let` scrutinees in Rust Edition 2024.](rust-lang/rust#145342) This applies [Rust Edition 2024's `if let` temporary scope rules](https://doc.rust-lang.org/edition-guide/rust-2024/temporary-if-let-scope.html) 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](rust-lang/rust#145463)
- [Closures marked with the keyword `static` are now syntactically invalid](rust-lang/rust#145604)
- [Shebangs inside `--cfg` and `--check-cfg` arguments are no longer allowed](rust-lang/rust#146211)
- [Add future incompatibility lint for temporary lifetime shortening in Rust 1.92](rust-lang/rust#147056)

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`.
  [#&#8203;15910](rust-lang/cargo#15910)
- Adjust Cargo messages to match rustc diagnostic style.
  This changes some of the terminal colors used by Cargo messages.
  [#&#8203;15928](rust-lang/cargo#15928)
- Tools and projects relying on the
  [internal details of Cargo's `build-dir`](https://doc.rust-lang.org/cargo/reference/build-cache.html)
  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](rust-lang/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](rust-lang/cargo#15010)).

<a id="1.91.0-Internal-Changes"></a>

## 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](rust-lang/rust#143684)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNjkuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE2OS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
wip-sync pushed a commit to NetBSD/pkgsrc-wip that referenced this pull request Nov 5, 2025
Pkgsrc changes:
 * Adjust patches to adapt to upstream changes and new versions.
 * assosicated checksums
 * Add a workaround for LLVM mis-using -isystem.  Reported upstream
   at llvm/llvm-project#166420

Noteable failures at the time of commit:
 * The cross-build for armv6 fails, reported upstream at
   rust-lang/rust#148464
 * The cross-build for powerpc fails, reported upstream at
   rust-lang/rust#148497
   This is R_PPC_PLTREL24 which now has insufficient range.
   Asked for recpie for directing the rust code generator to cope.

Upstream changes relative to 1.90.0:

Version 1.91.0 (2025-10-30)
==========================

Language
--------

- [Lower pattern bindings in the order they're written and base
  drop order on primary bindings' order]
  (rust-lang/rust#143764)
- [Stabilize declaration of C-style variadic functions for `sysv64`,
  `win64`, `efiapi`, and `aapcs` ABIs]
  (rust-lang/rust#144066).  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]
  (rust-lang/rust#144322)
- [Upgrade `semicolon_in_expressions_from_macros` from warn to deny]
  (rust-lang/rust#144369)
- [Stabilize LoongArch32 inline assembly]
  (rust-lang/rust#144402)
- [Add warn-by-default `integer_to_ptr_transmutes` lint against
  integer-to-pointer transmutes]
  (rust-lang/rust#144531)
- [Stabilize `sse4a` and `tbm` target features]
  (rust-lang/rust#144542)
- [Add `target_env = "macabi"` and `target_env = "sim"` cfgs]
  (rust-lang/rust#139451) as replacements
  for the `target_abi` cfgs with the same values.

Compiler
--------

- [Don't warn on never-to-any `as` casts as unreachable]
  (rust-lang/rust#144804)

Platform Support
----------------

- [Promote `aarch64-pc-windows-gnullvm` and `x86_64-pc-windows-gnullvm`
  to Tier 2 with host tools.]
  (rust-lang/rust#143031) Note: llvm-tools
  and MSI installers are missing but will be added in future
  releases.
- [Promote `aarch64-pc-windows-msvc` to Tier 1]
  (rust-lang/rust#145682)

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]
  (rust-lang/rust#115746)
- [Fix overly restrictive lifetime in `core::panic::Location::file` return type]
  (rust-lang/rust#132087)
- [Guarantee parameter order for `_by()` variants of `min` / `max`/
  `minmax` in `std::cmp`] (rust-lang/rust#139357)
- [Document assumptions about `Clone` and `Eq` traits]
  (rust-lang/rust#144330)
- [`std::thread`: Return error if setting thread stack size fails]
  (rust-lang/rust#144210)
  This used to panic within the standard library.

Stabilized APIs
---------------

- [`Path::file_prefix`]
  (https://doc.rust-lang.org/stable/std/path/struct.Path.html#method.file_prefix)
- [`AtomicPtr::fetch_ptr_add`]
  (https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_ptr_add)
- [`AtomicPtr::fetch_ptr_sub`]
  (https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_ptr_sub)
- [`AtomicPtr::fetch_byte_add`]
  (https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_byte_add)
- [`AtomicPtr::fetch_byte_sub`]
  (https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_byte_sub)
- [`AtomicPtr::fetch_or`]
  (https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_or)
- [`AtomicPtr::fetch_and`]
  (https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_and)
- [`AtomicPtr::fetch_xor`]
  (https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_xor)
- [`{integer}::strict_add`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_add)
- [`{integer}::strict_sub`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_sub)
- [`{integer}::strict_mul`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_mul)
- [`{integer}::strict_div`]
  (https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_div)
- [`{integer}::strict_div_euclid`]
  (https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_div_euclid)
- [`{integer}::strict_rem`]
  (https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_rem)
- [`{integer}::strict_rem_euclid`]
  (https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_rem_euclid)
- [`{integer}::strict_neg`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_neg)
- [`{integer}::strict_shl`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_shl)
- [`{integer}::strict_shr`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_shr)
- [`{integer}::strict_pow`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_pow)
- [`i{N}::strict_add_unsigned`]
  (https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_add_unsigned)
- [`i{N}::strict_sub_unsigned`]
  (https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_sub_unsigned)
- [`i{N}::strict_abs`]
  (https://doc.rust-lang.org/stable/std/primitive.i32.html#method.strict_abs)
- [`u{N}::strict_add_signed`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_add_signed)
- [`u{N}::strict_sub_signed`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.strict_sub_signed)
- [`PanicHookInfo::payload_as_str`]
  (https://doc.rust-lang.org/stable/std/panic/struct.PanicHookInfo.html#method.payload_as_str)
- [`core::iter::chain`]
  (https://doc.rust-lang.org/stable/core/iter/fn.chain.html)
- [`u{N}::checked_signed_diff`]
  (https://doc.rust-lang.org/stable/std/primitive.u16.html#method.checked_signed_diff)
- [`core::array::repeat`]
  (https://doc.rust-lang.org/stable/core/array/fn.repeat.html)
- [`PathBuf::add_extension`]
  (https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.add_extension)
- [`PathBuf::with_added_extension`]
  (https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.with_added_extension)
- [`Duration::from_mins`]
  (https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.from_mins)
- [`Duration::from_hours`]
  (https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.from_hours)
- [`impl PartialEq<str> for PathBuf`]
  (https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#impl-PartialEq%3Cstr%3E-for-PathBuf)
- [`impl PartialEq<String> for PathBuf`]
  (https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#impl-PartialEq%3CString%3E-for-PathBuf)
- [`impl PartialEq<str> for Path`]
  (https://doc.rust-lang.org/stable/std/path/struct.Path.html#impl-PartialEq%3Cstr%3E-for-Path)
- [`impl PartialEq<String> for Path`]
  (https://doc.rust-lang.org/stable/std/path/struct.Path.html#impl-PartialEq%3CString%3E-for-Path)
- [`impl PartialEq<PathBuf> for String`]
  (https://doc.rust-lang.org/stable/std/string/struct.String.html#impl-PartialEq%3CPathBuf%3E-for-String)
- [`impl PartialEq<Path> for String`]
  (https://doc.rust-lang.org/stable/std/string/struct.String.html#impl-PartialEq%3CPath%3E-for-String)
- [`impl PartialEq<PathBuf> for str`]
  (https://doc.rust-lang.org/stable/std/primitive.str.html#impl-PartialEq%3CPathBuf%3E-for-str)
- [`impl PartialEq<Path> for str`]
  (https://doc.rust-lang.org/stable/std/primitive.str.html#impl-PartialEq%3CPath%3E-for-str)
- [`Ipv4Addr::from_octets`]
  (https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.from_octets)
- [`Ipv6Addr::from_octets`]
  (https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.from_octets)
- [`Ipv6Addr::from_segments`]
  (https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.from_segments)
- [`impl<T> Default for Pin<Box<T>> where Box<T>: Default, T: ?Sized`]
  (https://doc.rust-lang.org/stable/std/default/trait.Default.html#impl-Default-for-Pin%3CBox%3CT%3E%3E)
- [`impl<T> Default for Pin<Rc<T>> where Rc<T>: Default, T: ?Sized`]
  (https://doc.rust-lang.org/stable/std/default/trait.Default.html#impl-Default-for-Pin%3CRc%3CT%3E%3E)
- [`impl<T> Default for Pin<Arc<T>> where Arc<T>: Default, T: ?Sized`]
  (https://doc.rust-lang.org/stable/std/default/trait.Default.html#impl-Default-for-Pin%3CArc%3CT%3E%3E)
- [`Cell::as_array_of_cells`]
  (https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#method.as_array_of_cells)
- [`u{N}::carrying_add`]
  (https://doc.rust-lang.org/stable/std/primitive.u64.html#method.carrying_add)
- [`u{N}::borrowing_sub`]
  (https://doc.rust-lang.org/stable/std/primitive.u64.html#method.borrowing_sub)
- [`u{N}::carrying_mul`]
  (https://doc.rust-lang.org/stable/std/primitive.u64.html#method.carrying_mul)
- [`u{N}::carrying_mul_add`]
  (https://doc.rust-lang.org/stable/std/primitive.u64.html#method.carrying_mul_add)
- [`BTreeMap::extract_if`]
  (https://doc.rust-lang.org/stable/std/collections/struct.BTreeMap.html#method.extract_if)
- [`BTreeSet::extract_if`]
  (https://doc.rust-lang.org/stable/std/collections/struct.BTreeSet.html#method.extract_if)
- [`impl Debug for windows::ffi::EncodeWide<'_>`]
  (https://doc.rust-lang.org/stable/std/os/windows/ffi/struct.EncodeWide.html#impl-Debug-for-EncodeWide%3C'_%3E)
- [`str::ceil_char_boundary`]
  (https://doc.rust-lang.org/stable/std/primitive.str.html#method.ceil_char_boundary)
- [`str::floor_char_boundary`]
  (https://doc.rust-lang.org/stable/std/primitive.str.html#method.floor_char_boundary)
- [`impl Sum for Saturating<u{N}>`]
  (https://doc.rust-lang.org/stable/std/num/struct.Saturating.html#impl-Sum-for-Saturating%3Cu32%3E)
- [`impl Sum<&Self> for Saturating<u{N}>`]
  (https://doc.rust-lang.org/stable/std/num/struct.Saturating.html#impl-Sum%3C%26Saturating%3Cu32%3E%3E-for-Saturating%3Cu32%3E)
- [`impl Product for Saturating<u{N}>`]
  (https://doc.rust-lang.org/stable/std/num/struct.Saturating.html#impl-Product-for-Saturating%3Cu32%3E)
- [`impl Product<&Self> for Saturating<u{N}>`]
  (https://doc.rust-lang.org/stable/std/num/struct.Saturating.html#impl-Product%3C%26Saturating%3Cu32%3E%3E-for-Saturating%3Cu32%3E)

These previously stable APIs are now stable in const contexts:

- [`<[T; N]>::each_ref`]
  (https://doc.rust-lang.org/stable/std/primitive.array.html#method.each_ref)
- [`<[T; N]>::each_mut`]
  (https://doc.rust-lang.org/stable/std/primitive.array.html#method.each_mut)
- [`OsString::new`]
  (https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.new)
- [`PathBuf::new`]
  (https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.new)
- [`TypeId::of`]
  (https://doc.rust-lang.org/stable/std/any/struct.TypeId.html#method.of)
- [`ptr::with_exposed_provenance`]
  (https://doc.rust-lang.org/stable/std/ptr/fn.with_exposed_provenance.html)
- [`ptr::with_exposed_provenance_mut`]
  (https://doc.rust-lang.org/stable/std/ptr/fn.with_exposed_provenance_mut.html)

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]
  (https://doc.rust-lang.org/stable/cargo/reference/config.html#buildbuild-dir))
  ([build cache doc]
  (https://doc.rust-lang.org/stable/cargo/reference/build-cache.html))
  [#15833](rust-lang/cargo#15833)
  [#15840](rust-lang/cargo#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](rust-lang/cargo#15838)
  [#16003](rust-lang/cargo#16003)
  [#16032](rust-lang/cargo#16032)

Rustdoc
-----

- [In search results, rank doc aliases lower than non-alias items
  with the same name](rust-lang/rust#145100)
- [Raw pointers now work in type-based search like references]
  (rust-lang/rust#145731). 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]
  (rust-lang/rust#144156)
- [Apple: Always pass SDK root when linking with `cc`, and pass it
  via `SDKROOT` env var]
  (rust-lang/rust#131477). 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<AssocTy: ?Sized>` are now correctly forbidden]
  (rust-lang/rust#135331)
- [Add unstable `#[sanitize(xyz = "on|off")]` built-in attribute
  that shadows procedural macros with the same name]
  (rust-lang/rust#142681)
- [Fix the drop checker being more permissive for bindings declared
  with let-else] (rust-lang/rust#143028)
- [Be more strict when parsing attributes, erroring on many invalid attributes]
  (rust-lang/rust#144689)
    - [Error on invalid `#[should_panic]` attributes]
      (rust-lang/rust#143808)
    - [Error on invalid `#[link]` attributes]
      (rust-lang/rust#143193)
- [Mark all deprecation lints in name resolution as deny-by-default
  and also report in dependencies]
  (rust-lang/rust#143929)
- 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]
  (rust-lang/rust#144386)
- [Start reporting future breakage for `ill_formed_attribute_input`
  in dependencies] (rust-lang/rust#144544)
- [Restrict the scope of temporaries created by the macros `pin!`,
  `format_args!`, `write!`, and `writeln!` in `if let` scrutinees in
  Rust Edition 2024.]
  (rust-lang/rust#145342) This applies
  [Rust Edition 2024's `if let` temporary scope rules]
  (https://doc.rust-lang.org/edition-guide/rust-2024/temporary-if-let-scope.html)
  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]
  (rust-lang/rust#145463)
- [Closures marked with the keyword `static` are now syntactically invalid]
  (rust-lang/rust#145604)
- [Shebangs inside `--cfg` and `--check-cfg` arguments are no longer allowed]
  (rust-lang/rust#146211)
- [Add future incompatibility lint for temporary lifetime shortening
  in Rust 1.92] (rust-lang/rust#147056)

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](rust-lang/cargo#15910)
- Adjust Cargo messages to match rustc diagnostic style.
  This changes some of the terminal colors used by Cargo messages.
  [#15928](rust-lang/cargo#15928)
- Tools and projects relying on the
  [internal details of Cargo's `build-dir`]
  (https://doc.rust-lang.org/cargo/reference/build-cache.html)
  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](rust-lang/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]
  (rust-lang/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](rust-lang/rust#143684)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-fcp This change is insta-stable, or significant enough to need a team FCP to proceed. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-libs-api Relevant to the library API team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants