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
|
@ -133,6 +133,9 @@ pub enum DefKind {
|
|||
/// we treat them all the same, and code which needs to distinguish them can match
|
||||
/// or `hir::ClosureKind` or `type_of`.
|
||||
Closure,
|
||||
/// The definition of a synthetic coroutine body created by the lowering of a
|
||||
/// coroutine-closure, such as an async closure.
|
||||
SyntheticCoroutineBody,
|
||||
}
|
||||
|
||||
impl DefKind {
|
||||
|
@ -177,6 +180,7 @@ impl DefKind {
|
|||
DefKind::Closure => "closure",
|
||||
DefKind::ExternCrate => "extern crate",
|
||||
DefKind::GlobalAsm => "global assembly block",
|
||||
DefKind::SyntheticCoroutineBody => "synthetic mir body",
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -236,7 +240,8 @@ impl DefKind {
|
|||
| DefKind::ForeignMod
|
||||
| DefKind::GlobalAsm
|
||||
| DefKind::Impl { .. }
|
||||
| DefKind::OpaqueTy => None,
|
||||
| DefKind::OpaqueTy
|
||||
| DefKind::SyntheticCoroutineBody => None,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -276,6 +281,7 @@ impl DefKind {
|
|||
DefKind::GlobalAsm => DefPathData::GlobalAsm,
|
||||
DefKind::Impl { .. } => DefPathData::Impl,
|
||||
DefKind::Closure => DefPathData::Closure,
|
||||
DefKind::SyntheticCoroutineBody => DefPathData::Closure,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -291,7 +297,8 @@ impl DefKind {
|
|||
| DefKind::AssocFn
|
||||
| DefKind::Ctor(..)
|
||||
| DefKind::Closure
|
||||
| DefKind::Static { .. } => true,
|
||||
| DefKind::Static { .. }
|
||||
| DefKind::SyntheticCoroutineBody => true,
|
||||
DefKind::Mod
|
||||
| DefKind::Struct
|
||||
| DefKind::Union
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue