make ty::Predicate
carry a ClosureSubsts
This commit is contained in:
parent
0ac8542abc
commit
decf3d33d0
8 changed files with 25 additions and 20 deletions
|
@ -236,8 +236,9 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for ty::Predicate<'gcx> {
|
|||
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) => {
|
||||
|
|
|
@ -643,7 +643,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
|||
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();
|
||||
|
|
|
@ -438,7 +438,7 @@ fn process_predicate<'a, 'gcx, 'tcx>(
|
|||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
|
|
|
@ -718,7 +718,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
|
@ -2726,7 +2726,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
|||
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,
|
||||
|
|
|
@ -43,8 +43,8 @@ fn anonymize_predicate<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
|||
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)),
|
||||
|
|
|
@ -896,7 +896,7 @@ pub enum Predicate<'tcx> {
|
|||
/// 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>),
|
||||
|
@ -999,8 +999,8 @@ impl<'a, 'gcx, 'tcx> Predicate<'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)),
|
||||
}
|
||||
|
@ -1182,8 +1182,8 @@ impl<'tcx> Predicate<'tcx> {
|
|||
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()
|
||||
|
|
|
@ -211,8 +211,11 @@ impl<'a, 'tcx> Lift<'tcx> for ty::Predicate<'a> {
|
|||
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))
|
||||
|
@ -966,8 +969,8 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Predicate<'tcx> {
|
|||
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) =>
|
||||
|
@ -984,7 +987,8 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Predicate<'tcx> {
|
|||
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),
|
||||
}
|
||||
|
|
|
@ -1257,7 +1257,7 @@ define_print! {
|
|||
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)
|
||||
|
@ -1281,8 +1281,8 @@ define_print! {
|
|||
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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue