rust/src
bors eda41addfc Auto merge of #104134 - dtolnay:panictemporaries, r=joshtriplett
Shorten lifetime of panic temporaries in panic_fmt case

This fixes an issue called out by `@fasterthanlime` in https://octodon.social/`@fasterthanlime/109304454114856561.` Macros like `todo!("…")` and `panic!("…", …)` drop their `format_args` temporary at the nearest enclosing semicolon **outside** the macro invocation, not inside the macro invocation. Due to the formatting internals being type-erased in a way that is not thread-safe, this blocks futures from being `Send` if there is an `await` anywhere between the panic call and the nearest enclosing semicolon.

**Example:**

```rust
#![allow(unreachable_code)]

async fn f(_: u8) {}

async fn g() {
    f(todo!("...")).await;
}

fn require_send(_: impl Send) {}

fn main() {
    require_send(g());
}
```

**Before:**

```console
error: future cannot be sent between threads safely
  --> src/main.rs:15:18
   |
15 |     require_send(g());
   |                  ^^^ future returned by `g` is not `Send`
   |
   = help: the trait `Sync` is not implemented for `core::fmt::Opaque`
note: future is not `Send` as this value is used across an await
  --> src/main.rs:9:20
   |
9  |     f(todo!("...")).await;
   |       ------------ ^^^^^^ await occurs here, with `$crate::format_args!($($arg)+)` maybe used later
   |       |
   |       has type `ArgumentV1<'_>` which is not `Send`
note: `$crate::format_args!($($arg)+)` is later dropped here
  --> src/main.rs:9:26
   |
9  |     f(todo!("...")).await;
   |                          ^
note: required by a bound in `require_send`
  --> src/main.rs:12:25
   |
12 | fn require_send(_: impl Send) {}
   |                         ^^^^ required by this bound in `require_send`
```

**After:** works.

Arguably there is a rustc fix that could work here too, instead of a standard library change. Rustc could be taught that the code shown above is fine to compile because the `await` is unreachable and so temporaries before the `await` do not need to get put in the anonymous compiler-generated `Future` struct, regardless of syntactically where they're supposed to be dropped according to the language semantics.

I would be open to that, though my recollection is that in the past we have been very hesitant about introducing any smarts into Drop placement. People want the language rules about where temporaries are dropped to be as simplistic and predictable as possible.
2023-05-14 16:16:24 +00:00
..
bootstrap Auto merge of #111388 - clubby789:clap-complete, r=jyn514 2023-05-14 00:09:05 +00:00
ci Update browser-ui-test version to 0.16.3 2023-05-14 00:16:00 +02:00
doc Rollup merge of #111389 - esp-rs:esp-idf-platform-support, r=jyn514 2023-05-11 07:05:28 +02:00
etc Generate shell completions for bootstrap with Clap 2023-05-10 21:41:38 +01:00
librustdoc Auto merge of #107586 - SparrowLii:parallel-query, r=cjgillot 2023-05-13 13:47:53 +00:00
llvm-project@ea6fa9c2d4 Update to LLVM 16.0.2 2023-04-19 12:33:37 +02:00
rustdoc-json-types IAT: Rustdoc integration 2023-05-04 16:59:11 +02:00
tools Auto merge of #104134 - dtolnay:panictemporaries, r=joshtriplett 2023-05-14 16:16:24 +00:00
README.md Remove stale reference to the test suite location 2023-01-13 11:49:06 +00:00
stage0.json bump stage0 2023-04-28 08:47:55 -07:00
version bump to rust 1.71.0 2023-04-15 12:29:51 +02:00

This directory contains some source code for the Rust project, including:

  • The bootstrapping build system
  • Various submodules for tools, like cargo, tidy, etc.

For more information on how various parts of the compiler work, see the rustc dev guide.