Skip to content

Commit d2e10d5

Browse files
borsehuss
authored andcommitted
Auto merge of rust-lang#88979 - tmiasko:no-remove-zsts-in-generators, r=oli-obk
Disable RemoveZsts in generators to avoid query cycles Querying layout of a generator requires its optimized MIR. Thus computing layout during MIR optimization of a generator might create a query cycle. Disable RemoveZsts in generators to avoid the issue (similar approach is used in ConstProp transform already). Fixes rust-lang#88972.
1 parent c0f9379 commit d2e10d5

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

Diff for: compiler/rustc_mir/src/transform/remove_zsts.rs

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ pub struct RemoveZsts;
99

1010
impl<'tcx> MirPass<'tcx> for RemoveZsts {
1111
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
12+
// Avoid query cycles (generators require optimized MIR for layout).
13+
if tcx.type_of(body.source.def_id()).is_generator() {
14+
return;
15+
}
1216
let param_env = tcx.param_env(body.source.def_id());
1317
let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut();
1418
for block in basic_blocks.iter_mut() {

Diff for: src/test/ui/mir/remove-zsts-query-cycle.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Regression test for #88972. Used to cause a query cycle:
2+
// optimized mir -> remove zsts -> layout of a generator -> optimized mir.
3+
//
4+
// edition:2018
5+
// compile-flags: --crate-type=lib
6+
// build-pass
7+
8+
pub async fn listen() -> Result<(), std::io::Error> {
9+
let f = do_async();
10+
std::mem::forget(f);
11+
Ok(())
12+
}
13+
14+
pub async fn do_async() {
15+
listen().await.unwrap()
16+
}

0 commit comments

Comments
 (0)