ty::Predicate::ObjectSafe(def_id) => {
def_id.hash_stable(hcx, hasher);
}
- ty::Predicate::ClosureKind(def_id, closure_kind) => {
+ ty::Predicate::ClosureKind(def_id, closure_substs, closure_kind) => {
def_id.hash_stable(hcx, hasher);
+ closure_substs.hash_stable(hcx, hasher);
closure_kind.hash_stable(hcx, hasher);
}
ty::Predicate::ConstEvaluatable(def_id, substs) => {
violations)
}
- ty::Predicate::ClosureKind(closure_def_id, kind) => {
+ ty::Predicate::ClosureKind(closure_def_id, _closure_substs, kind) => {
let found_kind = self.closure_kind(closure_def_id).unwrap();
let closure_span = self.tcx.hir.span_if_local(closure_def_id).unwrap();
let node_id = self.tcx.hir.as_local_node_id(closure_def_id).unwrap();
}
}
- ty::Predicate::ClosureKind(closure_def_id, kind) => {
+ ty::Predicate::ClosureKind(closure_def_id, _closure_substs, kind) => {
match selcx.infcx().closure_kind(closure_def_id) {
Some(closure_kind) => {
if closure_kind.extends(kind) {
}
}
- ty::Predicate::ClosureKind(closure_def_id, kind) => {
+ ty::Predicate::ClosureKind(closure_def_id, _closure_substs, kind) => {
match self.infcx.closure_kind(closure_def_id) {
Some(closure_kind) => {
if closure_kind.extends(kind) {
obligations.push(Obligation::new(
obligation.cause.clone(),
obligation.param_env,
- ty::Predicate::ClosureKind(closure_def_id, kind)));
+ ty::Predicate::ClosureKind(closure_def_id, substs, kind)));
Ok(VtableClosureData {
closure_def_id,
ty::Predicate::ObjectSafe(data) =>
ty::Predicate::ObjectSafe(data),
- ty::Predicate::ClosureKind(closure_def_id, kind) =>
- ty::Predicate::ClosureKind(closure_def_id, kind),
+ ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) =>
+ ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind),
ty::Predicate::Subtype(ref data) =>
ty::Predicate::Subtype(tcx.anonymize_late_bound_regions(data)),
/// No direct syntax. May be thought of as `where T : FnFoo<...>`
/// for some substitutions `...` and T being a closure type.
/// Satisfied (or refuted) once we know the closure's kind.
- ClosureKind(DefId, ClosureKind),
+ ClosureKind(DefId, ClosureSubsts<'tcx>, ClosureKind),
/// `T1 <: T2`
Subtype(PolySubtypePredicate<'tcx>),
Predicate::WellFormed(data.subst(tcx, substs)),
Predicate::ObjectSafe(trait_def_id) =>
Predicate::ObjectSafe(trait_def_id),
- Predicate::ClosureKind(closure_def_id, kind) =>
- Predicate::ClosureKind(closure_def_id, kind),
+ Predicate::ClosureKind(closure_def_id, closure_substs, kind) =>
+ Predicate::ClosureKind(closure_def_id, closure_substs.subst(tcx, substs), kind),
Predicate::ConstEvaluatable(def_id, const_substs) =>
Predicate::ConstEvaluatable(def_id, const_substs.subst(tcx, substs)),
}
ty::Predicate::ObjectSafe(_trait_def_id) => {
vec![]
}
- ty::Predicate::ClosureKind(_closure_def_id, _kind) => {
- vec![]
+ ty::Predicate::ClosureKind(_closure_def_id, closure_substs, _kind) => {
+ closure_substs.substs.types().collect()
}
ty::Predicate::ConstEvaluatable(_, substs) => {
substs.types().collect()
ty::Predicate::WellFormed(ty) => {
tcx.lift(&ty).map(ty::Predicate::WellFormed)
}
- ty::Predicate::ClosureKind(closure_def_id, kind) => {
- Some(ty::Predicate::ClosureKind(closure_def_id, kind))
+ ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => {
+ tcx.lift(&closure_substs)
+ .map(|closure_substs| ty::Predicate::ClosureKind(closure_def_id,
+ closure_substs,
+ kind))
}
ty::Predicate::ObjectSafe(trait_def_id) => {
Some(ty::Predicate::ObjectSafe(trait_def_id))
ty::Predicate::Projection(binder.fold_with(folder)),
ty::Predicate::WellFormed(data) =>
ty::Predicate::WellFormed(data.fold_with(folder)),
- ty::Predicate::ClosureKind(closure_def_id, kind) =>
- ty::Predicate::ClosureKind(closure_def_id, kind),
+ ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) =>
+ ty::Predicate::ClosureKind(closure_def_id, closure_substs.fold_with(folder), kind),
ty::Predicate::ObjectSafe(trait_def_id) =>
ty::Predicate::ObjectSafe(trait_def_id),
ty::Predicate::ConstEvaluatable(def_id, substs) =>
ty::Predicate::TypeOutlives(ref binder) => binder.visit_with(visitor),
ty::Predicate::Projection(ref binder) => binder.visit_with(visitor),
ty::Predicate::WellFormed(data) => data.visit_with(visitor),
- ty::Predicate::ClosureKind(_closure_def_id, _kind) => false,
+ ty::Predicate::ClosureKind(_closure_def_id, closure_substs, _kind) =>
+ closure_substs.visit_with(visitor),
ty::Predicate::ObjectSafe(_trait_def_id) => false,
ty::Predicate::ConstEvaluatable(_def_id, substs) => substs.visit_with(visitor),
}
ty::tls::with(|tcx| {
write!(f, "the trait `{}` is object-safe", tcx.item_path_str(trait_def_id))
}),
- ty::Predicate::ClosureKind(closure_def_id, kind) =>
+ ty::Predicate::ClosureKind(closure_def_id, _closure_substs, kind) =>
ty::tls::with(|tcx| {
write!(f, "the closure `{}` implements the trait `{}`",
tcx.item_path_str(closure_def_id), kind)
ty::Predicate::ObjectSafe(trait_def_id) => {
write!(f, "ObjectSafe({:?})", trait_def_id)
}
- ty::Predicate::ClosureKind(closure_def_id, kind) => {
- write!(f, "ClosureKind({:?}, {:?})", closure_def_id, kind)
+ ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => {
+ write!(f, "ClosureKind({:?}, {:?}, {:?})", closure_def_id, closure_substs, kind)
}
ty::Predicate::ConstEvaluatable(def_id, substs) => {
write!(f, "ConstEvaluatable({:?}, {:?})", def_id, substs)