Commit graph

54 commits

Author SHA1 Message Date
bors
730d5d4095 Auto merge of #128572 - compiler-errors:fix-elaborate-box-derefs-on-debug, r=saethlin
Fix `ElaborateBoxDerefs` on debug varinfo

Slightly simplifies the `ElaborateBoxDerefs` pass to fix cases where it was applying the wrong projections to debug var infos containing places that deref boxes.

From what I can tell[^1], we don't actually have any tests (or code anywhere, really) that exercise `debug x => *(...: Box<T>)`, and it's very difficult to trigger this in surface Rust, so I wrote a custom MIR test.

What happens is that the pass was turning `*(SOME_PLACE: Box<T>)` into `*(*((((SOME_PLACE).0: Unique<T>).0: NonNull<T>).0: *const T))` in debug var infos. In particular, notice the *double deref*, which was wrong.

This is the root cause of #128554, so this PR fixes #128554 as well. The reason that async closures was affected is because of the way that we compute the [`ByMove` body](https://github.com/rust-lang/rust/blob/master/compiler/rustc_mir_transform/src/coroutine/by_move_body.rs), which resulted in `*(...: Box<T>)` in debug var info. But this really has nothing to do with async closures.

[^1]: Validated by literally replacing the `if elem == PlaceElem::Deref && base_ty.is_box() { ... }` innards with a `panic!()`, which compiled all of stage2 without panicking.
2024-08-10 21:24:25 +00:00
Matthias Krüger
bcf6f9fa76
Rollup merge of #128791 - compiler-errors:async-fn-unsafe, r=lcnr
Don't implement `AsyncFn` for `FnDef`/`FnPtr` that wouldnt implement `Fn`

Due to unsafety, ABI, or the presence of target features, some `FnDef`/`FnPtr` types don't implement `Fn*`. Do the same for `AsyncFn*`.

Noticed this due to #128764, but this isn't really related to that ICE, which is fixed in #128792.
2024-08-09 00:03:36 +02:00
Michael Goulet
ec1c424293 Don't implement AsyncFn for FnDef/FnPtr that wouldnt implement Fn 2024-08-08 14:07:31 -04:00
Michael Goulet
2e52d61807 Stop doing weird index stuff in ElaborateBoxDerefs 2024-08-02 17:45:55 -04:00
Michael Goulet
5138586678 Skip over args when determining if coroutine-closure's inner coroutine consumes its upvars 2024-08-01 18:46:26 -04:00
Michael Goulet
5a9959fd9d Suppress useless clone suggestion 2024-07-26 12:53:55 -04:00
Michael Goulet
d5656059a1 Make coroutine-closures possible to be cloned 2024-07-26 12:53:53 -04:00
bors
9b0043095a Auto merge of #127097 - compiler-errors:async-closure-lint, r=oli-obk
Implement simple, unstable lint to suggest turning closure-of-async-block into async-closure

We want to eventually suggest people to turn `|| async {}` to `async || {}`. This begins doing that. It's a pretty rudimentary lint, but I wanted to get something down so I wouldn't lose the code.

Tracking:
* #62290
2024-07-11 06:59:10 +00:00
Michael Goulet
f4f678f27e Infer async closure signature from old-style two-part Fn + Future bounds 2024-07-08 12:56:54 -04:00
Michael Goulet
294436d273 Make all tests in async dir build-pass, adjust implements-fnmut test to begin ICEing during codegen 2024-06-29 17:38:02 -04:00
Michael Goulet
acc13e29d1 Make it into a structured suggestion, maybe-incorrect 2024-06-28 20:16:35 -04:00
Michael Goulet
789ee88bd0 Tighten spans for async blocks 2024-06-27 15:19:08 -04:00
Lin Yihai
05b7b46e65 fix: break inside async closure has incorrect span for enclosing closure 2024-06-05 19:22:50 +08:00
bors
9cdfe285ca Auto merge of #125423 - fmease:rollup-ne4l9y4, r=fmease
Rollup of 7 pull requests

Successful merges:

 - #125043 (reference type safety invariant docs: clarification)
 - #125306 (Force the inner coroutine of an async closure to `move` if the outer closure is `move` and `FnOnce`)
 - #125355 (Use Backtrace::force_capture instead of Backtrace::capture in rustc_log)
 - #125382 (rustdoc: rename `issue-\d+.rs` tests to have meaningful names (part 7))
 - #125391 (Minor serialize/span tweaks)
 - #125395 (Remove unnecessary `.md` from the documentation sidebar)
 - #125399 (Stop using `to_hir_binop` in codegen)

r? `@ghost`
`@rustbot` modify labels: rollup
2024-05-22 21:51:26 +00:00
Michael Goulet
6b3058204a Force the inner coroutine of an async closure to move if the outer closure is move and FnOnce 2024-05-19 23:46:52 -04:00
Michael Goulet
2e97dae8d4 An async closure may implement FnMut/Fn if it has no self-borrows 2024-05-18 12:47:59 -04:00
Michael Goulet
c697ec41f4 Propagate errors rather than using return_if_err 2024-05-12 12:50:18 -04:00
Michael Goulet
49e73c3e01 Don't do coroutine-closure-specific upvar analysis if tainted by errors 2024-04-12 12:14:29 -04:00
Michael Goulet
599d456a75 Make the computation of coroutine_captures_by_ref_ty more sophisticated 2024-04-10 13:39:53 -04:00
Michael Goulet
69b690f0f6 Only assert for child/parent projection compatibility AFTER checking that theyre coming from the same place 2024-04-10 10:13:24 -04:00
Guillaume Gomez
e5b2935dc1
Rollup merge of #123662 - compiler-errors:no-upvars-yet, r=oli-obk
Don't rely on upvars being assigned just because coroutine-closure kind is assigned

Previously, code relied on the implicit assumption that if a coroutine-closure's kind variable was constrained, then its upvars were also constrained. This is because we assign all of them at once at the end up upvar analysis.

However, there's another way that a coroutine-closure's kind can be constrained: from a signature hint in closure signature deduction. After #123350, we use these hints, which means the implicit assumption above no longer holds.

This PR adds the necessary checks so that we don't ICE.

r? oli-obk
2024-04-09 13:39:23 +02:00
Michael Goulet
6f96d7d012 Don't rely on upvars being assigned just because coroutine-closure kind is assigned 2024-04-08 22:43:32 -04:00
Michael Goulet
54a93ab11e Actually, stop making any assumption about the projections applied to the upvar 2024-04-08 19:47:52 -04:00
Michael Goulet
ad0fcac72b Account for an additional reborrow inserted by UniqueImmBorrow and MutBorrow 2024-04-05 17:35:03 -04:00
Michael Goulet
49c4ebcc40 Check the base of the place too! 2024-04-05 16:48:45 -04:00
Michael Goulet
3674032eb2 Rework the ByMoveBody shim to actually work correctly 2024-04-05 15:28:13 -04:00
Michael Goulet
55e46612c1 Force move async-closures that are FnOnce to make their inner coroutines also move 2024-04-04 19:44:51 -04:00
Michael Goulet
3d9d5d7c96 Actually use the inferred ClosureKind from signature inference in coroutine-closures 2024-04-04 19:44:35 -04:00
Michael Goulet
ec74a304bb Comments, comments, comments 2024-04-02 20:07:49 -04:00
Michael Goulet
a1a1f41027 Fix capture analysis for by-move closure bodies 2024-04-02 20:07:48 -04:00
Michael Goulet
05116c5c30 Only split by-ref/by-move futures for async closures 2024-03-19 16:59:23 -04:00
Michael Goulet
383051092f Ignore tests w/ current/next revisions from compare-mode=next-solver 2024-03-10 21:18:41 -04:00
Michael Goulet
d74d67c836 Implement async closure signature deduction 2024-03-01 16:03:57 +00:00
Michael Goulet
c8e3f35eb6 Flesh out a few more tests 2024-02-27 17:39:20 +00:00
Michael Goulet
a6727bad88 Support {async closure}: Fn in new solver 2024-02-27 17:21:39 +00:00
Michael Goulet
ff07f55db5 Actually use the right closure kind when checking async Fn goals 2024-02-26 01:36:14 +00:00
许杰友 Jieyou Xu (Joe)
ec2cc761bc
[AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
Michael Goulet
acb201af54 make better async fn kind errors 2024-02-15 15:59:35 +00:00
Matthias Krüger
aeafbbeded
Rollup merge of #120897 - compiler-errors:foreign-async-closure, r=oli-obk
Encode `coroutine_for_closure` for foreign crates

Async closures (and "coroutine closures" in general) need to have their child coroutine encoded. This PR does that.

r? oli-obk
2024-02-11 23:19:10 +01:00
Michael Goulet
86ddb53cab Print kind of coroutine closure 2024-02-10 23:18:01 +00:00
Michael Goulet
c210fec3cb Encode coroutine_for_closure for foreign crates 2024-02-10 22:58:26 +00:00
bors
757b8efed4 Auto merge of #120712 - compiler-errors:async-closures-harmonize, r=oli-obk
Harmonize `AsyncFn` implementations, make async closures conditionally impl `Fn*` traits

This PR implements several changes to the built-in and libcore-provided implementations of `Fn*` and `AsyncFn*` to address two problems:
1. async closures do not implement the `Fn*` family traits, leading to breakage: https://crater-reports.s3.amazonaws.com/pr-120361/index.html
2. *references* to async closures do not implement `AsyncFn*`, as a consequence of the existing blanket impls of the shape `AsyncFn for F where F: Fn, F::Output: Future`.

In order to fix (1.), we implement `Fn` traits appropriately for async closures. It turns out that async closures can:
* always implement `FnOnce`, meaning that they're drop-in compatible with `FnOnce`-bound combinators like `Option::map`.
* conditionally implement `Fn`/`FnMut` if they have no captures, which means that existing usages of async closures should *probably* work without breakage (crater checking this: https://github.com/rust-lang/rust/pull/120712#issuecomment-1930587805).

In order to fix (2.), we make all of the built-in callables implement `AsyncFn*` via built-in impls, and instead adjust the blanket impls for `AsyncFn*` provided by libcore to match the blanket impls for `Fn*`.
2024-02-10 07:15:15 +00:00
Matthias Krüger
aa0b0b65b3
Rollup merge of #120844 - compiler-errors:async-di, r=oli-obk
Build DebugInfo for async closures

The test is pretty bare, because I don't really know how to write debuginfo tests. I'd like to land this first, and then flesh it out correctly one it's no longer ICEing on master (which breaks people's ability to test using async closures).

r? oli-obk cc `@rust-lang/wg-debugging` (if any of y'all want to help me write a more fleshed out async closures test)
2024-02-09 19:21:19 +01:00
Michael Goulet
34ed554d81 Build DebugInfo for coroutine-closure 2024-02-09 16:01:29 +00:00
Michael Goulet
698a3c7ade Don't ICE in ByMoveBody when coroutine is tainted 2024-02-09 00:36:30 +00:00
Michael Goulet
9322882ade Add a couple more tests 2024-02-08 15:46:07 +00:00
Michael Goulet
3bb384aad6 Prefer AsyncFn* over Fn* for coroutine-closures 2024-02-08 15:46:00 +00:00
Michael Goulet
f1308783b4 Make async closures test use async bound modifier 2024-02-06 17:41:48 +00:00
Michael Goulet
ed7fca1f88 Fudge coroutine argument for CoroutineKindShim in fn_sig_for_fn_abi 2024-02-06 02:53:06 +00:00
Michael Goulet
ca44416023 Fix drop shim for AsyncFnOnce closure, AsyncFnMut shim for AsyncFn closure 2024-02-06 02:22:58 +00:00