generate GeneratorSubsts from SubstsRef
This commit is contained in:
parent
2d87bace96
commit
fa7a87be63
12 changed files with 31 additions and 32 deletions
|
|
@ -733,12 +733,12 @@ where
|
|||
// Skip lifetime parameters of the enclosing item(s)
|
||||
// Also skip the witness type, because that has no free regions.
|
||||
|
||||
for upvar_ty in substs.upvar_tys(def_id, self.tcx) {
|
||||
for upvar_ty in substs.as_generator().upvar_tys(def_id, self.tcx) {
|
||||
upvar_ty.visit_with(self);
|
||||
}
|
||||
|
||||
substs.return_ty(def_id, self.tcx).visit_with(self);
|
||||
substs.yield_ty(def_id, self.tcx).visit_with(self);
|
||||
substs.as_generator().return_ty(def_id, self.tcx).visit_with(self);
|
||||
substs.as_generator().yield_ty(def_id, self.tcx).visit_with(self);
|
||||
}
|
||||
_ => {
|
||||
ty.super_visit_with(self);
|
||||
|
|
@ -902,7 +902,7 @@ impl TypeFolder<'tcx> for ReverseMapper<'tcx> {
|
|||
ty::Generator(def_id, substs, movability) => {
|
||||
let generics = self.tcx.generics_of(def_id);
|
||||
let substs =
|
||||
self.tcx.mk_substs(substs.substs.iter().enumerate().map(|(index, &kind)| {
|
||||
self.tcx.mk_substs(substs.iter().enumerate().map(|(index, &kind)| {
|
||||
if index < generics.parent_count {
|
||||
// Accommodate missing regions in the parent kinds...
|
||||
self.fold_kind_mapping_missing_regions_to_empty(kind)
|
||||
|
|
|
|||
|
|
@ -197,7 +197,7 @@ impl<'tcx> Rvalue<'tcx> {
|
|||
let ty = place.ty(local_decls, tcx).ty;
|
||||
match ty.kind {
|
||||
ty::Adt(adt_def, _) => adt_def.repr.discr_type().to_ty(tcx),
|
||||
ty::Generator(_, substs, _) => substs.discr_ty(tcx),
|
||||
ty::Generator(_, substs, _) => substs.as_generator().discr_ty(tcx),
|
||||
_ => {
|
||||
// This can only be `0`, for now, so `u8` will suffice.
|
||||
tcx.types.u8
|
||||
|
|
|
|||
|
|
@ -2761,8 +2761,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
.collect(),
|
||||
|
||||
ty::Generator(def_id, ref substs, _) => {
|
||||
let witness = substs.witness(def_id, self.tcx());
|
||||
let witness = substs.as_generator().witness(def_id, self.tcx());
|
||||
substs
|
||||
.as_generator()
|
||||
.upvar_tys(def_id, self.tcx())
|
||||
.chain(iter::once(witness))
|
||||
.collect()
|
||||
|
|
@ -3324,8 +3325,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
)?);
|
||||
|
||||
Ok(VtableGeneratorData {
|
||||
generator_def_id: generator_def_id,
|
||||
substs: substs.clone(),
|
||||
generator_def_id,
|
||||
substs,
|
||||
nested: obligations,
|
||||
})
|
||||
}
|
||||
|
|
@ -3911,9 +3912,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
&mut self,
|
||||
obligation: &TraitObligation<'tcx>,
|
||||
closure_def_id: DefId,
|
||||
substs: ty::GeneratorSubsts<'tcx>,
|
||||
substs: SubstsRef<'tcx>,
|
||||
) -> ty::PolyTraitRef<'tcx> {
|
||||
let gen_sig = substs.poly_sig(closure_def_id, self.tcx());
|
||||
let gen_sig = substs.as_generator().poly_sig(closure_def_id, self.tcx());
|
||||
|
||||
// (1) Feels icky to skip the binder here, but OTOH we know
|
||||
// that the self-type is an generator type and hence is
|
||||
|
|
|
|||
|
|
@ -2510,7 +2510,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
#[inline]
|
||||
pub fn mk_generator(self,
|
||||
id: DefId,
|
||||
generator_substs: GeneratorSubsts<'tcx>,
|
||||
generator_substs: SubstsRef<'tcx>,
|
||||
movability: hir::GeneratorMovability)
|
||||
-> Ty<'tcx> {
|
||||
self.mk_ty(Generator(id, generator_substs, movability))
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ impl FlagComputation {
|
|||
&ty::Generator(_, ref substs, _) => {
|
||||
self.add_flags(TypeFlags::HAS_TY_CLOSURE);
|
||||
self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES);
|
||||
self.add_substs(&substs.substs);
|
||||
self.add_substs(substs);
|
||||
}
|
||||
|
||||
&ty::GeneratorWitness(ref ts) => {
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ impl<'tcx> Instance<'tcx> {
|
|||
))
|
||||
}
|
||||
ty::Generator(def_id, substs, _) => {
|
||||
let sig = substs.poly_sig(def_id, tcx);
|
||||
let sig = substs.as_generator().poly_sig(def_id, tcx);
|
||||
|
||||
let env_region = ty::ReLateBound(ty::INNERMOST, ty::BrEnv);
|
||||
let env_ty = tcx.mk_mut_ref(tcx.mk_region(env_region), ty);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use crate::session::{self, DataTypeKind};
|
||||
use crate::ty::{self, Ty, TyCtxt, TypeFoldable, ReprOptions};
|
||||
use crate::ty::{self, Ty, TyCtxt, TypeFoldable, ReprOptions, subst::SubstsRef};
|
||||
|
||||
use syntax::ast::{self, Ident, IntTy, UintTy};
|
||||
use syntax::attr;
|
||||
|
|
@ -15,7 +15,6 @@ use std::ops::Bound;
|
|||
use crate::hir;
|
||||
use crate::ich::StableHashingContext;
|
||||
use crate::mir::{GeneratorLayout, GeneratorSavedLocal};
|
||||
use crate::ty::GeneratorSubsts;
|
||||
use crate::ty::subst::Subst;
|
||||
use rustc_index::bit_set::BitSet;
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
|
|
@ -671,7 +670,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
|
|||
tcx.intern_layout(unit)
|
||||
}
|
||||
|
||||
ty::Generator(def_id, substs, _) => self.generator_layout(ty, def_id, &substs)?,
|
||||
ty::Generator(def_id, substs, _) => self.generator_layout(ty, def_id, substs)?,
|
||||
|
||||
ty::Closure(def_id, ref substs) => {
|
||||
let tys = substs.as_closure().upvar_tys(def_id, tcx);
|
||||
|
|
@ -1406,7 +1405,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
|
|||
&self,
|
||||
ty: Ty<'tcx>,
|
||||
def_id: hir::def_id::DefId,
|
||||
substs: &GeneratorSubsts<'tcx>,
|
||||
substs: SubstsRef<'tcx>,
|
||||
) -> Result<&'tcx LayoutDetails, LayoutError<'tcx>> {
|
||||
use SavedLocalEligibility::*;
|
||||
let tcx = self.tcx;
|
||||
|
|
@ -1419,9 +1418,9 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
|
|||
// Build a prefix layout, including "promoting" all ineligible
|
||||
// locals as part of the prefix. We compute the layout of all of
|
||||
// these fields at once to get optimal packing.
|
||||
let discr_index = substs.prefix_tys(def_id, tcx).count();
|
||||
let discr_index = substs.as_generator().prefix_tys(def_id, tcx).count();
|
||||
// FIXME(eddyb) set the correct vaidity range for the discriminant.
|
||||
let discr_layout = self.layout_of(substs.discr_ty(tcx))?;
|
||||
let discr_layout = self.layout_of(substs.as_generator().discr_ty(tcx))?;
|
||||
let discr = match &discr_layout.abi {
|
||||
Abi::Scalar(s) => s.clone(),
|
||||
_ => bug!(),
|
||||
|
|
@ -2153,7 +2152,7 @@ where
|
|||
ty::Generator(def_id, ref substs, _) => {
|
||||
match this.variants {
|
||||
Variants::Single { index } => {
|
||||
substs.state_tys(def_id, tcx)
|
||||
substs.as_generator().state_tys(def_id, tcx)
|
||||
.nth(index.as_usize()).unwrap()
|
||||
.nth(i).unwrap()
|
||||
}
|
||||
|
|
@ -2161,7 +2160,7 @@ where
|
|||
if i == discr_index {
|
||||
return discr_layout(discr);
|
||||
}
|
||||
substs.prefix_tys(def_id, tcx).nth(i).unwrap()
|
||||
substs.as_generator().prefix_tys(def_id, tcx).nth(i).unwrap()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
|
||||
ty::Generator(def_id, ref substs, _) => {
|
||||
// Same as the closure case
|
||||
for upvar_ty in substs.upvar_tys(def_id, *self) {
|
||||
for upvar_ty in substs.as_generator().upvar_tys(def_id, *self) {
|
||||
self.compute_components(upvar_ty, out);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ impl DefPathBasedNames<'tcx> {
|
|||
self.push_type_name(sig.output(), output, debug);
|
||||
}
|
||||
}
|
||||
ty::Generator(def_id, GeneratorSubsts { substs }, _)
|
||||
ty::Generator(def_id, substs, _)
|
||||
| ty::Closure(def_id, substs) => {
|
||||
self.push_def_path(def_id, output);
|
||||
let generics = self.tcx.generics_of(self.tcx.closure_base_def_id(def_id));
|
||||
|
|
|
|||
|
|
@ -605,8 +605,8 @@ pub trait PrettyPrinter<'tcx>:
|
|||
}
|
||||
ty::Str => p!(write("str")),
|
||||
ty::Generator(did, substs, movability) => {
|
||||
let upvar_tys = substs.upvar_tys(did, self.tcx());
|
||||
let witness = substs.witness(did, self.tcx());
|
||||
let upvar_tys = substs.as_generator().upvar_tys(did, self.tcx());
|
||||
let witness = substs.as_generator().witness(did, self.tcx());
|
||||
if movability == hir::GeneratorMovability::Movable {
|
||||
p!(write("[generator"));
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -2109,7 +2109,8 @@ impl<'tcx> TyS<'tcx> {
|
|||
pub fn variant_range(&self, tcx: TyCtxt<'tcx>) -> Option<Range<VariantIdx>> {
|
||||
match self.kind {
|
||||
TyKind::Adt(adt, _) => Some(adt.variant_range()),
|
||||
TyKind::Generator(def_id, substs, _) => Some(substs.variant_range(def_id, tcx)),
|
||||
TyKind::Generator(def_id, substs, _) =>
|
||||
Some(substs.assert_generator().variant_range(def_id, tcx)),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
|
@ -2126,7 +2127,7 @@ impl<'tcx> TyS<'tcx> {
|
|||
match self.kind {
|
||||
TyKind::Adt(adt, _) => Some(adt.discriminant_for_variant(tcx, variant_index)),
|
||||
TyKind::Generator(def_id, substs, _) =>
|
||||
Some(substs.discriminant_for_variant(def_id, tcx, variant_index)),
|
||||
Some(substs.as_generator().discriminant_for_variant(def_id, tcx, variant_index)),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
|
@ -2149,7 +2150,7 @@ impl<'tcx> TyS<'tcx> {
|
|||
out.extend(substs.regions())
|
||||
}
|
||||
Closure(_, ref substs ) |
|
||||
Generator(_, GeneratorSubsts { ref substs }, _) => {
|
||||
Generator(_, ref substs, _) => {
|
||||
out.extend(substs.regions())
|
||||
}
|
||||
Projection(ref data) | UnnormalizedProjection(ref data) => {
|
||||
|
|
|
|||
|
|
@ -110,12 +110,10 @@ fn push_subtypes<'tcx>(stack: &mut TypeWalkerStack<'tcx>, parent_ty: Ty<'tcx>) {
|
|||
ty::Adt(_, substs) | ty::Opaque(_, substs) => {
|
||||
stack.extend(substs.types().rev());
|
||||
}
|
||||
ty::Closure(_, ref substs) => {
|
||||
ty::Closure(_, ref substs)
|
||||
| ty::Generator(_, ref substs, _) => {
|
||||
stack.extend(substs.types().rev());
|
||||
}
|
||||
ty::Generator(_, ref substs, _) => {
|
||||
stack.extend(substs.substs.types().rev());
|
||||
}
|
||||
ty::GeneratorWitness(ts) => {
|
||||
stack.extend(ts.skip_binder().iter().cloned().rev());
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue