clean up GeneratorSubsts
This commit is contained in:
parent
ef9fe10280
commit
afc0bb9794
20 changed files with 58 additions and 71 deletions
|
@ -512,7 +512,7 @@ impl<'tcx> GeneratorSubsts<'tcx> {
|
|||
/// variant indices.
|
||||
#[inline]
|
||||
pub fn discriminants(
|
||||
&'tcx self,
|
||||
self,
|
||||
def_id: DefId,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) -> impl Iterator<Item = (VariantIdx, Discr<'tcx>)> + Captures<'tcx> {
|
||||
|
@ -524,7 +524,7 @@ impl<'tcx> GeneratorSubsts<'tcx> {
|
|||
/// Calls `f` with a reference to the name of the enumerator for the given
|
||||
/// variant `v`.
|
||||
#[inline]
|
||||
pub fn variant_name(&self, v: VariantIdx) -> Cow<'static, str> {
|
||||
pub fn variant_name(self, v: VariantIdx) -> Cow<'static, str> {
|
||||
match v.as_usize() {
|
||||
Self::UNRESUMED => Cow::from(Self::UNRESUMED_NAME),
|
||||
Self::RETURNED => Cow::from(Self::RETURNED_NAME),
|
||||
|
@ -570,7 +570,7 @@ impl<'tcx> GeneratorSubsts<'tcx> {
|
|||
#[derive(Debug, Copy, Clone)]
|
||||
pub enum UpvarSubsts<'tcx> {
|
||||
Closure(SubstsRef<'tcx>),
|
||||
Generator(GeneratorSubsts<'tcx>),
|
||||
Generator(SubstsRef<'tcx>),
|
||||
}
|
||||
|
||||
impl<'tcx> UpvarSubsts<'tcx> {
|
||||
|
@ -582,7 +582,7 @@ impl<'tcx> UpvarSubsts<'tcx> {
|
|||
) -> impl Iterator<Item = Ty<'tcx>> + 'tcx {
|
||||
let upvar_kinds = match self {
|
||||
UpvarSubsts::Closure(substs) => substs.as_closure().split(def_id, tcx).upvar_kinds,
|
||||
UpvarSubsts::Generator(substs) => substs.split(def_id, tcx).upvar_kinds,
|
||||
UpvarSubsts::Generator(substs) => substs.as_generator().split(def_id, tcx).upvar_kinds,
|
||||
};
|
||||
upvar_kinds.iter().map(|t| {
|
||||
if let GenericArgKind::Type(ty) = t.unpack() {
|
||||
|
|
|
@ -198,7 +198,7 @@ impl<'a, 'tcx> InternalSubsts<'tcx> {
|
|||
/// Closure substitutions have a particular structure controlled by the
|
||||
/// compiler that encodes information like the signature and generator kind;
|
||||
/// see `ty::GeneratorSubsts` struct for more comments.
|
||||
pub fn as_generator(&'a self) -> GeneratorSubsts<'a> {
|
||||
pub fn as_generator(&'tcx self) -> GeneratorSubsts<'tcx> {
|
||||
GeneratorSubsts { substs: self }
|
||||
}
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ use rustc::ty::Instance;
|
|||
use rustc::ty::{self, AdtKind, ParamEnv, Ty, TyCtxt};
|
||||
use rustc::ty::layout::{self, Align, Integer, IntegerExt, LayoutOf,
|
||||
PrimitiveExt, Size, TyLayout, VariantIdx};
|
||||
use rustc::ty::subst::GenericArgKind;
|
||||
use rustc::ty::subst::{GenericArgKind, SubstsRef};
|
||||
use rustc::session::config::{self, DebugInfo};
|
||||
use rustc::util::nodemap::FxHashMap;
|
||||
use rustc_fs_util::path_to_c_string;
|
||||
|
@ -692,9 +692,10 @@ pub fn type_metadata(
|
|||
Some(containing_scope)).finalize(cx)
|
||||
}
|
||||
ty::Generator(def_id, substs, _) => {
|
||||
let upvar_tys : Vec<_> = substs.prefix_tys(def_id, cx.tcx).map(|t| {
|
||||
cx.tcx.normalize_erasing_regions(ParamEnv::reveal_all(), t)
|
||||
}).collect();
|
||||
let upvar_tys : Vec<_> = substs
|
||||
.as_generator().prefix_tys(def_id, cx.tcx).map(|t| {
|
||||
cx.tcx.normalize_erasing_regions(ParamEnv::reveal_all(), t)
|
||||
}).collect();
|
||||
prepare_enum_metadata(cx,
|
||||
t,
|
||||
def_id,
|
||||
|
@ -1338,7 +1339,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
|
|||
ty::Adt(adt, _) => VariantInfo::Adt(&adt.variants[index]),
|
||||
ty::Generator(def_id, substs, _) => {
|
||||
let generator_layout = cx.tcx.generator_layout(*def_id);
|
||||
VariantInfo::Generator(*substs, generator_layout, index)
|
||||
VariantInfo::Generator(substs, generator_layout, index)
|
||||
}
|
||||
_ => bug!(),
|
||||
}
|
||||
|
@ -1611,7 +1612,7 @@ enum EnumDiscriminantInfo<'ll> {
|
|||
#[derive(Copy, Clone)]
|
||||
enum VariantInfo<'tcx> {
|
||||
Adt(&'tcx ty::VariantDef),
|
||||
Generator(ty::GeneratorSubsts<'tcx>, &'tcx GeneratorLayout<'tcx>, VariantIdx),
|
||||
Generator(SubstsRef<'tcx>, &'tcx GeneratorLayout<'tcx>, VariantIdx),
|
||||
}
|
||||
|
||||
impl<'tcx> VariantInfo<'tcx> {
|
||||
|
@ -1619,7 +1620,7 @@ impl<'tcx> VariantInfo<'tcx> {
|
|||
match self {
|
||||
VariantInfo::Adt(variant) => f(&variant.ident.as_str()),
|
||||
VariantInfo::Generator(substs, _, variant_index) =>
|
||||
f(&substs.variant_name(*variant_index)),
|
||||
f(&substs.as_generator().variant_name(*variant_index)),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1763,9 +1764,10 @@ fn prepare_enum_metadata(
|
|||
})
|
||||
.collect(),
|
||||
ty::Generator(_, substs, _) => substs
|
||||
.as_generator()
|
||||
.variant_range(enum_def_id, cx.tcx)
|
||||
.map(|variant_index| {
|
||||
let name = SmallCStr::new(&substs.variant_name(variant_index));
|
||||
let name = SmallCStr::new(&substs.as_generator().variant_name(variant_index));
|
||||
unsafe {
|
||||
Some(llvm::LLVMRustDIBuilderCreateEnumerator(
|
||||
DIB(cx),
|
||||
|
|
|
@ -65,7 +65,7 @@ fn uncached_llvm_type<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
|
|||
if let (&ty::Generator(_, substs, _), &layout::Variants::Single { index })
|
||||
= (&layout.ty.kind, &layout.variants)
|
||||
{
|
||||
write!(&mut name, "::{}", substs.variant_name(index)).unwrap();
|
||||
write!(&mut name, "::{}", substs.as_generator().variant_name(index)).unwrap();
|
||||
}
|
||||
Some(name)
|
||||
}
|
||||
|
|
|
@ -636,7 +636,7 @@ fn arg_local_refs<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
ty::Generator(def_id, substs, _) => (def_id, substs),
|
||||
_ => bug!("generator layout without generator substs"),
|
||||
};
|
||||
let state_tys = gen_substs.state_tys(def_id, tcx);
|
||||
let state_tys = gen_substs.as_generator().state_tys(def_id, tcx);
|
||||
|
||||
generator_layout.variant_fields.iter()
|
||||
.zip(state_tys)
|
||||
|
|
|
@ -225,7 +225,7 @@ impl Printer<'tcx> for SymbolPrinter<'tcx> {
|
|||
ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs }) |
|
||||
ty::UnnormalizedProjection(ty::ProjectionTy { item_def_id: def_id, substs }) |
|
||||
ty::Closure(def_id, substs) |
|
||||
ty::Generator(def_id, ty::GeneratorSubsts { substs }, _) => {
|
||||
ty::Generator(def_id, substs, _) => {
|
||||
self.print_def_path(def_id, substs)
|
||||
}
|
||||
_ => self.pretty_print_type(ty),
|
||||
|
|
|
@ -415,7 +415,7 @@ impl Printer<'tcx> for SymbolMangler<'tcx> {
|
|||
ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs }) |
|
||||
ty::UnnormalizedProjection(ty::ProjectionTy { item_def_id: def_id, substs }) |
|
||||
ty::Closure(def_id, substs) |
|
||||
ty::Generator(def_id, ty::GeneratorSubsts { substs }, _) => {
|
||||
ty::Generator(def_id, substs, _) => {
|
||||
self = self.print_def_path(def_id, substs)?;
|
||||
}
|
||||
ty::Foreign(def_id) => {
|
||||
|
|
|
@ -12,7 +12,7 @@ use rustc::mir::{
|
|||
SourceInfo, Statement, StatementKind, Terminator, TerminatorKind, UserTypeProjection,
|
||||
};
|
||||
use rustc::ty::fold::TypeFoldable;
|
||||
use rustc::ty::{self, GeneratorSubsts, RegionVid, Ty};
|
||||
use rustc::ty::{self, RegionVid, Ty};
|
||||
use rustc::ty::subst::SubstsRef;
|
||||
|
||||
pub(super) fn generate_constraints<'cx, 'tcx>(
|
||||
|
@ -91,13 +91,6 @@ impl<'cg, 'cx, 'tcx> Visitor<'tcx> for ConstraintGeneration<'cg, 'cx, 'tcx> {
|
|||
self.super_ty(ty);
|
||||
}
|
||||
|
||||
/// We sometimes have `generator_substs` within an rvalue, or within a
|
||||
/// call. Make them live at the location where they appear.
|
||||
fn visit_generator_substs(&mut self, substs: &GeneratorSubsts<'tcx>, location: Location) {
|
||||
self.add_regular_live_constraint(*substs, location);
|
||||
self.super_generator_substs(substs);
|
||||
}
|
||||
|
||||
fn visit_statement(
|
||||
&mut self,
|
||||
statement: &Statement<'tcx>,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use rustc::ty::subst::SubstsRef;
|
||||
use rustc::ty::{self, GeneratorSubsts, Ty, TypeFoldable};
|
||||
use rustc::ty::{self, Ty, TypeFoldable};
|
||||
use rustc::mir::{Location, Body, Promoted};
|
||||
use rustc::mir::visit::{MutVisitor, TyContext};
|
||||
use rustc::infer::{InferCtxt, NLLRegionVariableOrigin};
|
||||
|
@ -82,18 +82,4 @@ impl<'a, 'tcx> MutVisitor<'tcx> for NLLVisitor<'a, 'tcx> {
|
|||
fn visit_const(&mut self, constant: &mut &'tcx ty::Const<'tcx>, _location: Location) {
|
||||
*constant = self.renumber_regions(&*constant);
|
||||
}
|
||||
|
||||
fn visit_generator_substs(&mut self,
|
||||
substs: &mut GeneratorSubsts<'tcx>,
|
||||
location: Location) {
|
||||
debug!(
|
||||
"visit_generator_substs(substs={:?}, location={:?})",
|
||||
substs,
|
||||
location,
|
||||
);
|
||||
|
||||
*substs = self.renumber_regions(substs);
|
||||
|
||||
debug!("visit_generator_substs: substs={:?}", substs);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -759,13 +759,13 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
|||
PlaceTy { ty, variant_index: Some(variant_index) } => match ty.kind {
|
||||
ty::Adt(adt_def, substs) => (&adt_def.variants[variant_index], substs),
|
||||
ty::Generator(def_id, substs, _) => {
|
||||
let mut variants = substs.state_tys(def_id, tcx);
|
||||
let mut variants = substs.as_generator().state_tys(def_id, tcx);
|
||||
let mut variant = match variants.nth(variant_index.into()) {
|
||||
Some(v) => v,
|
||||
None => {
|
||||
bug!("variant_index of generator out of range: {:?}/{:?}",
|
||||
variant_index,
|
||||
substs.state_tys(def_id, tcx).count())
|
||||
substs.as_generator().state_tys(def_id, tcx).count())
|
||||
}
|
||||
};
|
||||
return match variant.nth(field.index()) {
|
||||
|
@ -791,10 +791,10 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
|||
ty::Generator(def_id, substs, _) => {
|
||||
// Only prefix fields (upvars and current state) are
|
||||
// accessible without a variant index.
|
||||
return match substs.prefix_tys(def_id, tcx).nth(field.index()) {
|
||||
return match substs.as_generator().prefix_tys(def_id, tcx).nth(field.index()) {
|
||||
Some(ty) => Ok(ty),
|
||||
None => Err(FieldAccessError::OutOfRange {
|
||||
field_count: substs.prefix_tys(def_id, tcx).count(),
|
||||
field_count: substs.as_generator().prefix_tys(def_id, tcx).count(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
@ -1963,10 +1963,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
// It doesn't make sense to look at a field beyond the prefix;
|
||||
// these require a variant index, and are not initialized in
|
||||
// aggregate rvalues.
|
||||
match substs.prefix_tys(def_id, tcx).nth(field_index) {
|
||||
match substs.as_generator().prefix_tys(def_id, tcx).nth(field_index) {
|
||||
Some(ty) => Ok(ty),
|
||||
None => Err(FieldAccessError::OutOfRange {
|
||||
field_count: substs.prefix_tys(def_id, tcx).count(),
|
||||
field_count: substs.as_generator().prefix_tys(def_id, tcx).count(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
@ -2541,7 +2541,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
// these extra requirements are basically like where
|
||||
// clauses on the struct.
|
||||
AggregateKind::Closure(def_id, substs)
|
||||
| AggregateKind::Generator(def_id, ty::GeneratorSubsts { substs }, _) => {
|
||||
| AggregateKind::Generator(def_id, substs, _) => {
|
||||
self.prove_closure_bounds(tcx, *def_id, substs, location)
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ use rustc::infer::{InferCtxt, NLLRegionVariableOrigin};
|
|||
use rustc::middle::lang_items;
|
||||
use rustc::ty::fold::TypeFoldable;
|
||||
use rustc::ty::subst::{InternalSubsts, SubstsRef, Subst};
|
||||
use rustc::ty::{self, GeneratorSubsts, RegionVid, Ty, TyCtxt};
|
||||
use rustc::ty::{self, RegionVid, Ty, TyCtxt};
|
||||
use rustc::util::nodemap::FxHashMap;
|
||||
use rustc_index::vec::{Idx, IndexVec};
|
||||
use rustc_errors::DiagnosticBuilder;
|
||||
|
@ -90,7 +90,7 @@ pub enum DefiningTy<'tcx> {
|
|||
/// The MIR is a generator. The signature is that generators take
|
||||
/// no parameters and return the result of
|
||||
/// `ClosureSubsts::generator_return_ty`.
|
||||
Generator(DefId, ty::GeneratorSubsts<'tcx>, hir::GeneratorMovability),
|
||||
Generator(DefId, SubstsRef<'tcx>, hir::GeneratorMovability),
|
||||
|
||||
/// The MIR is a fn item with the given `DefId` and substs. The signature
|
||||
/// of the function can be bound then with the `fn_sig` query.
|
||||
|
@ -113,7 +113,7 @@ impl<'tcx> DefiningTy<'tcx> {
|
|||
substs.as_closure().upvar_tys(def_id, tcx)
|
||||
),
|
||||
DefiningTy::Generator(def_id, substs, _) => {
|
||||
Either::Right(Either::Left(substs.upvar_tys(def_id, tcx)))
|
||||
Either::Right(Either::Left(substs.as_generator().upvar_tys(def_id, tcx)))
|
||||
}
|
||||
DefiningTy::FnDef(..) | DefiningTy::Const(..) => {
|
||||
Either::Right(Either::Right(iter::empty()))
|
||||
|
@ -334,7 +334,7 @@ impl<'tcx> UniversalRegions<'tcx> {
|
|||
err.note(&format!(
|
||||
"defining type: {:?} with generator substs {:#?}",
|
||||
def_id,
|
||||
&substs.substs[..]
|
||||
&substs[..]
|
||||
));
|
||||
|
||||
// FIXME: As above, we'd like to print out the region
|
||||
|
@ -470,7 +470,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
|
|||
|
||||
let yield_ty = match defining_ty {
|
||||
DefiningTy::Generator(def_id, substs, _) => {
|
||||
Some(substs.yield_ty(def_id, self.infcx.tcx))
|
||||
Some(substs.as_generator().yield_ty(def_id, self.infcx.tcx))
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
|
@ -549,7 +549,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
|
|||
let identity_substs = InternalSubsts::identity_for_item(tcx, closure_base_def_id);
|
||||
let fr_substs = match defining_ty {
|
||||
DefiningTy::Closure(_, ref substs)
|
||||
| DefiningTy::Generator(_, GeneratorSubsts { ref substs }, _) => {
|
||||
| DefiningTy::Generator(_, ref substs, _) => {
|
||||
// In the case of closures, we rely on the fact that
|
||||
// the first N elements in the ClosureSubsts are
|
||||
// inherited from the `closure_base_def_id`.
|
||||
|
@ -612,7 +612,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
|
|||
|
||||
DefiningTy::Generator(def_id, substs, movability) => {
|
||||
assert_eq!(self.mir_def_id, def_id);
|
||||
let output = substs.return_ty(def_id, tcx);
|
||||
let output = substs.as_generator().return_ty(def_id, tcx);
|
||||
let generator_ty = tcx.mk_generator(def_id, substs, movability);
|
||||
let inputs_and_output = self.infcx.tcx.intern_type_list(&[generator_ty, output]);
|
||||
ty::Binder::dummy(inputs_and_output)
|
||||
|
|
|
@ -146,7 +146,7 @@ pub fn mir_build(tcx: TyCtxt<'_>, def_id: DefId) -> Body<'_> {
|
|||
let (yield_ty, return_ty) = if body.generator_kind.is_some() {
|
||||
let gen_sig = match ty.kind {
|
||||
ty::Generator(gen_def_id, gen_substs, ..) =>
|
||||
gen_substs.sig(gen_def_id, tcx),
|
||||
gen_substs.as_generator().sig(gen_def_id, tcx),
|
||||
_ =>
|
||||
span_bug!(tcx.hir().span(id),
|
||||
"generator w/o generator type: {:?}", ty),
|
||||
|
|
|
@ -68,8 +68,7 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> {
|
|||
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
|
||||
| ty::UnnormalizedProjection(ty::ProjectionTy { item_def_id: def_id, substs })
|
||||
| ty::Closure(def_id, substs)
|
||||
| ty::Generator(def_id, ty::GeneratorSubsts { substs }, _)
|
||||
=> self.print_def_path(def_id, substs),
|
||||
| ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs),
|
||||
ty::Foreign(def_id) => self.print_def_path(def_id, &[]),
|
||||
|
||||
ty::GeneratorWitness(_) => {
|
||||
|
|
|
@ -664,14 +664,18 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
bits_discr
|
||||
};
|
||||
// Make sure we catch invalid discriminants
|
||||
let index = match &rval.layout.ty.kind {
|
||||
let index = match rval.layout.ty.kind {
|
||||
ty::Adt(adt, _) => adt
|
||||
.discriminants(self.tcx.tcx)
|
||||
.find(|(_, var)| var.val == real_discr),
|
||||
ty::Generator(def_id, substs, _) => substs
|
||||
.discriminants(*def_id, self.tcx.tcx)
|
||||
.find(|(_, var)| var.val == real_discr),
|
||||
ty::Generator(def_id, substs, _) => {
|
||||
let substs = substs.as_generator();
|
||||
substs
|
||||
.discriminants(def_id, self.tcx.tcx)
|
||||
.find(|(_, var)| var.val == real_discr)
|
||||
}
|
||||
_ => bug!("tagged layout for non-adt non-generator"),
|
||||
|
||||
}.ok_or_else(
|
||||
|| err_unsup!(InvalidDiscriminant(raw_discr.erase_tag()))
|
||||
)?;
|
||||
|
|
|
@ -169,7 +169,7 @@ fn build_drop_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option<Ty<'tcx>>)
|
|||
// Check if this is a generator, if so, return the drop glue for it
|
||||
if let Some(&ty::TyS { kind: ty::Generator(gen_def_id, substs, _), .. }) = ty {
|
||||
let body = &**tcx.optimized_mir(gen_def_id).generator_drop.as_ref().unwrap();
|
||||
return body.subst(tcx, substs.substs);
|
||||
return body.subst(tcx, substs);
|
||||
}
|
||||
|
||||
let substs = if let Some(ty) = ty {
|
||||
|
|
|
@ -1126,6 +1126,7 @@ impl<'tcx> MirPass<'tcx> for StateTransform {
|
|||
// Get the interior types and substs which typeck computed
|
||||
let (upvars, interior, discr_ty, movable) = match gen_ty.kind {
|
||||
ty::Generator(_, substs, movability) => {
|
||||
let substs = substs.as_generator();
|
||||
(substs.upvar_tys(def_id, tcx).collect(),
|
||||
substs.witness(def_id, tcx),
|
||||
substs.discr_ty(tcx),
|
||||
|
|
|
@ -798,7 +798,7 @@ where
|
|||
// It effetively only contains upvars until the generator transformation runs.
|
||||
// See librustc_body/transform/generator.rs for more details.
|
||||
ty::Generator(def_id, substs, _) => {
|
||||
let tys : Vec<_> = substs.upvar_tys(def_id, self.tcx()).collect();
|
||||
let tys : Vec<_> = substs.as_generator().upvar_tys(def_id, self.tcx()).collect();
|
||||
self.open_drop_for_tuple(&tys)
|
||||
}
|
||||
ty::Tuple(..) => {
|
||||
|
|
|
@ -223,7 +223,7 @@ fn dtorck_constraint_for_ty<'tcx>(
|
|||
// *do* incorporate the upvars here.
|
||||
|
||||
let constraint = DtorckConstraint {
|
||||
outlives: substs.upvar_tys(def_id, tcx).map(|t| t.into()).collect(),
|
||||
outlives: substs.as_generator().upvar_tys(def_id, tcx).map(|t| t.into()).collect(),
|
||||
dtorck_types: vec![],
|
||||
overflows: vec![],
|
||||
};
|
||||
|
|
|
@ -73,7 +73,9 @@ crate fn closure(tcx: TyCtxt<'tcx>, def_id: DefId) -> Ty<'tcx> {
|
|||
}
|
||||
|
||||
crate fn generator(tcx: TyCtxt<'tcx>, def_id: DefId) -> Ty<'tcx> {
|
||||
tcx.mk_generator(def_id, ty::GeneratorSubsts {
|
||||
substs: InternalSubsts::bound_vars_for_item(tcx, def_id),
|
||||
}, hir::GeneratorMovability::Movable)
|
||||
tcx.mk_generator(
|
||||
def_id,
|
||||
InternalSubsts::bound_vars_for_item(tcx, def_id),
|
||||
hir::GeneratorMovability::Movable
|
||||
)
|
||||
}
|
||||
|
|
|
@ -113,21 +113,21 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
});
|
||||
if let Some(GeneratorTypes { yield_ty, interior, movability }) = generator_types {
|
||||
let substs = ty::GeneratorSubsts { substs };
|
||||
let generator_substs = substs.as_generator();
|
||||
self.demand_eqtype(
|
||||
expr.span,
|
||||
yield_ty,
|
||||
substs.yield_ty(expr_def_id, self.tcx),
|
||||
generator_substs.yield_ty(expr_def_id, self.tcx),
|
||||
);
|
||||
self.demand_eqtype(
|
||||
expr.span,
|
||||
liberated_sig.output(),
|
||||
substs.return_ty(expr_def_id, self.tcx),
|
||||
generator_substs.return_ty(expr_def_id, self.tcx),
|
||||
);
|
||||
self.demand_eqtype(
|
||||
expr.span,
|
||||
interior,
|
||||
substs.witness(expr_def_id, self.tcx),
|
||||
generator_substs.witness(expr_def_id, self.tcx),
|
||||
);
|
||||
return self.tcx.mk_generator(expr_def_id, substs, movability);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue