Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix ambiguous cases of multiple & in elided self lifetimes #117967

Merged
merged 7 commits into from
Jul 18, 2024

Conversation

adetaylor
Copy link
Contributor

@adetaylor adetaylor commented Nov 16, 2023

This change proposes simpler rules to identify the lifetime on self parameters which may be used to elide a return type lifetime.

The old rules

(copied from this comment)

Most of the code can be found in late.rs and acts on AST types. The function resolve_fn_params, in the success case, returns a single lifetime which can be used to elide the lifetime of return types.

Here's how:

  • If the first parameter is called self then we search that parameter using "self search rules", below
  • If no unique applicable lifetime was found, search all other parameters using "regular parameter search rules", below

(In practice the code does extra work to assemble good diagnostic information, so it's not quite laid out like the above.)

self search rules

This is primarily handled in find_lifetime_for_self , and is described slightly here already. The code:

  1. Recursively walks the type of the self parameter (there's some complexity about resolving various special cases, but it's essentially just walking the type as far as I can see)
  2. Each time we find a reference anywhere in the type, if the direct referent is Self (either spelled Self or by some alias resolution which I don't fully understand), then we'll add that to a set of candidate lifetimes
  3. If there's exactly one such unique lifetime candidate found, we return this lifetime.

Regular parameter search rules

  1. Find all the lifetimes in each parameter, including implicit, explicit etc.
  2. If there's exactly one parameter containing lifetimes, and if that parameter contains exactly one (unique) lifetime, and if we didn't find a self lifetime parameter already, we'll return this lifetime.

The new rules

There are no changes to the "regular parameter search rules" or to the overall flow, only to the self search rules which are now:

  1. Recursively walks the type of the self parameter, searching for lifetimes of reference types whose referent contains Self.1
  2. Keep a record of:
    • Whether 0, 1 or n unique lifetimes are found on references encountered during the walk
  3. If no lifetime was found, we don't return a lifetime. (This means other parameters' lifetimes may be used for return type lifetime elision).
  4. If there's one lifetime found, we return the lifetime.
  5. If multiple lifetimes were found, we abort elision entirely (other parameters' lifetimes won't be used).

Examples that were accepted before and will now be rejected

fn a(self: &Box<&Self>) -> &u32
fn b(self: &Pin<&mut Self>) -> &String
fn c(self: &mut &Self) -> Option<&Self>
fn d(self: &mut &Box<Self>, arg: &usize) -> &usize // previously used the lt from arg

Examples that change the elided lifetime

fn e(self: &mut Box<Self>, arg: &usize) -> &usize
//         ^ new                ^ previous

Examples that were rejected before and will now be accepted

fn f(self: &Box<Self>) -> &u32

edit: old PR description:

  struct Concrete(u32);

  impl Concrete {
      fn m(self: &Box<Self>) -> &u32 {
          &self.0
      }
  }

resulted in a confusing error.

  impl Concrete {
      fn n(self: &Box<&Self>) -> &u32 {
          &self.0
      }
  }

resulted in no error or warning, despite apparent ambiguity over the elided lifetime.

Fixes #117715

Footnotes

  1. this prevents us from considering lifetimes from inside of the self-type

@rustbot
Copy link
Collaborator

rustbot commented Nov 16, 2023

r? @cjgillot

(rustbot has picked a reviewer for you, use r? to override)

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Nov 16, 2023
@adetaylor
Copy link
Contributor Author

@cjgillot hello, I didn't know rustbot would assign a reviewer for a draft PR. This isn't yet ready.

@rust-log-analyzer

This comment has been minimized.

@clubby789
Copy link
Contributor

hello, I didn't know rustbot would assign a reviewer for a draft PR. This isn't yet ready.

Btw, you can use r<question mark> ghost in your initial mesage to prevent a reviewer being assigned

@adetaylor adetaylor marked this pull request as ready for review November 23, 2023 12:43
@adetaylor
Copy link
Contributor Author

I've now marked this as ready for review. Per discussion on #117715, this will need a crater run.

It's possible that we want to make the tests a bit more thorough before merging, but it would be good to initially get feedback on the approach (and maybe a crater run to find out if it's doomed)

@lcnr
Copy link
Contributor

lcnr commented Dec 11, 2023

let's do a crater run. I am still unsure about the exact behavior we want and probably have to look into this myself to figure it out 🤔 but for now

@bors try

@bors
Copy link
Contributor

bors commented Dec 11, 2023

⌛ Trying commit 15ce755 with merge 57fd743...

bors added a commit to rust-lang-ci/rust that referenced this pull request Dec 11, 2023
…r=<try>

Fix lifetime elision

```rust
  struct Concrete(u32);

  impl Concrete {
      fn m(self: &Box<Self>) -> &u32 {
          &self.0
      }
  }
```

resulted in a confusing error.

```rust
  impl Concrete {
      fn n(self: &Box<&Self>) -> &u32 {
          &self.0
      }
  }
```

resulted in no error or warning, despite apparent ambiguity over the elided lifetime.

Fixes rust-lang#117715
@bors
Copy link
Contributor

bors commented Dec 11, 2023

☀️ Try build successful - checks-actions
Build commit: 57fd743 (57fd74335bb14b59b719dc3cc5bc4257e73f33ce)

1 similar comment
@bors
Copy link
Contributor

bors commented Dec 11, 2023

☀️ Try build successful - checks-actions
Build commit: 57fd743 (57fd74335bb14b59b719dc3cc5bc4257e73f33ce)

@lcnr
Copy link
Contributor

lcnr commented Dec 12, 2023

@craterbot check

@craterbot
Copy link
Collaborator

👌 Experiment pr-117967 created and queued.
🤖 Automatically detected try build 57fd743
🔍 You can check out the queue and this experiment's details.

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot craterbot added S-waiting-on-crater Status: Waiting on a crater run to be completed. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Dec 12, 2023
@craterbot
Copy link
Collaborator

🚧 Experiment pr-117967 is now running

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot
Copy link
Collaborator

🎉 Experiment pr-117967 is completed!
📊 51 regressed and 5 fixed (398975 total)
📰 Open the full report.

⚠️ If you notice any spurious failure please add them to the blacklist!
ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot craterbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-crater Status: Waiting on a crater run to be completed. labels Dec 17, 2023
@cjgillot
Copy link
Contributor

r? @lcnr

@rfcbot rfcbot added finished-final-comment-period The final comment period is finished for this PR / Issue. to-announce Announce this issue on triage meeting and removed final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. labels Jul 13, 2024
@rfcbot
Copy link

rfcbot commented Jul 13, 2024

The final comment period, with a disposition to merge, as per the review above, is now complete.

As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed.

This will be merged soon.

@traviscross
Copy link
Contributor

@lcnr: Heads-up that FCP completed on this, so this is good to go forward as far as lang is concerned.

@lcnr
Copy link
Contributor

lcnr commented Jul 18, 2024

missed that this finished FCP already. Thanks for the good work @adetaylor and thanks for sticking with it for this long!

@bors r+ rollup=never

@lcnr lcnr closed this Jul 18, 2024
@lcnr lcnr reopened this Jul 18, 2024
@lcnr
Copy link
Contributor

lcnr commented Jul 18, 2024

@bors r+ rollup=never

@bors
Copy link
Contributor

bors commented Jul 18, 2024

📌 Commit a22130e has been approved by lcnr

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-review Status: Awaiting review from the assignee but also interested parties. labels Jul 18, 2024
@bors
Copy link
Contributor

bors commented Jul 18, 2024

⌛ Testing commit a22130e with merge 5753b30...

@bors
Copy link
Contributor

bors commented Jul 18, 2024

☀️ Test successful - checks-actions
Approved by: lcnr
Pushing 5753b30 to master...

@bors bors added the merged-by-bors This PR was explicitly merged by bors. label Jul 18, 2024
@bors bors merged commit 5753b30 into rust-lang:master Jul 18, 2024
13 checks passed
@rustbot rustbot added this to the 1.81.0 milestone Jul 18, 2024
@rust-timer
Copy link
Collaborator

Finished benchmarking commit (5753b30): comparison URL.

Overall result: ✅ improvements - no action needed

@rustbot label: -perf-regression

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
-0.3% [-0.3%, -0.3%] 2
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) -0.3% [-0.3%, -0.3%] 2

Max RSS (memory usage)

Results (primary 1.8%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

mean range count
Regressions ❌
(primary)
1.8% [1.8%, 1.8%] 1
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) 1.8% [1.8%, 1.8%] 1

Cycles

Results (secondary -2.5%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
-2.5% [-2.5%, -2.5%] 1
All ❌✅ (primary) - - 0

Binary size

This benchmark run did not return any relevant results for this metric.

Bootstrap: 767.488s -> 768.843s (0.18%)
Artifact size: 328.72 MiB -> 328.71 MiB (-0.00%)

github-actions bot pushed a commit to rust-lang/miri that referenced this pull request Jul 20, 2024
Fix ambiguous cases of multiple & in elided self lifetimes

This change proposes simpler rules to identify the lifetime on `self` parameters which may be used to elide a return type lifetime.

## The old rules

(copied from [this comment](rust-lang/rust#117967 (comment)))

Most of the code can be found in [late.rs](https://doc.rust-lang.org/stable/nightly-rustc/src/rustc_resolve/late.rs.html) and acts on AST types. The function [resolve_fn_params](https://doc.rust-lang.org/stable/nightly-rustc/src/rustc_resolve/late.rs.html#2006), in the success case, returns a single lifetime which can be used to elide the lifetime of return types.

Here's how:
* If the first parameter is called self then we search that parameter using "`self` search rules", below
* If no unique applicable lifetime was found, search all other parameters using "regular parameter search rules", below

(In practice the code does extra work to assemble good diagnostic information, so it's not quite laid out like the above.)

### `self` search rules

This is primarily handled in [find_lifetime_for_self](https://doc.rust-lang.org/stable/nightly-rustc/src/rustc_resolve/late.rs.html#2118) , and is described slightly [here](rust-lang/rust#117715 (comment)) already. The code:

1. Recursively walks the type of the `self` parameter (there's some complexity about resolving various special cases, but it's essentially just walking the type as far as I can see)
2. Each time we find a reference anywhere in the type, if the **direct** referent is `Self` (either spelled `Self` or by some alias resolution which I don't fully understand), then we'll add that to a set of candidate lifetimes
3. If there's exactly one such unique lifetime candidate found, we return this lifetime.

### Regular parameter search rules

1. Find all the lifetimes in each parameter, including implicit, explicit etc.
2. If there's exactly one parameter containing lifetimes, and if that parameter contains exactly one (unique) lifetime, *and if we didn't find a `self` lifetime parameter already*, we'll return this lifetime.

## The new rules

There are no changes to the "regular parameter search rules" or to the overall flow, only to the `self` search rules which are now:

1. Recursively walks the type of the `self` parameter, searching for lifetimes of reference types whose referent **contains** `Self`.[^1]
2. Keep a record of:
   * Whether 0, 1 or n unique lifetimes are found on references encountered during the walk
4. If no lifetime was found, we don't return a lifetime. (This means other parameters' lifetimes may be used for return type lifetime elision).
5. If there's one lifetime found, we return the lifetime.
6. If multiple lifetimes were found, we abort elision entirely (other parameters' lifetimes won't be used).

[^1]: this prevents us from considering lifetimes from inside of the self-type

## Examples that were accepted before and will now be rejected

```rust
fn a(self: &Box<&Self>) -> &u32
fn b(self: &Pin<&mut Self>) -> &String
fn c(self: &mut &Self) -> Option<&Self>
fn d(self: &mut &Box<Self>, arg: &usize) -> &usize // previously used the lt from arg
```

### Examples that change the elided lifetime

```rust
fn e(self: &mut Box<Self>, arg: &usize) -> &usize
//         ^ new                ^ previous
```

## Examples that were rejected before and will now be accepted

```rust
fn f(self: &Box<Self>) -> &u32
```

---

*edit: old PR description:*

```rust
  struct Concrete(u32);

  impl Concrete {
      fn m(self: &Box<Self>) -> &u32 {
          &self.0
      }
  }
```

resulted in a confusing error.

```rust
  impl Concrete {
      fn n(self: &Box<&Self>) -> &u32 {
          &self.0
      }
  }
```

resulted in no error or warning, despite apparent ambiguity over the elided lifetime.

Fixes rust-lang/rust#117715
@apiraino apiraino removed the to-announce Announce this issue on triage meeting label Jul 22, 2024
lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request Jul 28, 2024
Fix ambiguous cases of multiple & in elided self lifetimes

This change proposes simpler rules to identify the lifetime on `self` parameters which may be used to elide a return type lifetime.

## The old rules

(copied from [this comment](rust-lang/rust#117967 (comment)))

Most of the code can be found in [late.rs](https://doc.rust-lang.org/stable/nightly-rustc/src/rustc_resolve/late.rs.html) and acts on AST types. The function [resolve_fn_params](https://doc.rust-lang.org/stable/nightly-rustc/src/rustc_resolve/late.rs.html#2006), in the success case, returns a single lifetime which can be used to elide the lifetime of return types.

Here's how:
* If the first parameter is called self then we search that parameter using "`self` search rules", below
* If no unique applicable lifetime was found, search all other parameters using "regular parameter search rules", below

(In practice the code does extra work to assemble good diagnostic information, so it's not quite laid out like the above.)

### `self` search rules

This is primarily handled in [find_lifetime_for_self](https://doc.rust-lang.org/stable/nightly-rustc/src/rustc_resolve/late.rs.html#2118) , and is described slightly [here](rust-lang/rust#117715 (comment)) already. The code:

1. Recursively walks the type of the `self` parameter (there's some complexity about resolving various special cases, but it's essentially just walking the type as far as I can see)
2. Each time we find a reference anywhere in the type, if the **direct** referent is `Self` (either spelled `Self` or by some alias resolution which I don't fully understand), then we'll add that to a set of candidate lifetimes
3. If there's exactly one such unique lifetime candidate found, we return this lifetime.

### Regular parameter search rules

1. Find all the lifetimes in each parameter, including implicit, explicit etc.
2. If there's exactly one parameter containing lifetimes, and if that parameter contains exactly one (unique) lifetime, *and if we didn't find a `self` lifetime parameter already*, we'll return this lifetime.

## The new rules

There are no changes to the "regular parameter search rules" or to the overall flow, only to the `self` search rules which are now:

1. Recursively walks the type of the `self` parameter, searching for lifetimes of reference types whose referent **contains** `Self`.[^1]
2. Keep a record of:
   * Whether 0, 1 or n unique lifetimes are found on references encountered during the walk
4. If no lifetime was found, we don't return a lifetime. (This means other parameters' lifetimes may be used for return type lifetime elision).
5. If there's one lifetime found, we return the lifetime.
6. If multiple lifetimes were found, we abort elision entirely (other parameters' lifetimes won't be used).

[^1]: this prevents us from considering lifetimes from inside of the self-type

## Examples that were accepted before and will now be rejected

```rust
fn a(self: &Box<&Self>) -> &u32
fn b(self: &Pin<&mut Self>) -> &String
fn c(self: &mut &Self) -> Option<&Self>
fn d(self: &mut &Box<Self>, arg: &usize) -> &usize // previously used the lt from arg
```

### Examples that change the elided lifetime

```rust
fn e(self: &mut Box<Self>, arg: &usize) -> &usize
//         ^ new                ^ previous
```

## Examples that were rejected before and will now be accepted

```rust
fn f(self: &Box<Self>) -> &u32
```

---

*edit: old PR description:*

```rust
  struct Concrete(u32);

  impl Concrete {
      fn m(self: &Box<Self>) -> &u32 {
          &self.0
      }
  }
```

resulted in a confusing error.

```rust
  impl Concrete {
      fn n(self: &Box<&Self>) -> &u32 {
          &self.0
      }
  }
```

resulted in no error or warning, despite apparent ambiguity over the elided lifetime.

Fixes rust-lang/rust#117715
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Sep 11, 2024
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [rust](https://github.com/rust-lang/rust) | minor | `1.80.1` -> `1.81.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.81.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1810-2024-09-05)

[Compare Source](rust-lang/rust@1.80.1...1.81.0)

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

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

## Language

-   [Abort on uncaught panics in `extern "C"` functions.](rust-lang/rust#116088)
-   [Fix ambiguous cases of multiple `&` in elided self lifetimes.](rust-lang/rust#117967)
-   [Stabilize `#[expect]` for lints (RFC 2383),](rust-lang/rust#120924) like `#[allow]` with a warning if the lint is *not* fulfilled.
-   [Change method resolution to constrain hidden types instead of rejecting method candidates.](rust-lang/rust#123962)
-   [Bump `elided_lifetimes_in_associated_constant` to deny.](rust-lang/rust#124211)
-   [`offset_from`: always allow pointers to point to the same address.](rust-lang/rust#124921)
-   [Allow constraining opaque types during subtyping in the trait system.](rust-lang/rust#125447)
-   [Allow constraining opaque types during various unsizing casts.](rust-lang/rust#125610)
-   [Deny keyword lifetimes pre-expansion.](rust-lang/rust#126762)

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

## Compiler

-   [Make casts of pointers to trait objects stricter.](rust-lang/rust#120248)
-   [Check alias args for well-formedness even if they have escaping bound vars.](rust-lang/rust#123737)
-   [Deprecate no-op codegen option `-Cinline-threshold=...`.](rust-lang/rust#124712)
-   [Re-implement a type-size based limit.](rust-lang/rust#125507)
-   [Properly account for alignment in `transmute` size checks.](rust-lang/rust#125740)
-   [Remove the `box_pointers` lint.](rust-lang/rust#126018)
-   [Ensure the interpreter checks bool/char for validity when they are used in a cast.](rust-lang/rust#126265)
-   [Improve coverage instrumentation for functions containing nested items.](rust-lang/rust#127199)
-   Target changes:
    -   [Add Tier 3 `no_std` Xtensa targets:](rust-lang/rust#125141) `xtensa-esp32-none-elf`, `xtensa-esp32s2-none-elf`, `xtensa-esp32s3-none-elf`
    -   [Add Tier 3 `std` Xtensa targets:](rust-lang/rust#126380) `xtensa-esp32-espidf`, `xtensa-esp32s2-espidf`, `xtensa-esp32s3-espidf`
    -   [Add Tier 3 i686 Redox OS target:](rust-lang/rust#126192) `i686-unknown-redox`
    -   [Promote `arm64ec-pc-windows-msvc` to Tier 2.](rust-lang/rust#126039)
    -   [Promote `loongarch64-unknown-linux-musl` to Tier 2 with host tools.](rust-lang/rust#126298)
    -   [Enable full tools and profiler for LoongArch Linux targets.](rust-lang/rust#127078)
    -   [Unconditionally warn on usage of `wasm32-wasi`.](rust-lang/rust#126662) (see compatibility note below)
    -   Refer to Rust's \[platform support page]\[platform-support-doc] for more information on Rust's tiered platform support.

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

## Libraries

-   [Split core's `PanicInfo` and std's `PanicInfo`.](rust-lang/rust#115974) (see compatibility note below)
-   [Generalize `{Rc,Arc}::make_mut()` to unsized types.](rust-lang/rust#116113)
-   [Replace sort implementations with stable `driftsort` and unstable `ipnsort`.](rust-lang/rust#124032) All `slice::sort*` and `slice::select_nth*` methods are expected to see significant performance improvements. See the [research project](https://github.com/Voultapher/sort-research-rs) for more details.
-   [Document behavior of `create_dir_all` with respect to empty paths.](rust-lang/rust#125112)
-   [Fix interleaved output in the default panic hook when multiple threads panic simultaneously.](rust-lang/rust#127397)

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

## Stabilized APIs

-   [`core::error`](https://doc.rust-lang.org/stable/core/error/index.html)
-   [`hint::assert_unchecked`](https://doc.rust-lang.org/stable/core/hint/fn.assert_unchecked.html)
-   [`fs::exists`](https://doc.rust-lang.org/stable/std/fs/fn.exists.html)
-   [`AtomicBool::fetch_not`](https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicBool.html#method.fetch_not)
-   [`Duration::abs_diff`](https://doc.rust-lang.org/stable/core/time/struct.Duration.html#method.abs_diff)
-   [`IoSlice::advance`](https://doc.rust-lang.org/stable/std/io/struct.IoSlice.html#method.advance)
-   [`IoSlice::advance_slices`](https://doc.rust-lang.org/stable/std/io/struct.IoSlice.html#method.advance_slices)
-   [`IoSliceMut::advance`](https://doc.rust-lang.org/stable/std/io/struct.IoSliceMut.html#method.advance)
-   [`IoSliceMut::advance_slices`](https://doc.rust-lang.org/stable/std/io/struct.IoSliceMut.html#method.advance_slices)
-   [`PanicHookInfo`](https://doc.rust-lang.org/stable/std/panic/struct.PanicHookInfo.html)
-   [`PanicInfo::message`](https://doc.rust-lang.org/stable/core/panic/struct.PanicInfo.html#method.message)
-   [`PanicMessage`](https://doc.rust-lang.org/stable/core/panic/struct.PanicMessage.html)

These APIs are now stable in const contexts:

-   [`char::from_u32_unchecked`](https://doc.rust-lang.org/stable/core/char/fn.from_u32\_unchecked.html) (function)
-   [`char::from_u32_unchecked`](https://doc.rust-lang.org/stable/core/primitive.char.html#method.from_u32\_unchecked) (method)
-   [`CStr::count_bytes`](https://doc.rust-lang.org/stable/core/ffi/c_str/struct.CStr.html#method.count_bytes)
-   [`CStr::from_ptr`](https://doc.rust-lang.org/stable/core/ffi/c_str/struct.CStr.html#method.from_ptr)

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

## Cargo

-   [Generated `.cargo_vcs_info.json` is always included, even when `--allow-dirty` is passed.](rust-lang/cargo#13960)
-   [Disallow `package.license-file` and `package.readme` pointing to non-existent files during packaging.](rust-lang/cargo#13921)
-   [Disallow passing `--release`/`--debug` flag along with the `--profile` flag.](rust-lang/cargo#13971)
-   [Remove `lib.plugin` key support in `Cargo.toml`. Rust plugin support has been deprecated for four years and was removed in 1.75.0.](rust-lang/cargo#13902)

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

## Compatibility Notes

-   Usage of the `wasm32-wasi` target will now issue a compiler warning and request users switch to the `wasm32-wasip1` target instead. Both targets are the same, `wasm32-wasi` is only being renamed, and this [change to the WASI target](https://blog.rust-lang.org/2024/04/09/updates-to-rusts-wasi-targets.html) is being done to enable removing `wasm32-wasi` in January 2025.

-   We have renamed `std::panic::PanicInfo` to `std::panic::PanicHookInfo`. The old name will continue to work as an alias, but will result in a deprecation warning starting in Rust 1.82.0.

    `core::panic::PanicInfo` will remain unchanged, however, as this is now a *different type*.

    The reason is that these types have different roles: `std::panic::PanicHookInfo` is the argument to the [panic hook](https://doc.rust-lang.org/stable/std/panic/fn.set_hook.html) in std context (where panics can have an arbitrary payload), while `core::panic::PanicInfo` is the argument to the [`#[panic_handler]`](https://doc.rust-lang.org/nomicon/panic-handler.html) in no_std context (where panics always carry a formatted *message*). Separating these types allows us to add more useful methods to these types, such as `std::panic::PanicHookInfo::payload_as_str()` and `core::panic::PanicInfo::message()`.

-   The new sort implementations may panic if a type's implementation of [`Ord`](https://doc.rust-lang.org/std/cmp/trait.Ord.html) (or the given comparison function) does not implement a [total order](https://en.wikipedia.org/wiki/Total_order) as the trait requires. `Ord`'s supertraits (`PartialOrd`, `Eq`, and `PartialEq`) must also be consistent. The previous implementations would not "notice" any problem, but the new implementations have a good chance of detecting inconsistencies, throwing a panic rather than returning knowingly unsorted data.

-   [In very rare cases, a change in the internal evaluation order of the trait
    solver may result in new fatal overflow errors.](rust-lang/rust#126128)

<a id="1.81.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.

-   [Add a Rust-for Linux `auto` CI job to check kernel builds.](rust-lang/rust#125209)

</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:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
wip-sync pushed a commit to NetBSD/pkgsrc-wip that referenced this pull request Sep 22, 2024
Pkgsrc changes:
 * Adapt patches, apply to new vendored crates where needed.
 * Back-port rust pull request 130110, "make dist vendoring configurable"
 * Disable "dist vendoring", otherwise cargo would try to access
   the network during the build phase.

Upstream changes:

Version 1.81.0 (2024-09-05)
==========================

Language
--------

- [Abort on uncaught panics in `extern "C"` functions.]
  (rust-lang/rust#116088)
- [Fix ambiguous cases of multiple `&` in elided self lifetimes.]
  (rust-lang/rust#117967)
- [Stabilize `#[expect]` for lints (RFC 2383),]
  (rust-lang/rust#120924) like `#[allow]`
  with a warning if the lint is _not_ fulfilled.
- [Change method resolution to constrain hidden types instead of
  rejecting method candidates.]
  (rust-lang/rust#123962)
- [Bump `elided_lifetimes_in_associated_constant` to deny.]
  (rust-lang/rust#124211)
- [`offset_from`: always allow pointers to point to the same
  address.] (rust-lang/rust#124921)
- [Allow constraining opaque types during subtyping in the trait
  system.] (rust-lang/rust#125447)
- [Allow constraining opaque types during various unsizing casts.]
  (rust-lang/rust#125610)
- [Deny keyword lifetimes pre-expansion.]
  (rust-lang/rust#126762)

Compiler
--------

- [Make casts of pointers to trait objects stricter.]
  (rust-lang/rust#120248)
- [Check alias args for well-formedness even if they have escaping
  bound vars.] (rust-lang/rust#123737)
- [Deprecate no-op codegen option `-Cinline-threshold=...`.]
  (rust-lang/rust#124712)
- [Re-implement a type-size based limit.]
  (rust-lang/rust#125507)
- [Properly account for alignment in `transmute` size checks.]
  (rust-lang/rust#125740)
- [Remove the `box_pointers` lint.]
  (rust-lang/rust#126018)
- [Ensure the interpreter checks bool/char for validity when they
  are used in a cast.] (rust-lang/rust#126265)
- [Improve coverage instrumentation for functions containing nested
  items.] (rust-lang/rust#127199)
- Target changes:
  - [Add Tier 3 `no_std` Xtensa targets:]
    (rust-lang/rust#125141) `xtensa-esp32-none-elf`,
    `xtensa-esp32s2-none-elf`, `xtensa-esp32s3-none-elf`
  - [Add Tier 3 `std` Xtensa targets:]
    (rust-lang/rust#126380) `xtensa-esp32-espidf`,
    `xtensa-esp32s2-espidf`, `xtensa-esp32s3-espidf`
  - [Add Tier 3 i686 Redox OS target:]
    (rust-lang/rust#126192) `i686-unknown-redox`
  - [Promote `arm64ec-pc-windows-msvc` to Tier 2.]
    (rust-lang/rust#126039)
  - [Promote `wasm32-wasip2` to Tier 2.]
    (rust-lang/rust#126967)
  - [Promote `loongarch64-unknown-linux-musl` to Tier 2 with host
    tools.] (rust-lang/rust#126298)
  - [Enable full tools and profiler for LoongArch Linux targets.]
    (rust-lang/rust#127078)
  - [Unconditionally warn on usage of `wasm32-wasi`.]
    (rust-lang/rust#126662) (see compatibility
    note below)
  - Refer to Rust's [platform support page][platform-support-doc]
    for more information on Rust's tiered platform support.

Libraries
---------

- [Split core's `PanicInfo` and std's `PanicInfo`.]
  (rust-lang/rust#115974) (see compatibility
  note below)
- [Generalize `{Rc,Arc}::make_mut()` to unsized types.]
  (rust-lang/rust#116113)
- [Replace sort implementations with stable `driftsort` and unstable
  `ipnsort`.] (rust-lang/rust#124032) All
  `slice::sort*` and `slice::select_nth*` methods are expected to
  see significant performance improvements. See the [research
  project] (https://github.com/Voultapher/sort-research-rs) for
  more details.
- [Document behavior of `create_dir_all` with respect to empty
  paths.] (rust-lang/rust#125112)
- [Fix interleaved output in the default panic hook when multiple
  threads panic simultaneously.]
  (rust-lang/rust#127397)
- Fix `Command`'s batch files argument escaping not working when
  file name has trailing whitespace or periods (CVE-2024-43402).

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

- [`core::error`] (https://doc.rust-lang.org/stable/core/error/index.html)
- [`hint::assert_unchecked`]
  (https://doc.rust-lang.org/stable/core/hint/fn.assert_unchecked.html)
- [`fs::exists`] (https://doc.rust-lang.org/stable/std/fs/fn.exists.html)
- [`AtomicBool::fetch_not`]
  (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicBool.html#method.fetch_not)
- [`Duration::abs_diff`]
  (https://doc.rust-lang.org/stable/core/time/struct.Duration.html#method.abs_diff)
- [`IoSlice::advance`]
  (https://doc.rust-lang.org/stable/std/io/struct.IoSlice.html#method.advance)
- [`IoSlice::advance_slices`]
  (https://doc.rust-lang.org/stable/std/io/struct.IoSlice.html#method.advance_slices)
- [`IoSliceMut::advance`]
  (https://doc.rust-lang.org/stable/std/io/struct.IoSliceMut.html#method.advance)
- [`IoSliceMut::advance_slices`]
  (https://doc.rust-lang.org/stable/std/io/struct.IoSliceMut.html#method.advance_slices)
- [`PanicHookInfo`]
  (https://doc.rust-lang.org/stable/std/panic/struct.PanicHookInfo.html)
- [`PanicInfo::message`]
  (https://doc.rust-lang.org/stable/core/panic/struct.PanicInfo.html#method.message)
- [`PanicMessage`]
  (https://doc.rust-lang.org/stable/core/panic/struct.PanicMessage.html)

These APIs are now stable in const contexts:

- [`char::from_u32_unchecked`]
  (https://doc.rust-lang.org/stable/core/char/fn.from_u32_unchecked.html)
  (function)
- [`char::from_u32_unchecked`]
  (https://doc.rust-lang.org/stable/core/primitive.char.html#method.from_u32_unchecked)
  (method)
- [`CStr::count_bytes`]
  (https://doc.rust-lang.org/stable/core/ffi/c_str/struct.CStr.html#method.count_bytes)
- [`CStr::from_ptr`]
  (https://doc.rust-lang.org/stable/core/ffi/c_str/struct.CStr.html#method.from_ptr)

Cargo
-----

- [Generated `.cargo_vcs_info.json` is always included, even when
  `--allow-dirty` is passed.]
  (rust-lang/cargo#13960)
- [Disallow `package.license-file` and `package.readme` pointing
  to non-existent files during packaging.]
  (rust-lang/cargo#13921)
- [Disallow passing `--release`/`--debug` flag along with the
  `--profile` flag.] (rust-lang/cargo#13971)
- [Remove `lib.plugin` key support in `Cargo.toml`. Rust plugin
  support has been deprecated for four years and was removed in
  1.75.0.] (rust-lang/cargo#13902)

Compatibility Notes
-------------------

* Usage of the `wasm32-wasi` target will now issue a compiler
  warning and request users switch to the `wasm32-wasip1` target
  instead. Both targets are the same, `wasm32-wasi` is only being
  renamed, and this [change to the WASI target]
  (https://blog.rust-lang.org/2024/04/09/updates-to-rusts-wasi-targets.html)
  is being done to enable removing `wasm32-wasi` in January 2025.

* We have renamed `std::panic::PanicInfo` to `std::panic::PanicHookInfo`.
  The old name will continue to work as an alias, but will result in
  a deprecation warning starting in Rust 1.82.0.

  `core::panic::PanicInfo` will remain unchanged, however, as this
  is now a *different type*.

  The reason is that these types have different roles:
  `std::panic::PanicHookInfo` is the argument to the [panic
  hook](https://doc.rust-lang.org/stable/std/panic/fn.set_hook.html)
  in std context (where panics can have an arbitrary payload),
  while `core::panic::PanicInfo` is the argument to the
  [`#[panic_handler]`](https://doc.rust-lang.org/nomicon/panic-handler.html)
  in no_std context (where panics always carry a formatted *message*).
  Separating these types allows us to add more useful methods to
  these types, such as `std::panic::PanicHookInfo::payload_as_str()`
  and `core::panic::PanicInfo::message()`.

* The new sort implementations may panic if a type's implementation
  of [`Ord`](https://doc.rust-lang.org/std/cmp/trait.Ord.html) (or
  the given comparison function) does not implement a [total
  order](https://en.wikipedia.org/wiki/Total_order) as the trait
  requires. `Ord`'s supertraits (`PartialOrd`, `Eq`, and `PartialEq`)
  must also be consistent. The previous implementations would not
  "notice" any problem, but the new implementations have a good chance
  of detecting inconsistencies, throwing a panic rather than returning
  knowingly unsorted data.
* [In very rare cases, a change in the internal evaluation order of the trait
  solver may result in new fatal overflow errors.]
  (rust-lang/rust#126128)

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.

- [Add a Rust-for Linux `auto` CI job to check kernel builds.]
  (rust-lang/rust#125209)
vdhanan added a commit to CommE2E/comm that referenced this pull request Nov 7, 2024
Summary: Rust 1.81 introduced new [lifetime rules](rust-lang/rust#117967), which opaque-ke, a crate we depend on, violated. The maintainers of that crate have introduced a new version that satisifies these new rules, and we have upgraded to this version in D13895. Now that we've upgraded the dependency, we should bump Rust to the latest stable version.

Depends on D13895

Test Plan: All crates build locally and in Docker (CI)

Reviewers: will, bartek

Subscribers:
vdhanan added a commit to CommE2E/comm that referenced this pull request Nov 7, 2024
Summary:
Rust 1.81 introduced new [lifetime rules](rust-lang/rust#117967), which opaque-ke, a crate we depend on, violated. The maintainers of that crate have introduced a new version that satisifies these new rules, and we have upgraded to this version in D13895. Now that we've upgraded the dependency, we should bump Rust to the latest stable version.

Depends on D13895

Test Plan: All crates build locally and in Docker (CI)

Reviewers: will, bartek

Subscribers: ashoat, tomek

Differential Revision: https://phab.comm.dev/D13896
vdhanan added a commit to CommE2E/comm that referenced this pull request Nov 7, 2024
Summary:
Rust 1.81 introduced new [lifetime rules](rust-lang/rust#117967), which opaque-ke, a crate we depend on, violated. The maintainers of that crate have introduced a new version that satisifies these new rules, and we have upgraded to this version in D13895. Now that we've upgraded the dependency, we should bump Rust to the latest stable version.

EDIT: we can't upgrade to 1.82, the latest stable version, because of an issue with `wasm-bindgen`: https://linear.app/comm/issue/ENG-9892/cant-upgrade-to-rust-182

Depends on D13895

Test Plan: All crates build locally and in Docker (CI)

Reviewers: will, bartek

Subscribers: ashoat, tomek

Differential Revision: https://phab.comm.dev/D13896
vdhanan added a commit to CommE2E/comm that referenced this pull request Nov 8, 2024
Summary:
Rust 1.81 introduced new [lifetime rules](rust-lang/rust#117967), which opaque-ke, a crate we depend on, violated. The maintainers of that crate have introduced a new version that satisifies these new rules, and we have upgraded to this version in D13895. Now that we've upgraded the dependency, we should bump Rust to the latest stable version.

EDIT: we can't upgrade to 1.82, the latest stable version, because of an issue with `wasm-bindgen`: https://linear.app/comm/issue/ENG-9892/cant-upgrade-to-rust-182

Depends on D13895

Test Plan: All crates build locally and in Docker (CI)

Reviewers: will, bartek

Subscribers: ashoat, tomek

Differential Revision: https://phab.comm.dev/D13896
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. merged-by-bors This PR was explicitly merged by bors. needs-fcp This change is insta-stable, so needs a completed FCP to proceed. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-lang Relevant to the language team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

self: &Box<Self> produces confusing error due to failure to spot elided lifetime