add generator_clone feature gate
This commit is contained in:
parent
2c0bc9444e
commit
0228c073e0
3 changed files with 35 additions and 24 deletions
|
@ -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).
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue