diff options
| author | bors <bors@rust-lang.org> | 2024-03-27 09:32:38 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-03-27 09:32:38 +0000 |
| commit | 10a7aa14fed9b528b74b0f098c4899c37c09a9c7 (patch) | |
| tree | 56f72b4171dcfd8e7028f0d359d0e3d3a7642634 /compiler/rustc_middle/src/ty/mod.rs | |
| parent | 0dcc1309d0e56f2121d46e20c19d332233533530 (diff) | |
| parent | c0945f0c9ead2d64c1ce3e149df48f7d4a4bf746 (diff) | |
| download | rust-10a7aa14fed9b528b74b0f098c4899c37c09a9c7.tar.gz rust-10a7aa14fed9b528b74b0f098c4899c37c09a9c7.zip | |
Auto merge of #123128 - GuillaumeGomez:rollup-3l3zu6s, r=GuillaumeGomez
Rollup of 6 pull requests Successful merges: - #121843 (Implement `-L KIND=`@RUSTC_BUILTIN/...`)` - #122860 (coverage: Re-enable `UnreachablePropagation` for coverage builds) - #123021 (Make `TyCtxt::coroutine_layout` take coroutine's kind parameter) - #123024 (CFI: Enable KCFI testing of run-pass tests) - #123083 (lib: fix some unnecessary_cast clippy lint) - #123116 (rustdoc: Swap fields and variant documentations) r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'compiler/rustc_middle/src/ty/mod.rs')
| -rw-r--r-- | compiler/rustc_middle/src/ty/mod.rs | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index 6ce53ccc8cd..aad2f6a4cf8 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -60,6 +60,7 @@ pub use rustc_target::abi::{ReprFlags, ReprOptions}; pub use rustc_type_ir::{DebugWithInfcx, InferCtxtLike, WithInfcx}; pub use vtable::*; +use std::assert_matches::assert_matches; use std::fmt::Debug; use std::hash::{Hash, Hasher}; use std::marker::PhantomData; @@ -1826,8 +1827,40 @@ impl<'tcx> TyCtxt<'tcx> { /// Returns layout of a coroutine. Layout might be unavailable if the /// coroutine is tainted by errors. - pub fn coroutine_layout(self, def_id: DefId) -> Option<&'tcx CoroutineLayout<'tcx>> { - self.optimized_mir(def_id).coroutine_layout() + /// + /// Takes `coroutine_kind` which can be acquired from the `CoroutineArgs::kind_ty`, + /// e.g. `args.as_coroutine().kind_ty()`. + pub fn coroutine_layout( + self, + def_id: DefId, + coroutine_kind_ty: Ty<'tcx>, + ) -> Option<&'tcx CoroutineLayout<'tcx>> { + let mir = self.optimized_mir(def_id); + // Regular coroutine + if coroutine_kind_ty.is_unit() { + mir.coroutine_layout_raw() + } else { + // If we have a `Coroutine` that comes from an coroutine-closure, + // then it may be a by-move or by-ref body. + let ty::Coroutine(_, identity_args) = + *self.type_of(def_id).instantiate_identity().kind() + else { + unreachable!(); + }; + let identity_kind_ty = identity_args.as_coroutine().kind_ty(); + // If the types differ, then we must be getting the by-move body of + // a by-ref coroutine. + if identity_kind_ty == coroutine_kind_ty { + mir.coroutine_layout_raw() + } else { + assert_matches!(coroutine_kind_ty.to_opt_closure_kind(), Some(ClosureKind::FnOnce)); + assert_matches!( + identity_kind_ty.to_opt_closure_kind(), + Some(ClosureKind::Fn | ClosureKind::FnMut) + ); + mir.coroutine_by_move_body().unwrap().coroutine_layout_raw() + } + } } /// Given the `DefId` of an impl, returns the `DefId` of the trait it implements. |
