1
Fork 0

Make ObligationCtxt::normalize take cause by borrow

This commit is contained in:
Michael Goulet 2022-11-25 18:40:52 +00:00
parent ce409b5200
commit 1e236acd05
11 changed files with 27 additions and 29 deletions

View file

@ -295,7 +295,7 @@ where
// the former fails to normalize the `nll/relate_tys/impl-fn-ignore-binder-via-bottom.rs` test. // the former fails to normalize the `nll/relate_tys/impl-fn-ignore-binder-via-bottom.rs` test.
// Check after #85499 lands to see if its fixes have erased this difference. // Check after #85499 lands to see if its fixes have erased this difference.
let (param_env, value) = key.into_parts(); let (param_env, value) = key.into_parts();
let _ = ocx.normalize(cause, param_env, value.value); let _ = ocx.normalize(&cause, param_env, value.value);
try_extract_error_from_fulfill_cx(&ocx, placeholder_region, error_region) try_extract_error_from_fulfill_cx(&ocx, placeholder_region, error_region)
} }

View file

@ -761,8 +761,7 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
hir_id, hir_id,
ObligationCauseCode::ItemObligation(callee), ObligationCauseCode::ItemObligation(callee),
); );
let normalized_predicates = let normalized_predicates = ocx.normalize(&cause, param_env, predicates);
ocx.normalize(cause.clone(), param_env, predicates);
ocx.register_obligations(traits::predicates_for_generics( ocx.register_obligations(traits::predicates_for_generics(
|_, _| cause.clone(), |_, _| cause.clone(),
self.param_env, self.param_env,

View file

@ -46,8 +46,8 @@ pub fn is_subtype<'tcx>(
let infcx = builder.build(); let infcx = builder.build();
let ocx = ObligationCtxt::new(&infcx); let ocx = ObligationCtxt::new(&infcx);
let cause = ObligationCause::dummy(); let cause = ObligationCause::dummy();
let src = ocx.normalize(cause.clone(), param_env, src); let src = ocx.normalize(&cause, param_env, src);
let dest = ocx.normalize(cause.clone(), param_env, dest); let dest = ocx.normalize(&cause, param_env, dest);
match ocx.sub(&cause, param_env, src, dest) { match ocx.sub(&cause, param_env, src, dest) {
Ok(()) => {} Ok(()) => {}
Err(_) => return false, Err(_) => return false,

View file

@ -221,7 +221,7 @@ fn compare_predicate_entailment<'tcx>(
let impl_m_own_bounds = impl_m_predicates.instantiate_own(tcx, impl_to_placeholder_substs); let impl_m_own_bounds = impl_m_predicates.instantiate_own(tcx, impl_to_placeholder_substs);
for (predicate, span) in iter::zip(impl_m_own_bounds.predicates, impl_m_own_bounds.spans) { for (predicate, span) in iter::zip(impl_m_own_bounds.predicates, impl_m_own_bounds.spans) {
let normalize_cause = traits::ObligationCause::misc(span, impl_m_hir_id); let normalize_cause = traits::ObligationCause::misc(span, impl_m_hir_id);
let predicate = ocx.normalize(normalize_cause, param_env, predicate); let predicate = ocx.normalize(&normalize_cause, param_env, predicate);
let cause = ObligationCause::new( let cause = ObligationCause::new(
span, span,
@ -260,7 +260,7 @@ fn compare_predicate_entailment<'tcx>(
); );
let norm_cause = ObligationCause::misc(impl_m_span, impl_m_hir_id); let norm_cause = ObligationCause::misc(impl_m_span, impl_m_hir_id);
let impl_sig = ocx.normalize(norm_cause.clone(), param_env, impl_sig); let impl_sig = ocx.normalize(&norm_cause, param_env, impl_sig);
let impl_fty = tcx.mk_fn_ptr(ty::Binder::dummy(impl_sig)); let impl_fty = tcx.mk_fn_ptr(ty::Binder::dummy(impl_sig));
debug!("compare_impl_method: impl_fty={:?}", impl_fty); debug!("compare_impl_method: impl_fty={:?}", impl_fty);
@ -271,7 +271,7 @@ fn compare_predicate_entailment<'tcx>(
// we have to do this before normalization, since the normalized ty may // we have to do this before normalization, since the normalized ty may
// not contain the input parameters. See issue #87748. // not contain the input parameters. See issue #87748.
wf_tys.extend(trait_sig.inputs_and_output.iter()); wf_tys.extend(trait_sig.inputs_and_output.iter());
let trait_sig = ocx.normalize(norm_cause, param_env, trait_sig); let trait_sig = ocx.normalize(&norm_cause, param_env, trait_sig);
// We also have to add the normalized trait signature // We also have to add the normalized trait signature
// as we don't normalize during implied bounds computation. // as we don't normalize during implied bounds computation.
wf_tys.extend(trait_sig.inputs_and_output.iter()); wf_tys.extend(trait_sig.inputs_and_output.iter());
@ -366,7 +366,7 @@ pub fn collect_trait_impl_trait_tys<'tcx>(
// Normalize the impl signature with fresh variables for lifetime inference. // Normalize the impl signature with fresh variables for lifetime inference.
let norm_cause = ObligationCause::misc(return_span, impl_m_hir_id); let norm_cause = ObligationCause::misc(return_span, impl_m_hir_id);
let impl_sig = ocx.normalize( let impl_sig = ocx.normalize(
norm_cause.clone(), &norm_cause,
param_env, param_env,
infcx.replace_bound_vars_with_fresh_vars( infcx.replace_bound_vars_with_fresh_vars(
return_span, return_span,
@ -387,7 +387,7 @@ pub fn collect_trait_impl_trait_tys<'tcx>(
tcx.bound_fn_sig(trait_m.def_id).subst(tcx, trait_to_placeholder_substs), tcx.bound_fn_sig(trait_m.def_id).subst(tcx, trait_to_placeholder_substs),
) )
.fold_with(&mut collector); .fold_with(&mut collector);
let trait_sig = ocx.normalize(norm_cause.clone(), param_env, unnormalized_trait_sig); let trait_sig = ocx.normalize(&norm_cause, param_env, unnormalized_trait_sig);
let trait_return_ty = trait_sig.output(); let trait_return_ty = trait_sig.output();
let wf_tys = FxIndexSet::from_iter( let wf_tys = FxIndexSet::from_iter(
@ -592,7 +592,7 @@ impl<'tcx> TypeFolder<'tcx> for ImplTraitInTraitCollector<'_, 'tcx> {
for (pred, pred_span) in self.tcx().bound_explicit_item_bounds(proj.item_def_id).subst_iter_copied(self.tcx(), proj.substs) { for (pred, pred_span) in self.tcx().bound_explicit_item_bounds(proj.item_def_id).subst_iter_copied(self.tcx(), proj.substs) {
let pred = pred.fold_with(self); let pred = pred.fold_with(self);
let pred = self.ocx.normalize( let pred = self.ocx.normalize(
ObligationCause::misc(self.span, self.body_id), &ObligationCause::misc(self.span, self.body_id),
self.param_env, self.param_env,
pred, pred,
); );
@ -1403,11 +1403,11 @@ pub(crate) fn raw_compare_const_impl<'tcx>(
); );
// There is no "body" here, so just pass dummy id. // There is no "body" here, so just pass dummy id.
let impl_ty = ocx.normalize(cause.clone(), param_env, impl_ty); let impl_ty = ocx.normalize(&cause, param_env, impl_ty);
debug!("compare_const_impl: impl_ty={:?}", impl_ty); debug!("compare_const_impl: impl_ty={:?}", impl_ty);
let trait_ty = ocx.normalize(cause.clone(), param_env, trait_ty); let trait_ty = ocx.normalize(&cause, param_env, trait_ty);
debug!("compare_const_impl: trait_ty={:?}", trait_ty); debug!("compare_const_impl: trait_ty={:?}", trait_ty);
@ -1556,7 +1556,7 @@ fn compare_type_predicate_entailment<'tcx>(
for (span, predicate) in std::iter::zip(impl_ty_own_bounds.spans, impl_ty_own_bounds.predicates) for (span, predicate) in std::iter::zip(impl_ty_own_bounds.spans, impl_ty_own_bounds.predicates)
{ {
let cause = ObligationCause::misc(span, impl_ty_hir_id); let cause = ObligationCause::misc(span, impl_ty_hir_id);
let predicate = ocx.normalize(cause, param_env, predicate); let predicate = ocx.normalize(&cause, param_env, predicate);
let cause = ObligationCause::new( let cause = ObligationCause::new(
span, span,
@ -1778,7 +1778,7 @@ pub fn check_type_bounds<'tcx>(
for mut obligation in util::elaborate_obligations(tcx, obligations) { for mut obligation in util::elaborate_obligations(tcx, obligations) {
let normalized_predicate = let normalized_predicate =
ocx.normalize(normalize_cause.clone(), normalize_param_env, obligation.predicate); ocx.normalize(&normalize_cause, normalize_param_env, obligation.predicate);
debug!("compare_projection_bounds: normalized predicate = {:?}", normalized_predicate); debug!("compare_projection_bounds: normalized predicate = {:?}", normalized_predicate);
obligation.predicate = normalized_predicate; obligation.predicate = normalized_predicate;

View file

@ -60,7 +60,7 @@ impl<'tcx> WfCheckingCtxt<'_, 'tcx> {
T: TypeFoldable<'tcx>, T: TypeFoldable<'tcx>,
{ {
self.ocx.normalize( self.ocx.normalize(
ObligationCause::new(span, self.body_id, ObligationCauseCode::WellFormed(loc)), &ObligationCause::new(span, self.body_id, ObligationCauseCode::WellFormed(loc)),
self.param_env, self.param_env,
value, value,
) )

View file

@ -332,7 +332,7 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
ObligationCauseCode::MainFunctionType, ObligationCauseCode::MainFunctionType,
); );
let ocx = traits::ObligationCtxt::new(&infcx); let ocx = traits::ObligationCtxt::new(&infcx);
let norm_return_ty = ocx.normalize(cause.clone(), param_env, return_ty); let norm_return_ty = ocx.normalize(&cause, param_env, return_ty);
ocx.register_bound(cause, param_env, norm_return_ty, term_did); ocx.register_bound(cause, param_env, norm_return_ty, term_did);
let errors = ocx.select_all_or_error(); let errors = ocx.select_all_or_error();
if !errors.is_empty() { if !errors.is_empty() {

View file

@ -100,7 +100,7 @@ impl<'tcx> Inherited<'tcx> {
infcx.probe(|_| { infcx.probe(|_| {
let ocx = ObligationCtxt::new_in_snapshot(infcx); let ocx = ObligationCtxt::new_in_snapshot(infcx);
let normalized_fn_sig = ocx.normalize( let normalized_fn_sig = ocx.normalize(
ObligationCause::dummy(), &ObligationCause::dummy(),
// FIXME(compiler-errors): This is probably not the right param-env... // FIXME(compiler-errors): This is probably not the right param-env...
infcx.tcx.param_env(def_id), infcx.tcx.param_env(def_id),
fn_sig, fn_sig,

View file

@ -104,8 +104,7 @@ impl<'a, 'tcx> ObligationCtxt<'a, 'tcx> {
pub fn normalize<T: TypeFoldable<'tcx>>( pub fn normalize<T: TypeFoldable<'tcx>>(
&self, &self,
// FIXME(compiler-errors): Make this borrow cause: &ObligationCause<'tcx>,
cause: ObligationCause<'tcx>,
param_env: ty::ParamEnv<'tcx>, param_env: ty::ParamEnv<'tcx>,
value: T, value: T,
) -> T { ) -> T {
@ -186,7 +185,7 @@ impl<'a, 'tcx> ObligationCtxt<'a, 'tcx> {
// sound and then uncomment this line again. // sound and then uncomment this line again.
// implied_bounds.insert(ty); // implied_bounds.insert(ty);
let normalized = self.normalize(cause.clone(), param_env, ty); let normalized = self.normalize(&cause, param_env, ty);
implied_bounds.insert(normalized); implied_bounds.insert(normalized);
} }
implied_bounds implied_bounds

View file

@ -17,11 +17,11 @@ pub fn recompute_applicable_impls<'tcx>(
let placeholder_obligation = let placeholder_obligation =
infcx.replace_bound_vars_with_placeholders(obligation.predicate); infcx.replace_bound_vars_with_placeholders(obligation.predicate);
let obligation_trait_ref = let obligation_trait_ref =
ocx.normalize(dummy_cause.clone(), param_env, placeholder_obligation.trait_ref); ocx.normalize(&dummy_cause, param_env, placeholder_obligation.trait_ref);
let impl_substs = infcx.fresh_substs_for_item(DUMMY_SP, impl_def_id); let impl_substs = infcx.fresh_substs_for_item(DUMMY_SP, impl_def_id);
let impl_trait_ref = tcx.bound_impl_trait_ref(impl_def_id).unwrap().subst(tcx, impl_substs); let impl_trait_ref = tcx.bound_impl_trait_ref(impl_def_id).unwrap().subst(tcx, impl_substs);
let impl_trait_ref = ocx.normalize(ObligationCause::dummy(), param_env, impl_trait_ref); let impl_trait_ref = ocx.normalize(&ObligationCause::dummy(), param_env, impl_trait_ref);
if let Err(_) = ocx.eq(&dummy_cause, param_env, obligation_trait_ref, impl_trait_ref) { if let Err(_) = ocx.eq(&dummy_cause, param_env, obligation_trait_ref, impl_trait_ref) {
return false; return false;

View file

@ -56,8 +56,8 @@ pub use self::object_safety::astconv_object_safety_violations;
pub use self::object_safety::is_vtable_safe_method; pub use self::object_safety::is_vtable_safe_method;
pub use self::object_safety::MethodViolationCode; pub use self::object_safety::MethodViolationCode;
pub use self::object_safety::ObjectSafetyViolation; pub use self::object_safety::ObjectSafetyViolation;
pub use self::project::{NormalizeExt, normalize_projection_type};
pub(crate) use self::project::{normalize, normalize_to}; pub(crate) use self::project::{normalize, normalize_to};
pub use self::project::{normalize_projection_type, NormalizeExt};
pub use self::select::{EvaluationCache, SelectionCache, SelectionContext}; pub use self::select::{EvaluationCache, SelectionCache, SelectionContext};
pub use self::select::{EvaluationResult, IntercrateAmbiguityCause, OverflowError}; pub use self::select::{EvaluationResult, IntercrateAmbiguityCause, OverflowError};
pub use self::specialize::specialization_graph::FutureCompatOverlapError; pub use self::specialize::specialization_graph::FutureCompatOverlapError;
@ -387,7 +387,7 @@ where
{ {
let ocx = ObligationCtxt::new(infcx); let ocx = ObligationCtxt::new(infcx);
debug!(?value); debug!(?value);
let normalized_value = ocx.normalize(cause, param_env, value); let normalized_value = ocx.normalize(&cause, param_env, value);
debug!(?normalized_value); debug!(?normalized_value);
debug!("select_all_or_error start"); debug!("select_all_or_error start");
let errors = ocx.select_all_or_error(); let errors = ocx.select_all_or_error();
@ -454,7 +454,7 @@ pub fn impossible_predicates<'tcx>(
let infcx = tcx.infer_ctxt().build(); let infcx = tcx.infer_ctxt().build();
let param_env = ty::ParamEnv::reveal_all(); let param_env = ty::ParamEnv::reveal_all();
let ocx = ObligationCtxt::new(&infcx); let ocx = ObligationCtxt::new(&infcx);
let predicates = ocx.normalize(ObligationCause::dummy(), param_env, predicates); let predicates = ocx.normalize(&ObligationCause::dummy(), param_env, predicates);
for predicate in predicates { for predicate in predicates {
let obligation = Obligation::new(tcx, ObligationCause::dummy(), param_env, predicate); let obligation = Obligation::new(tcx, ObligationCause::dummy(), param_env, predicate);
ocx.register_obligation(obligation); ocx.register_obligation(obligation);

View file

@ -62,7 +62,7 @@ pub fn type_op_ascribe_user_type_with_span<'tcx>(
let cause = ObligationCause::dummy_with_span(span); let cause = ObligationCause::dummy_with_span(span);
let ty = tcx.bound_type_of(def_id).subst(tcx, substs); let ty = tcx.bound_type_of(def_id).subst(tcx, substs);
let ty = ocx.normalize(cause.clone(), param_env, ty); let ty = ocx.normalize(&cause, param_env, ty);
debug!("relate_type_and_user_type: ty of def-id is {:?}", ty); debug!("relate_type_and_user_type: ty of def-id is {:?}", ty);
ocx.eq(&cause, param_env, mir_ty, ty)?; ocx.eq(&cause, param_env, mir_ty, ty)?;
@ -85,14 +85,14 @@ pub fn type_op_ascribe_user_type_with_span<'tcx>(
ObligationCauseCode::AscribeUserTypeProvePredicate(predicate_span), ObligationCauseCode::AscribeUserTypeProvePredicate(predicate_span),
); );
let instantiated_predicate = let instantiated_predicate =
ocx.normalize(cause.clone(), param_env, instantiated_predicate); ocx.normalize(&cause.clone(), param_env, instantiated_predicate);
ocx.register_obligation(Obligation::new(tcx, cause, param_env, instantiated_predicate)); ocx.register_obligation(Obligation::new(tcx, cause, param_env, instantiated_predicate));
} }
if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty { if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
let impl_self_ty = tcx.bound_type_of(impl_def_id).subst(tcx, substs); let impl_self_ty = tcx.bound_type_of(impl_def_id).subst(tcx, substs);
let impl_self_ty = ocx.normalize(cause.clone(), param_env, impl_self_ty); let impl_self_ty = ocx.normalize(&cause, param_env, impl_self_ty);
ocx.eq(&cause, param_env, self_ty, impl_self_ty)?; ocx.eq(&cause, param_env, self_ty, impl_self_ty)?;