Rollup merge of #120330 - compiler-errors:no-coroutine-info-in-coroutine-drop-body, r=nnethercote
Remove coroutine info when building coroutine drop body Coroutine drop shims are not themselves coroutines, so erase the "`coroutine`" field from the body so that helper fns like `yield_ty` and `coroutine_kind` properly return `None` for the drop shim.
This commit is contained in:
commit
4bca954634
@ -244,18 +244,23 @@ impl<'tcx> MirSource<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Additional information carried by a MIR body when it is lowered from a coroutine.
|
||||||
|
/// This information is modified as it is lowered during the `StateTransform` MIR pass,
|
||||||
|
/// so not all fields will be active at a given time. For example, the `yield_ty` is
|
||||||
|
/// taken out of the field after yields are turned into returns, and the `coroutine_drop`
|
||||||
|
/// body is only populated after the state transform pass.
|
||||||
#[derive(Clone, TyEncodable, TyDecodable, Debug, HashStable, TypeFoldable, TypeVisitable)]
|
#[derive(Clone, TyEncodable, TyDecodable, Debug, HashStable, TypeFoldable, TypeVisitable)]
|
||||||
pub struct CoroutineInfo<'tcx> {
|
pub struct CoroutineInfo<'tcx> {
|
||||||
/// The yield type of the function, if it is a coroutine.
|
/// The yield type of the function. This field is removed after the state transform pass.
|
||||||
pub yield_ty: Option<Ty<'tcx>>,
|
pub yield_ty: Option<Ty<'tcx>>,
|
||||||
|
|
||||||
/// The resume type of the function, if it is a coroutine.
|
/// The resume type of the function. This field is removed after the state transform pass.
|
||||||
pub resume_ty: Option<Ty<'tcx>>,
|
pub resume_ty: Option<Ty<'tcx>>,
|
||||||
|
|
||||||
/// Coroutine drop glue.
|
/// Coroutine drop glue. This field is populated after the state transform pass.
|
||||||
pub coroutine_drop: Option<Body<'tcx>>,
|
pub coroutine_drop: Option<Body<'tcx>>,
|
||||||
|
|
||||||
/// The layout of a coroutine. Produced by the state transformation.
|
/// The layout of a coroutine. This field is populated after the state transform pass.
|
||||||
pub coroutine_layout: Option<CoroutineLayout<'tcx>>,
|
pub coroutine_layout: Option<CoroutineLayout<'tcx>>,
|
||||||
|
|
||||||
/// If this is a coroutine then record the type of source expression that caused this coroutine
|
/// If this is a coroutine then record the type of source expression that caused this coroutine
|
||||||
@ -303,6 +308,12 @@ pub struct Body<'tcx> {
|
|||||||
/// and used for debuginfo. Indexed by a `SourceScope`.
|
/// and used for debuginfo. Indexed by a `SourceScope`.
|
||||||
pub source_scopes: IndexVec<SourceScope, SourceScopeData<'tcx>>,
|
pub source_scopes: IndexVec<SourceScope, SourceScopeData<'tcx>>,
|
||||||
|
|
||||||
|
/// Additional information carried by a MIR body when it is lowered from a coroutine.
|
||||||
|
///
|
||||||
|
/// Note that the coroutine drop shim, any promoted consts, and other synthetic MIR
|
||||||
|
/// bodies that come from processing a coroutine body are not typically coroutines
|
||||||
|
/// themselves, and should probably set this to `None` to avoid carrying redundant
|
||||||
|
/// information.
|
||||||
pub coroutine: Option<Box<CoroutineInfo<'tcx>>>,
|
pub coroutine: Option<Box<CoroutineInfo<'tcx>>>,
|
||||||
|
|
||||||
/// Declarations of locals.
|
/// Declarations of locals.
|
||||||
|
@ -1231,7 +1231,12 @@ fn create_coroutine_drop_shim<'tcx>(
|
|||||||
drop_clean: BasicBlock,
|
drop_clean: BasicBlock,
|
||||||
) -> Body<'tcx> {
|
) -> Body<'tcx> {
|
||||||
let mut body = body.clone();
|
let mut body = body.clone();
|
||||||
body.arg_count = 1; // make sure the resume argument is not included here
|
// Take the coroutine info out of the body, since the drop shim is
|
||||||
|
// not a coroutine body itself; it just has its drop built out of it.
|
||||||
|
let _ = body.coroutine.take();
|
||||||
|
// Make sure the resume argument is not included here, since we're
|
||||||
|
// building a body for `drop_in_place`.
|
||||||
|
body.arg_count = 1;
|
||||||
|
|
||||||
let source_info = SourceInfo::outermost(body.span);
|
let source_info = SourceInfo::outermost(body.span);
|
||||||
|
|
||||||
|
@ -1,25 +1,4 @@
|
|||||||
// MIR for `main::{closure#0}` 0 coroutine_drop
|
// MIR for `main::{closure#0}` 0 coroutine_drop
|
||||||
/* coroutine_layout = CoroutineLayout {
|
|
||||||
field_tys: {
|
|
||||||
_0: CoroutineSavedTy {
|
|
||||||
ty: std::string::String,
|
|
||||||
source_info: SourceInfo {
|
|
||||||
span: $DIR/coroutine_drop_cleanup.rs:12:13: 12:15 (#0),
|
|
||||||
scope: scope[0],
|
|
||||||
},
|
|
||||||
ignore_for_traits: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
variant_fields: {
|
|
||||||
Unresumed(0): [],
|
|
||||||
Returned (1): [],
|
|
||||||
Panicked (2): [],
|
|
||||||
Suspend0 (3): [_0],
|
|
||||||
},
|
|
||||||
storage_conflicts: BitMatrix(1x1) {
|
|
||||||
(_0, _0),
|
|
||||||
},
|
|
||||||
} */
|
|
||||||
|
|
||||||
fn main::{closure#0}(_1: *mut {coroutine@$DIR/coroutine_drop_cleanup.rs:11:15: 11:17}) -> () {
|
fn main::{closure#0}(_1: *mut {coroutine@$DIR/coroutine_drop_cleanup.rs:11:15: 11:17}) -> () {
|
||||||
let mut _0: ();
|
let mut _0: ();
|
||||||
|
@ -1,25 +1,4 @@
|
|||||||
// MIR for `main::{closure#0}` 0 coroutine_drop
|
// MIR for `main::{closure#0}` 0 coroutine_drop
|
||||||
/* coroutine_layout = CoroutineLayout {
|
|
||||||
field_tys: {
|
|
||||||
_0: CoroutineSavedTy {
|
|
||||||
ty: std::string::String,
|
|
||||||
source_info: SourceInfo {
|
|
||||||
span: $DIR/coroutine_drop_cleanup.rs:12:13: 12:15 (#0),
|
|
||||||
scope: scope[0],
|
|
||||||
},
|
|
||||||
ignore_for_traits: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
variant_fields: {
|
|
||||||
Unresumed(0): [],
|
|
||||||
Returned (1): [],
|
|
||||||
Panicked (2): [],
|
|
||||||
Suspend0 (3): [_0],
|
|
||||||
},
|
|
||||||
storage_conflicts: BitMatrix(1x1) {
|
|
||||||
(_0, _0),
|
|
||||||
},
|
|
||||||
} */
|
|
||||||
|
|
||||||
fn main::{closure#0}(_1: *mut {coroutine@$DIR/coroutine_drop_cleanup.rs:11:15: 11:17}) -> () {
|
fn main::{closure#0}(_1: *mut {coroutine@$DIR/coroutine_drop_cleanup.rs:11:15: 11:17}) -> () {
|
||||||
let mut _0: ();
|
let mut _0: ();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user