Remember where a type was kept in MIR.
This commit is contained in:
@@ -135,11 +135,20 @@ rustc_index::newtype_index! {
|
||||
pub struct GeneratorSavedLocal {}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable, TypeFoldable, TypeVisitable)]
|
||||
pub struct GeneratorSavedTy<'tcx> {
|
||||
pub ty: Ty<'tcx>,
|
||||
/// Source info corresponding to the local in the original MIR body.
|
||||
pub source_info: SourceInfo,
|
||||
/// Whether the local was introduced as a raw pointer to a static.
|
||||
pub is_static_ptr: bool,
|
||||
}
|
||||
|
||||
/// The layout of generator state.
|
||||
#[derive(Clone, TyEncodable, TyDecodable, HashStable, TypeFoldable, TypeVisitable)]
|
||||
pub struct GeneratorLayout<'tcx> {
|
||||
/// The type of every local stored inside the generator.
|
||||
pub field_tys: IndexVec<GeneratorSavedLocal, Ty<'tcx>>,
|
||||
pub field_tys: IndexVec<GeneratorSavedLocal, GeneratorSavedTy<'tcx>>,
|
||||
|
||||
/// Which of the above fields are in each variant. Note that one field may
|
||||
/// be stored in multiple variants.
|
||||
|
||||
@@ -571,9 +571,9 @@ impl<'tcx> GeneratorSubsts<'tcx> {
|
||||
) -> impl Iterator<Item = impl Iterator<Item = Ty<'tcx>> + Captures<'tcx>> {
|
||||
let layout = tcx.generator_layout(def_id).unwrap();
|
||||
layout.variant_fields.iter().map(move |variant| {
|
||||
variant
|
||||
.iter()
|
||||
.map(move |field| ty::EarlyBinder(layout.field_tys[*field]).subst(tcx, self.substs))
|
||||
variant.iter().map(move |field| {
|
||||
ty::EarlyBinder(layout.field_tys[*field].ty).subst(tcx, self.substs)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user