-
Notifications
You must be signed in to change notification settings - Fork 13k
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
Stop making any assumption about the projections applied to the upvars in the ByMoveBody
pass
#123658
Conversation
Some changes occurred to MIR optimizations cc @rust-lang/wg-mir-opt |
@@ -302,20 +302,18 @@ impl<'tcx> MutVisitor<'tcx> for MakeByMoveBody<'tcx> { | |||
projection | |||
}; | |||
|
|||
// The only thing that should be left is a deref, if the parent captured | |||
// an upvar by-ref. | |||
std::assert_matches::assert_matches!(final_deref, [] | [mir::ProjectionElem::Deref]); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This assertion only makes sense when we assume that captures are going to be as precise as they can be. This is not true when we truncate captures when they don't give us anything (truncate_capture_for_optimization
), and also I'm pretty sure that edition 2018 doesn't even work like that at all.
ByMoveBody
passByMoveBody
pass
@bors r+ rollup |
…llaumeGomez Rollup of 8 pull requests Successful merges: - rust-lang#123254 (Do not allocate for ZST ThinBox (attempt 2 using const_allocate)) - rust-lang#123626 (Add MC/DC support to coverage test tools) - rust-lang#123638 (rustdoc: synthetic auto: filter out clauses from the implementor's ParamEnv) - rust-lang#123653 (Split `non_local_definitions` lint tests in separate test files) - rust-lang#123658 (Stop making any assumption about the projections applied to the upvars in the `ByMoveBody` pass) - rust-lang#123662 (Don't rely on upvars being assigned just because coroutine-closure kind is assigned) - rust-lang#123665 (Fix typo in `Future::poll()` docs) - rust-lang#123672 (compiletest: unset `RUSTC_LOG_COLOR`) r? `@ghost` `@rustbot` modify labels: rollup
Rollup merge of rust-lang#123658 - compiler-errors:stop-assuming, r=oli-obk Stop making any assumption about the projections applied to the upvars in the `ByMoveBody` pass So it turns out that because of subtle optimizations like [`truncate_capture_for_optimization`](https://github.com/rust-lang/rust/blob/ab5bda1aa70f707014e2e691e43bc37a8819252a/compiler/rustc_hir_typeck/src/upvar.rs#L2351), we simply cannot make any assumptions about the shape of the projections applied to the upvar locals in a coroutine body. So stop doing that -- the code is resilient to such projections, so the assertion really existed only to "protect against the unknown". r? oli-obk Fixes rust-lang#123650
So it turns out that because of subtle optimizations like
truncate_capture_for_optimization
, we simply cannot make any assumptions about the shape of the projections applied to the upvar locals in a coroutine body.So stop doing that -- the code is resilient to such projections, so the assertion really existed only to "protect against the unknown".
r? oli-obk
Fixes #123650