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).
This commit is contained in:
parent
2c7bc5e33c
commit
c39d7599a3
2 changed files with 20 additions and 0 deletions
|
@ -9,6 +9,10 @@ pub struct RemoveZsts;
|
||||||
|
|
||||||
impl<'tcx> MirPass<'tcx> for RemoveZsts {
|
impl<'tcx> MirPass<'tcx> for RemoveZsts {
|
||||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
|
// Avoid query cycles (generators require optimized MIR for layout).
|
||||||
|
if tcx.type_of(body.source.def_id()).is_generator() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
let param_env = tcx.param_env(body.source.def_id());
|
let param_env = tcx.param_env(body.source.def_id());
|
||||||
let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut();
|
let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut();
|
||||||
for block in basic_blocks.iter_mut() {
|
for block in basic_blocks.iter_mut() {
|
||||||
|
|
16
src/test/ui/mir/remove-zsts-query-cycle.rs
Normal file
16
src/test/ui/mir/remove-zsts-query-cycle.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
// Regression test for #88972. Used to cause a query cycle:
|
||||||
|
// optimized mir -> remove zsts -> layout of a generator -> optimized mir.
|
||||||
|
//
|
||||||
|
// edition:2018
|
||||||
|
// compile-flags: --crate-type=lib
|
||||||
|
// build-pass
|
||||||
|
|
||||||
|
pub async fn listen() -> Result<(), std::io::Error> {
|
||||||
|
let f = do_async();
|
||||||
|
std::mem::forget(f);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn do_async() {
|
||||||
|
listen().await.unwrap()
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue