diff options
| author | Jack Huey <31162821+jackh726@users.noreply.github.com> | 2022-08-02 22:44:08 -0400 |
|---|---|---|
| committer | Jack Huey <31162821+jackh726@users.noreply.github.com> | 2022-08-02 22:44:08 -0400 |
| commit | e21624dc80a455ecbd7de6d45524becf20b35ed2 (patch) | |
| tree | f02c2b8c424e92d606b79eb6ef4edd706064effe | |
| parent | 4493a0f4724c0bae1436242d76cccc9c0a287b80 (diff) | |
| download | rust-e21624dc80a455ecbd7de6d45524becf20b35ed2.tar.gz rust-e21624dc80a455ecbd7de6d45524becf20b35ed2.zip | |
Add bound_predicates_of and bound_explicit_predicates_of
| -rw-r--r-- | compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs | 32 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/util.rs | 14 | ||||
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/select/mod.rs | 10 | ||||
| -rw-r--r-- | compiler/rustc_traits/src/chalk/db.rs | 31 | ||||
| -rw-r--r-- | compiler/rustc_typeck/src/check/wfcheck.rs | 13 |
5 files changed, 58 insertions, 42 deletions
diff --git a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs index 5da260f980f..994a4d7d3c1 100644 --- a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs +++ b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs @@ -16,9 +16,7 @@ use rustc_middle::mir::{ FakeReadCause, LocalDecl, LocalInfo, LocalKind, Location, Operand, Place, PlaceRef, ProjectionElem, Rvalue, Statement, StatementKind, Terminator, TerminatorKind, VarBindingForm, }; -use rustc_middle::ty::{ - self, subst::Subst, suggest_constraining_type_params, EarlyBinder, PredicateKind, Ty, -}; +use rustc_middle::ty::{self, subst::Subst, suggest_constraining_type_params, PredicateKind, Ty}; use rustc_mir_dataflow::move_paths::{InitKind, MoveOutIndex, MovePathIndex}; use rustc_span::def_id::LocalDefId; use rustc_span::hygiene::DesugaringKind; @@ -461,23 +459,24 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let tcx = self.infcx.tcx; // Find out if the predicates show that the type is a Fn or FnMut - let find_fn_kind_from_did = |predicates: &[(ty::Predicate<'tcx>, Span)], substs| { - predicates.iter().find_map(|(pred, _)| { - let pred = if let Some(substs) = substs { - EarlyBinder(*pred).subst(tcx, substs).kind().skip_binder() - } else { - pred.kind().skip_binder() - }; - if let ty::PredicateKind::Trait(pred) = pred && pred.self_ty() == ty { + let find_fn_kind_from_did = + |predicates: ty::EarlyBinder<&[(ty::Predicate<'tcx>, Span)]>, substs| { + predicates.0.iter().find_map(|(pred, _)| { + let pred = if let Some(substs) = substs { + predicates.rebind(*pred).subst(tcx, substs).kind().skip_binder() + } else { + pred.kind().skip_binder() + }; + if let ty::PredicateKind::Trait(pred) = pred && pred.self_ty() == ty { if Some(pred.def_id()) == tcx.lang_items().fn_trait() { return Some(hir::Mutability::Not); } else if Some(pred.def_id()) == tcx.lang_items().fn_mut_trait() { return Some(hir::Mutability::Mut); } } - None - }) - }; + None + }) + }; // If the type is opaque/param/closure, and it is Fn or FnMut, let's suggest (mutably) // borrowing the type, since `&mut F: FnMut` iff `F: FnMut` and similarly for `Fn`. @@ -485,11 +484,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // borrowed variants in a function body when we see a move error. let borrow_level = match ty.kind() { ty::Param(_) => find_fn_kind_from_did( - tcx.explicit_predicates_of(self.mir_def_id().to_def_id()).predicates, + tcx.bound_explicit_predicates_of(self.mir_def_id().to_def_id()) + .map_bound(|p| p.predicates), None, ), ty::Opaque(did, substs) => { - find_fn_kind_from_did(tcx.explicit_item_bounds(*did), Some(*substs)) + find_fn_kind_from_did(tcx.bound_explicit_item_bounds(*did), Some(*substs)) } ty::Closure(_, substs) => match substs.as_closure().kind() { ty::ClosureKind::Fn => Some(hir::Mutability::Not), diff --git a/compiler/rustc_middle/src/ty/util.rs b/compiler/rustc_middle/src/ty/util.rs index 4b5bf80c071..77c78911627 100644 --- a/compiler/rustc_middle/src/ty/util.rs +++ b/compiler/rustc_middle/src/ty/util.rs @@ -680,6 +680,20 @@ impl<'tcx> TyCtxt<'tcx> { pub fn bound_const_param_default(self, def_id: DefId) -> ty::EarlyBinder<ty::Const<'tcx>> { ty::EarlyBinder(self.const_param_default(def_id)) } + + pub fn bound_predicates_of( + self, + def_id: DefId, + ) -> ty::EarlyBinder<ty::generics::GenericPredicates<'tcx>> { + ty::EarlyBinder(self.predicates_of(def_id)) + } + + pub fn bound_explicit_predicates_of( + self, + def_id: DefId, + ) -> ty::EarlyBinder<ty::generics::GenericPredicates<'tcx>> { + ty::EarlyBinder(self.explicit_predicates_of(def_id)) + } } struct OpaqueTypeExpander<'tcx> { diff --git a/compiler/rustc_trait_selection/src/traits/select/mod.rs b/compiler/rustc_trait_selection/src/traits/select/mod.rs index 17f34012d1d..155c1289876 100644 --- a/compiler/rustc_trait_selection/src/traits/select/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/select/mod.rs @@ -2356,11 +2356,11 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // obligation will normalize to `<$0 as Iterator>::Item = $1` and // `$1: Copy`, so we must ensure the obligations are emitted in // that order. - let predicates = tcx.predicates_of(def_id); + let predicates = tcx.bound_predicates_of(def_id); debug!(?predicates); - assert_eq!(predicates.parent, None); - let mut obligations = Vec::with_capacity(predicates.predicates.len()); - for (predicate, span) in predicates.predicates { + assert_eq!(predicates.0.parent, None); + let mut obligations = Vec::with_capacity(predicates.0.predicates.len()); + for (predicate, span) in predicates.0.predicates { let span = *span; let cause = cause.clone().derived_cause(parent_trait_pred, |derived| { ImplDerivedObligation(Box::new(ImplDerivedObligationCause { @@ -2374,7 +2374,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { param_env, cause.clone(), recursion_depth, - EarlyBinder(*predicate).subst(tcx, substs), + predicates.rebind(*predicate).subst(tcx, substs), &mut obligations, ); obligations.push(Obligation { cause, recursion_depth, param_env, predicate }); diff --git a/compiler/rustc_traits/src/chalk/db.rs b/compiler/rustc_traits/src/chalk/db.rs index 14a60ace441..ff5ca0cbcb7 100644 --- a/compiler/rustc_traits/src/chalk/db.rs +++ b/compiler/rustc_traits/src/chalk/db.rs @@ -51,11 +51,11 @@ impl<'tcx> RustIrDatabase<'tcx> { where ty::Predicate<'tcx>: LowerInto<'tcx, std::option::Option<T>>, { - self.interner - .tcx - .explicit_item_bounds(def_id) + let bounds = self.interner.tcx.bound_explicit_item_bounds(def_id); + bounds + .0 .iter() - .map(|(bound, _)| EarlyBinder(*bound).subst(self.interner.tcx, &bound_vars)) + .map(|(bound, _)| bounds.rebind(*bound).subst(self.interner.tcx, &bound_vars)) .filter_map(|bound| LowerInto::<Option<_>>::lower_into(bound, self.interner)) .collect() } @@ -268,21 +268,20 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t let where_clauses = self.where_clauses_for(def_id, bound_vars); - let sig = self.interner.tcx.fn_sig(def_id); + let sig = self.interner.tcx.bound_fn_sig(def_id); let (inputs_and_output, iobinders, _) = crate::chalk::lowering::collect_bound_vars( self.interner, self.interner.tcx, - EarlyBinder(sig.inputs_and_output()).subst(self.interner.tcx, bound_vars), + sig.map_bound(|s| s.inputs_and_output()).subst(self.interner.tcx, bound_vars), ); let argument_types = inputs_and_output[..inputs_and_output.len() - 1] .iter() - .map(|t| { - EarlyBinder(*t).subst(self.interner.tcx, &bound_vars).lower_into(self.interner) - }) + .map(|t| sig.rebind(*t).subst(self.interner.tcx, &bound_vars).lower_into(self.interner)) .collect(); - let return_type = EarlyBinder(inputs_and_output[inputs_and_output.len() - 1]) + let return_type = sig + .rebind(inputs_and_output[inputs_and_output.len() - 1]) .subst(self.interner.tcx, &bound_vars) .lower_into(self.interner); @@ -295,7 +294,7 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t }; Arc::new(chalk_solve::rust_ir::FnDefDatum { id: fn_def_id, - sig: sig.lower_into(self.interner), + sig: sig.0.lower_into(self.interner), binders: chalk_ir::Binders::new(binders, bound), }) } @@ -503,12 +502,14 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t let identity_substs = InternalSubsts::identity_for_item(self.interner.tcx, opaque_ty_id.0); + let explicit_item_bounds = self.interner.tcx.bound_explicit_item_bounds(opaque_ty_id.0); let bounds = - self.interner - .tcx - .explicit_item_bounds(opaque_ty_id.0) + explicit_item_bounds + .0 .iter() - .map(|(bound, _)| EarlyBinder(*bound).subst(self.interner.tcx, &bound_vars)) + .map(|(bound, _)| { + explicit_item_bounds.rebind(*bound).subst(self.interner.tcx, &bound_vars) + }) .map(|bound| { bound.fold_with(&mut ReplaceOpaqueTyFolder { tcx: self.interner.tcx, diff --git a/compiler/rustc_typeck/src/check/wfcheck.rs b/compiler/rustc_typeck/src/check/wfcheck.rs index 95f32711225..d0334cd0df7 100644 --- a/compiler/rustc_typeck/src/check/wfcheck.rs +++ b/compiler/rustc_typeck/src/check/wfcheck.rs @@ -15,8 +15,8 @@ use rustc_middle::ty::query::Providers; use rustc_middle::ty::subst::{GenericArgKind, InternalSubsts, Subst}; use rustc_middle::ty::trait_def::TraitSpecializationKind; use rustc_middle::ty::{ - self, AdtKind, DefIdTree, EarlyBinder, GenericParamDefKind, ToPredicate, Ty, TyCtxt, - TypeFoldable, TypeSuperVisitable, TypeVisitable, TypeVisitor, + self, AdtKind, DefIdTree, GenericParamDefKind, ToPredicate, Ty, TyCtxt, TypeFoldable, + TypeSuperVisitable, TypeVisitable, TypeVisitor, }; use rustc_session::parse::feature_err; use rustc_span::symbol::{sym, Ident, Symbol}; @@ -1295,7 +1295,7 @@ fn check_where_clauses<'tcx>(wfcx: &WfCheckingCtxt<'_, 'tcx>, span: Span, def_id let infcx = wfcx.infcx; let tcx = wfcx.tcx(); - let predicates = tcx.predicates_of(def_id); + let predicates = tcx.bound_predicates_of(def_id.to_def_id()); let generics = tcx.generics_of(def_id); let is_our_default = |def: &ty::GenericParamDef| match def.kind { @@ -1392,6 +1392,7 @@ fn check_where_clauses<'tcx>(wfcx: &WfCheckingCtxt<'_, 'tcx>, span: Span, def_id // Now we build the substituted predicates. let default_obligations = predicates + .0 .predicates .iter() .flat_map(|&(pred, sp)| { @@ -1422,7 +1423,7 @@ fn check_where_clauses<'tcx>(wfcx: &WfCheckingCtxt<'_, 'tcx>, span: Span, def_id } let mut param_count = CountParams::default(); let has_region = pred.visit_with(&mut param_count).is_break(); - let substituted_pred = EarlyBinder(pred).subst(tcx, substs); + let substituted_pred = predicates.rebind(pred).subst(tcx, substs); // Don't check non-defaulted params, dependent defaults (including lifetimes) // or preds with multiple params. if substituted_pred.has_param_types_or_consts() @@ -1430,7 +1431,7 @@ fn check_where_clauses<'tcx>(wfcx: &WfCheckingCtxt<'_, 'tcx>, span: Span, def_id || has_region { None - } else if predicates.predicates.iter().any(|&(p, _)| p == substituted_pred) { + } else if predicates.0.predicates.iter().any(|&(p, _)| p == substituted_pred) { // Avoid duplication of predicates that contain no parameters, for example. None } else { @@ -1456,7 +1457,7 @@ fn check_where_clauses<'tcx>(wfcx: &WfCheckingCtxt<'_, 'tcx>, span: Span, def_id traits::Obligation::new(cause, wfcx.param_env, pred) }); - let predicates = predicates.instantiate_identity(tcx); + let predicates = predicates.0.instantiate_identity(tcx); let predicates = wfcx.normalize(span, None, predicates); |
