1
Fork 0

add generator_clone feature gate

This commit is contained in:
Andrew Cann 2022-03-13 14:41:44 +08:00 committed by Charles Lew
parent 2c0bc9444e
commit 0228c073e0
3 changed files with 35 additions and 24 deletions

View file

@ -396,6 +396,8 @@ declare_features! (
(active, fn_align, "1.53.0", Some(82232), None), (active, fn_align, "1.53.0", Some(82232), None),
/// Allows defining generators. /// Allows defining generators.
(active, generators, "1.21.0", Some(43122), None), (active, generators, "1.21.0", Some(43122), None),
/// Allows generators to be cloned.
(active, generator_clone, "1.60.0", None, None),
/// Infer generic args for both consts and types. /// Infer generic args for both consts and types.
(active, generic_arg_infer, "1.55.0", Some(85077), None), (active, generic_arg_infer, "1.55.0", Some(85077), None),
/// Allows associated types to be generic, e.g., `type Foo<T>;` (RFC 1598). /// Allows associated types to be generic, e.g., `type Foo<T>;` (RFC 1598).

View file

@ -763,6 +763,7 @@ symbols! {
gen_future, gen_future,
gen_kill, gen_kill,
generator, generator,
generator_clone,
generator_state, generator_state,
generators, generators,
generic_arg_infer, generic_arg_infer,

View file

@ -1938,35 +1938,43 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
} }
ty::Generator(_, substs, hir::Movability::Movable) => { ty::Generator(_, substs, hir::Movability::Movable) => {
let resolved_upvars = self.infcx.shallow_resolve(substs.as_generator().tupled_upvars_ty()); if self.tcx().features().generator_clone {
let resolved_witness = self.infcx.shallow_resolve(substs.as_generator().witness()); let resolved_upvars = self.infcx.shallow_resolve(substs.as_generator().tupled_upvars_ty());
if { let resolved_witness = self.infcx.shallow_resolve(substs.as_generator().witness());
matches!(resolved_upvars.kind(), ty::Infer(ty::TyVar(_))) || if {
matches!(resolved_witness.kind(), ty::Infer(ty::TyVar(_))) matches!(resolved_upvars.kind(), ty::Infer(ty::TyVar(_))) ||
} { matches!(resolved_witness.kind(), ty::Infer(ty::TyVar(_)))
// Not yet resolved. } {
Ambiguous // Not yet resolved.
Ambiguous
} else {
let mut all = substs.as_generator().upvar_tys().collect::<Vec<_>>();
all.push(substs.as_generator().witness());
Where(obligation.predicate.rebind(all))
}
} else { } else {
let mut all = substs.as_generator().upvar_tys().collect::<Vec<_>>(); None
all.push(substs.as_generator().witness());
Where(obligation.predicate.rebind(all))
} }
} }
ty::GeneratorWitness(binder) => { ty::GeneratorWitness(binder) => {
let tys = binder.no_bound_vars().unwrap(); match binder.no_bound_vars() {
let mut iter = tys.iter(); Some(tys) => {
loop { let mut iter = tys.iter();
let ty = match iter.next() { loop {
Some(ty) => ty, let ty = match iter.next() {
Option::None => { Some(ty) => ty,
break Where(obligation.predicate.rebind(tys.to_vec())) Option::None => {
}, break Where(obligation.predicate.rebind(tys.to_vec()))
}; },
let resolved = self.infcx.shallow_resolve(ty); };
if matches!(resolved.kind(), ty::Infer(ty::TyVar(_))) { let resolved = self.infcx.shallow_resolve(ty);
break Ambiguous; if matches!(resolved.kind(), ty::Infer(ty::TyVar(_))) {
} break Ambiguous;
}
}
},
Option::None => None,
} }
} }