Skip to content

Commit

Permalink
Do not call query to compute coroutine layout for synthetic body of a…
Browse files Browse the repository at this point in the history
…sync closure
  • Loading branch information
compiler-errors committed Sep 1, 2024
1 parent 78d5c04 commit d1abd41
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
13 changes: 12 additions & 1 deletion compiler/rustc_mir_transform/src/validate.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
//! Validates the MIR to ensure that invariants are upheld.
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_hir as hir;
use rustc_hir::LangItem;
use rustc_index::bit_set::BitSet;
use rustc_index::IndexVec;
Expand Down Expand Up @@ -714,7 +715,17 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
// since we may be in the process of computing this MIR in the
// first place.
let layout = if def_id == self.caller_body.source.def_id() {
// FIXME: This is not right for async closures.
self.caller_body.coroutine_layout_raw()
} else if let Some(hir::CoroutineKind::Desugared(
_,
hir::CoroutineSource::Closure,
)) = self.tcx.coroutine_kind(def_id)
&& let ty::ClosureKind::FnOnce =
args.as_coroutine().kind_ty().to_opt_closure_kind().unwrap()
&& self.caller_body.source.def_id()
== self.tcx.coroutine_by_move_body_def_id(def_id)
{
// Same if this is the by-move body of a coroutine-closure.
self.caller_body.coroutine_layout_raw()
} else {
self.tcx.coroutine_layout(def_id, args.as_coroutine().kind_ty())
Expand Down
18 changes: 18 additions & 0 deletions tests/ui/async-await/async-closures/validate-synthetic-body.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//@ check-pass

#![feature(async_closure)]

// Make sure that we don't hit a query cycle when validating
// the by-move coroutine body for an async closure.

use std::future::Future;

async fn test<Fut: Future>(operation: impl Fn() -> Fut) {
operation().await;
}

pub async fn orchestrate_simple_crud() {
test(async || async {}.await).await;
}

fn main() {}

0 comments on commit d1abd41

Please sign in to comment.