Rollup merge of #144694 - compiler-errors:with-self-ty, r=SparrowLii
Distinguish prepending and replacing self ty in predicates There are two kinds of functions called `with_self_ty`: 1. Prepends the `Self` type onto an `ExistentialPredicate` which lacks it in its internal representation. 2. Replaces the `Self` type of an existing predicate, either for diagnostics purposes or in the new trait solver when normalizing that self type. This PR distinguishes these two because I often want to only grep for one of them. Namely, let's call it `with_replaced_self_ty` when all we're doing is replacing the self type.
This commit is contained in:
@@ -581,7 +581,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||
let trait_args = trait_ref
|
||||
.instantiate_identity()
|
||||
// Replace the explicit self type with `Self` for better suggestion rendering
|
||||
.with_self_ty(self.tcx, Ty::new_param(self.tcx, 0, kw::SelfUpper))
|
||||
.with_replaced_self_ty(self.tcx, Ty::new_param(self.tcx, 0, kw::SelfUpper))
|
||||
.args;
|
||||
let trait_item_args = ty::GenericArgs::identity_for_item(self.tcx, impl_item_def_id)
|
||||
.rebase_onto(self.tcx, impl_def_id, trait_args);
|
||||
|
||||
@@ -512,7 +512,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||
&& self.fallback_has_occurred
|
||||
{
|
||||
let predicate = leaf_trait_predicate.map_bound(|trait_pred| {
|
||||
trait_pred.with_self_ty(self.tcx, tcx.types.unit)
|
||||
trait_pred.with_replaced_self_ty(self.tcx, tcx.types.unit)
|
||||
});
|
||||
let unit_obligation = obligation.with(tcx, predicate);
|
||||
if self.predicate_may_hold(&unit_obligation) {
|
||||
@@ -2364,8 +2364,8 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
trait_ref_and_ty: ty::Binder<'tcx, (ty::TraitPredicate<'tcx>, Ty<'tcx>)>,
|
||||
) -> PredicateObligation<'tcx> {
|
||||
let trait_pred =
|
||||
trait_ref_and_ty.map_bound(|(tr, new_self_ty)| tr.with_self_ty(self.tcx, new_self_ty));
|
||||
let trait_pred = trait_ref_and_ty
|
||||
.map_bound(|(tr, new_self_ty)| tr.with_replaced_self_ty(self.tcx, new_self_ty));
|
||||
|
||||
Obligation::new(self.tcx, ObligationCause::dummy(), param_env, trait_pred)
|
||||
}
|
||||
|
||||
@@ -3942,7 +3942,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||
if let hir::Expr { kind: hir::ExprKind::MethodCall(_, rcvr, _, _), .. } = expr
|
||||
&& let Some(ty) = typeck_results.node_type_opt(rcvr.hir_id)
|
||||
&& let Some(failed_pred) = failed_pred.as_trait_clause()
|
||||
&& let pred = failed_pred.map_bound(|pred| pred.with_self_ty(tcx, ty))
|
||||
&& let pred = failed_pred.map_bound(|pred| pred.with_replaced_self_ty(tcx, ty))
|
||||
&& self.predicate_must_hold_modulo_regions(&Obligation::misc(
|
||||
tcx, expr.span, body_id, param_env, pred,
|
||||
))
|
||||
@@ -4624,9 +4624,10 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||
let Some(root_pred) = root_obligation.predicate.as_trait_clause() else { return };
|
||||
|
||||
let trait_ref = root_pred.map_bound(|root_pred| {
|
||||
root_pred
|
||||
.trait_ref
|
||||
.with_self_ty(self.tcx, Ty::new_tup(self.tcx, &[root_pred.trait_ref.self_ty()]))
|
||||
root_pred.trait_ref.with_replaced_self_ty(
|
||||
self.tcx,
|
||||
Ty::new_tup(self.tcx, &[root_pred.trait_ref.self_ty()]),
|
||||
)
|
||||
});
|
||||
|
||||
let obligation =
|
||||
|
||||
Reference in New Issue
Block a user