diff options
| author | bors <bors@rust-lang.org> | 2024-08-10 21:24:25 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-08-10 21:24:25 +0000 |
| commit | 730d5d4095a264ef5f7c0a0781eea68c15431d45 (patch) | |
| tree | 92411275dbc66551b4e6f92854b901c6f2acdc3b /compiler/rustc_pattern_analysis/src | |
| parent | 04dff01740de7477013ef810e2639ab70042412a (diff) | |
| parent | 2e52d6180724ee0cbd8b47bc7806a53bf13ab240 (diff) | |
| download | rust-730d5d4095a264ef5f7c0a0781eea68c15431d45.tar.gz rust-730d5d4095a264ef5f7c0a0781eea68c15431d45.zip | |
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.
Diffstat (limited to 'compiler/rustc_pattern_analysis/src')
0 files changed, 0 insertions, 0 deletions
