Auto merge of #128506 - compiler-errors:by-move-body, r=cjgillot
Stop storing a special inner body for the coroutine by-move body for async closures ...and instead, just synthesize an item which is treated mostly normally by the MIR pipeline. This PR does a few things: * We synthesize a new `DefId` for the by-move body of a closure, which has its `mir_built` fed with the output of the `ByMoveBody` MIR transformation, and some other relevant queries. * This has the `DefKind::ByMoveBody`, which we use to distinguish it from "real" bodies (that come from HIR) which need to be borrowck'd. Introduce `TyCtxt::is_synthetic_mir` to skip over `mir_borrowck` which is called by `mir_promoted`; borrowck isn't really possible to make work ATM since it heavily relies being called on a body generated from HIR, and is redundant by the construction of the by-move-body. * Remove the special `PassManager` hacks for handling the inner `by_move_body` stored within the coroutine's mir body. Instead, this body is fed like a regular MIR body, so it's goes through all of the `tcx.*_mir` stages normally (build -> promoted -> ...etc... -> optimized) ✨. * Remove the `InstanceKind::ByMoveBody` shim, since now we have a "regular" def id, we can just use `InstanceKind::Item`. This also allows us to remove the corresponding hacks from codegen, such as in `fn_sig_for_fn_abi` ✨. Notable remarks: * ~~I know it's kind of weird to be using `DefKind::Closure` here, since it's not a distinct closure but just a new MIR body. I don't believe it really matters, but I could also use a different `DefKind`... maybe one that we could use for synthetic MIR bodies in general?~~ edit: We're doing this now.
This commit is contained in:
commit
d9a2cc4dae
40 changed files with 288 additions and 315 deletions
|
@ -169,39 +169,6 @@ fn fn_sig_for_fn_abi<'tcx>(
|
|||
kind: ty::BoundRegionKind::BrEnv,
|
||||
};
|
||||
|
||||
let mut ty = ty;
|
||||
// When this `Closure` comes from a `CoroutineKindShim`,
|
||||
// make sure we respect the `target_kind` in that shim.
|
||||
// FIXME(async_closures): This shouldn't be needed, and we should be populating
|
||||
// a separate def-id for these bodies.
|
||||
if let InstanceKind::CoroutineKindShim { .. } = instance.def {
|
||||
// Grab the parent coroutine-closure. It has the same args for the purposes
|
||||
// of instantiation, so this will be okay to do.
|
||||
let ty::CoroutineClosure(_, coroutine_closure_args) = *tcx
|
||||
.instantiate_and_normalize_erasing_regions(
|
||||
args,
|
||||
param_env,
|
||||
tcx.type_of(tcx.parent(did)),
|
||||
)
|
||||
.kind()
|
||||
else {
|
||||
bug!("CoroutineKindShim comes from calling a coroutine-closure");
|
||||
};
|
||||
let coroutine_closure_args = coroutine_closure_args.as_coroutine_closure();
|
||||
ty = tcx.instantiate_bound_regions_with_erased(
|
||||
coroutine_closure_args.coroutine_closure_sig().map_bound(|sig| {
|
||||
sig.to_coroutine_given_kind_and_upvars(
|
||||
tcx,
|
||||
coroutine_closure_args.parent_args(),
|
||||
did,
|
||||
ty::ClosureKind::FnOnce,
|
||||
tcx.lifetimes.re_erased,
|
||||
coroutine_closure_args.tupled_upvars_ty(),
|
||||
coroutine_closure_args.coroutine_captures_by_ref_ty(),
|
||||
)
|
||||
}),
|
||||
);
|
||||
}
|
||||
let env_ty = Ty::new_mut_ref(tcx, ty::Region::new_bound(tcx, ty::INNERMOST, br), ty);
|
||||
|
||||
let pin_did = tcx.require_lang_item(LangItem::Pin, None);
|
||||
|
|
|
@ -144,7 +144,8 @@ fn assumed_wf_types<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> &'tcx [(Ty<'
|
|||
| DefKind::Field
|
||||
| DefKind::LifetimeParam
|
||||
| DefKind::GlobalAsm
|
||||
| DefKind::Closure => ty::List::empty(),
|
||||
| DefKind::Closure
|
||||
| DefKind::SyntheticCoroutineBody => ty::List::empty(),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -348,7 +348,8 @@ fn opaque_types_defined_by<'tcx>(
|
|||
| DefKind::Field
|
||||
| DefKind::LifetimeParam
|
||||
| DefKind::GlobalAsm
|
||||
| DefKind::Impl { .. } => {}
|
||||
| DefKind::Impl { .. }
|
||||
| DefKind::SyntheticCoroutineBody => {}
|
||||
// Closures and coroutines are type checked with their parent, so we need to allow all
|
||||
// opaques from the closure signature *and* from the parent body.
|
||||
DefKind::Closure | DefKind::InlineConst => {
|
||||
|
|
|
@ -87,7 +87,7 @@ pub fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
|
|||
// These are not part of a public API, they can only appear as hidden types, and there
|
||||
// the interesting parts are solely in the signature of the containing item's opaque type
|
||||
// or dyn type.
|
||||
DefKind::InlineConst | DefKind::Closure => {}
|
||||
DefKind::InlineConst | DefKind::Closure | DefKind::SyntheticCoroutineBody => {}
|
||||
DefKind::Impl { of_trait } => {
|
||||
if of_trait {
|
||||
let span = tcx.hir_node_by_def_id(item).expect_item().expect_impl().of_trait.unwrap().path.span;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue