diff options
| author | Jack Huey <jack.huey@umassmed.edu> | 2020-10-16 14:04:11 -0400 |
|---|---|---|
| committer | Jack Huey <jack.huey@umassmed.edu> | 2020-10-16 14:29:21 -0400 |
| commit | eba10270c6b7927672da6e73f58ec80afff4a2d6 (patch) | |
| tree | 22b77f17a36e782e103460d300e8cfc8d3c9ffe8 /compiler/rustc_trait_selection/src | |
| parent | 11d62aa2849b48b850c412cc7ce20d8a60a74ab8 (diff) | |
map_bound_ref -> rebind
Diffstat (limited to 'compiler/rustc_trait_selection/src')
5 files changed, 32 insertions, 37 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/auto_trait.rs b/compiler/rustc_trait_selection/src/traits/auto_trait.rs index 96a0c339e18..867ecea04e4 100644 --- a/compiler/rustc_trait_selection/src/traits/auto_trait.rs +++ b/compiler/rustc_trait_selection/src/traits/auto_trait.rs @@ -651,10 +651,10 @@ impl AutoTraitFinder<'tcx> { { self.add_user_pred(computed_preds, predicate); } - predicates.push_back(bound_predicate.map_bound_ref(|_| p)); + predicates.push_back(bound_predicate.rebind(p)); } ty::PredicateAtom::Projection(p) => { - let p = bound_predicate.map_bound_ref(|_| p); + let p = bound_predicate.rebind(p); debug!( "evaluate_nested_obligations: examining projection predicate {:?}", predicate @@ -784,13 +784,13 @@ impl AutoTraitFinder<'tcx> { } } ty::PredicateAtom::RegionOutlives(binder) => { - let binder = bound_predicate.map_bound_ref(|_| binder); + let binder = bound_predicate.rebind(binder); if select.infcx().region_outlives_predicate(&dummy_cause, binder).is_err() { return false; } } ty::PredicateAtom::TypeOutlives(binder) => { - let binder = bound_predicate.map_bound_ref(|_| binder); + let binder = bound_predicate.rebind(binder); match ( binder.no_bound_vars(), binder.map_bound_ref(|pred| pred.0).no_bound_vars(), diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs index 3c4394e7d03..2b95da4c5b9 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs @@ -258,7 +258,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { let bound_predicate = obligation.predicate.bound_atom(self.tcx); match bound_predicate.skip_binder() { ty::PredicateAtom::Trait(trait_predicate, _) => { - let trait_predicate = bound_predicate.map_bound_ref(|_| trait_predicate); + let trait_predicate = bound_predicate.rebind(trait_predicate); let trait_predicate = self.resolve_vars_if_possible(&trait_predicate); if self.tcx.sess.has_errors() && trait_predicate.references_error() { @@ -532,7 +532,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { } ty::PredicateAtom::RegionOutlives(predicate) => { - let predicate = bound_predicate.map_bound_ref(|_| predicate); + let predicate = bound_predicate.rebind(predicate); let predicate = self.resolve_vars_if_possible(&predicate); let err = self .region_outlives_predicate(&obligation.cause, predicate) @@ -1082,7 +1082,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> { let bound_error = error.bound_atom(self.tcx); let (cond, error) = match (cond.skip_binders(), bound_error.skip_binder()) { (ty::PredicateAtom::Trait(..), ty::PredicateAtom::Trait(error, _)) => { - (cond, bound_error.map_bound_ref(|_| error)) + (cond, bound_error.rebind(error)) } _ => { // FIXME: make this work in other cases too. @@ -1094,7 +1094,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> { let bound_predicate = obligation.predicate.bound_atom(self.tcx); if let ty::PredicateAtom::Trait(implication, _) = bound_predicate.skip_binder() { let error = error.to_poly_trait_ref(); - let implication = bound_predicate.map_bound_ref(|_| implication.trait_ref); + let implication = bound_predicate.rebind(implication.trait_ref); // FIXME: I'm just not taking associated types at all here. // Eventually I'll need to implement param-env-aware // `Γ₁ ⊦ φ₁ => Γ₂ ⊦ φ₂` logic. @@ -1178,7 +1178,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> { let (data, _) = self.replace_bound_vars_with_fresh_vars( obligation.cause.span, infer::LateBoundRegionConversionTime::HigherRankedType, - &bound_predicate.map_bound_ref(|_| data), + &bound_predicate.rebind(data), ); let mut obligations = vec![]; let normalized_ty = super::normalize_projection_type( @@ -1463,7 +1463,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> { let mut err = match bound_predicate.skip_binder() { ty::PredicateAtom::Trait(data, _) => { let self_ty = data.trait_ref.self_ty(); - let trait_ref = bound_predicate.map_bound_ref(|_| data.trait_ref); + let trait_ref = bound_predicate.rebind(data.trait_ref); debug!("self_ty {:?} {:?} trait_ref {:?}", self_ty, self_ty.kind(), trait_ref); if predicate.references_error() { @@ -1587,7 +1587,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> { self.emit_inference_failure_err(body_id, span, a.into(), ErrorCode::E0282) } ty::PredicateAtom::Projection(data) => { - let trait_ref = bound_predicate.map_bound_ref(|_| data).to_poly_trait_ref(self.tcx); + let trait_ref = bound_predicate.rebind(data).to_poly_trait_ref(self.tcx); let self_ty = trait_ref.skip_binder().self_ty(); let ty = data.ty; if predicate.references_error() { diff --git a/compiler/rustc_trait_selection/src/traits/fulfill.rs b/compiler/rustc_trait_selection/src/traits/fulfill.rs index 01217457eb4..495a250be7c 100644 --- a/compiler/rustc_trait_selection/src/traits/fulfill.rs +++ b/compiler/rustc_trait_selection/src/traits/fulfill.rs @@ -353,7 +353,7 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> { // This means we need to pass it the bound version of our // predicate. ty::PredicateAtom::Trait(trait_ref, _constness) => { - let trait_obligation = obligation.with(binder.map_bound_ref(|_| trait_ref)); + let trait_obligation = obligation.with(binder.rebind(trait_ref)); self.process_trait_obligation( obligation, @@ -362,7 +362,7 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> { ) } ty::PredicateAtom::Projection(data) => { - let project_obligation = obligation.with(binder.map_bound_ref(|_| data)); + let project_obligation = obligation.with(binder.rebind(data)); self.process_projection_obligation( project_obligation, diff --git a/compiler/rustc_trait_selection/src/traits/project.rs b/compiler/rustc_trait_selection/src/traits/project.rs index 295ba6041fb..63e1fe4a38a 100644 --- a/compiler/rustc_trait_selection/src/traits/project.rs +++ b/compiler/rustc_trait_selection/src/traits/project.rs @@ -634,9 +634,9 @@ fn prune_cache_value_obligations<'a, 'tcx>( // indirect obligations (e.g., we project to `?0`, // but we have `T: Foo<X = ?1>` and `?1: Bar<X = // ?0>`). - ty::PredicateAtom::Projection(data) => infcx - .unresolved_type_vars(&bound_predicate.map_bound_ref(|_| data.ty)) - .is_some(), + ty::PredicateAtom::Projection(data) => { + infcx.unresolved_type_vars(&bound_predicate.rebind(data.ty)).is_some() + } // We are only interested in `T: Foo<X = U>` predicates, whre // `U` references one of `unresolved_type_vars`. =) @@ -910,7 +910,7 @@ fn assemble_candidates_from_predicates<'cx, 'tcx>( debug!(?predicate); let bound_predicate = predicate.bound_atom(infcx.tcx); if let ty::PredicateAtom::Projection(data) = predicate.skip_binders() { - let data = bound_predicate.map_bound_ref(|_| data); + let data = bound_predicate.rebind(data); let same_def_id = data.projection_def_id() == obligation.predicate.item_def_id; let is_match = same_def_id diff --git a/compiler/rustc_trait_selection/src/traits/select/mod.rs b/compiler/rustc_trait_selection/src/traits/select/mod.rs index 29c9c29d208..d0f1af253eb 100644 --- a/compiler/rustc_trait_selection/src/traits/select/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/select/mod.rs @@ -449,17 +449,18 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } let result = ensure_sufficient_stack(|| { - let bound_predicate = obligation.predicate.bound_atom(self.infcx().tcx); + let bound_predicate = + obligation.predicate.bound_atom_with_opt_escaping(self.infcx().tcx); match bound_predicate.skip_binder() { ty::PredicateAtom::Trait(t, _) => { - let t = bound_predicate.map_bound_ref(|_| t); + let t = bound_predicate.rebind(t); debug_assert!(!t.has_escaping_bound_vars()); let obligation = obligation.with(t); self.evaluate_trait_predicate_recursively(previous_stack, obligation) } ty::PredicateAtom::Subtype(p) => { - let p = bound_predicate.map_bound_ref(|_| p); + let p = bound_predicate.rebind(p); // Does this code ever run? match self.infcx.subtype_predicate(&obligation.cause, obligation.param_env, p) { Some(Ok(InferOk { mut obligations, .. })) => { @@ -503,7 +504,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } ty::PredicateAtom::Projection(data) => { - let data = bound_predicate.map_bound_ref(|_| data); + let data = bound_predicate.rebind(data); let project_obligation = obligation.with(data); match project::poly_project_and_unify_type(self, &project_obligation) { Ok(Ok(Some(mut subobligations))) => { @@ -1177,7 +1178,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { .filter_map(|(idx, bound)| { let bound_predicate = bound.bound_atom(self.infcx.tcx); if let ty::PredicateAtom::Trait(pred, _) = bound_predicate.skip_binder() { - let bound = bound_predicate.map_bound_ref(|_| pred.trait_ref); + let bound = bound_predicate.rebind(pred.trait_ref); if self.infcx.probe(|_| { match self.match_projection( obligation, @@ -1534,15 +1535,17 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ty::Tuple(tys) => Where( obligation .predicate - .map_bound_ref(|_| tys.last().into_iter().map(|k| k.expect_ty()).collect()), + .rebind(tys.last().into_iter().map(|k| k.expect_ty()).collect()), ), ty::Adt(def, substs) => { let sized_crit = def.sized_constraint(self.tcx()); // (*) binder moved here - Where(obligation.predicate.map_bound_ref(|_| { - sized_crit.iter().map(|ty| ty.subst(self.tcx(), substs)).collect() - })) + Where( + obligation.predicate.rebind({ + sized_crit.iter().map(|ty| ty.subst(self.tcx(), substs)).collect() + }), + ) } ty::Projection(_) | ty::Param(_) | ty::Opaque(..) => None, @@ -1594,16 +1597,12 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ty::Array(element_ty, _) => { // (*) binder moved here - Where(obligation.predicate.map_bound_ref(|_| vec![*element_ty])) + Where(obligation.predicate.rebind(vec![*element_ty])) } ty::Tuple(tys) => { // (*) binder moved here - Where( - obligation - .predicate - .map_bound_ref(|_| tys.iter().map(|k| k.expect_ty()).collect()), - ) + Where(obligation.predicate.rebind(tys.iter().map(|k| k.expect_ty()).collect())) } ty::Closure(_, substs) => { @@ -1613,11 +1612,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // Not yet resolved. Ambiguous } else { - Where( - obligation - .predicate - .map_bound_ref(|_| substs.as_closure().upvar_tys().collect()), - ) + Where(obligation.predicate.rebind(substs.as_closure().upvar_tys().collect())) } } |
