about summary refs log tree commit diff
path: root/compiler/rustc_trait_selection/src
diff options
context:
space:
mode:
authorMichael Howell <michael@notriddle.com>2024-08-13 09:33:12 -0700
committerMichael Howell <michael@notriddle.com>2024-08-13 10:01:13 -0700
commitc6fb0f344e0c6edb34966b1d73c3c1d8c5afbe34 (patch)
treeaee74b44f18068c0ed1bb4d61fecaab92f8fbad5 /compiler/rustc_trait_selection/src
parent3312f5d65244b4ccb035be7b4c61541afc211914 (diff)
downloadrust-c6fb0f344e0c6edb34966b1d73c3c1d8c5afbe34.tar.gz
rust-c6fb0f344e0c6edb34966b1d73c3c1d8c5afbe34.zip
diagnostics: use `DeepRejectCtxt` for check
This makes more things match, particularly applicable blankets.
Diffstat (limited to 'compiler/rustc_trait_selection/src')
-rw-r--r--compiler/rustc_trait_selection/src/error_reporting/infer/note_and_explain.rs37
1 files changed, 28 insertions, 9 deletions
diff --git a/compiler/rustc_trait_selection/src/error_reporting/infer/note_and_explain.rs b/compiler/rustc_trait_selection/src/error_reporting/infer/note_and_explain.rs
index 0c140f93d94..eab4addf970 100644
--- a/compiler/rustc_trait_selection/src/error_reporting/infer/note_and_explain.rs
+++ b/compiler/rustc_trait_selection/src/error_reporting/infer/note_and_explain.rs
@@ -4,6 +4,7 @@ use rustc_hir as hir;
 use rustc_hir::def::DefKind;
 use rustc_middle::traits::{ObligationCause, ObligationCauseCode};
 use rustc_middle::ty::error::{ExpectedFound, TypeError};
+use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams};
 use rustc_middle::ty::print::{FmtPrinter, Printer};
 use rustc_middle::ty::{self, suggest_constraining_type_param, Ty};
 use rustc_span::def_id::DefId;
@@ -313,9 +314,15 @@ impl<T> Trait<T> for X {
                     (ty::Dynamic(t, _, ty::DynKind::Dyn), _)
                         if let Some(def_id) = t.principal_def_id() =>
                     {
-                        let has_non_blanket_impl =
-                            tcx.non_blanket_impls_for_ty(def_id, values.found).next().is_some();
-                        if has_non_blanket_impl {
+                        let mut has_matching_impl = false;
+                        tcx.for_each_relevant_impl(def_id, values.found, |did| {
+                            if DeepRejectCtxt::new(tcx, TreatParams::ForLookup)
+                                .types_may_unify(values.found, tcx.type_of(did).skip_binder())
+                            {
+                                has_matching_impl = true;
+                            }
+                        });
+                        if has_matching_impl {
                             let trait_name = tcx.item_name(def_id);
                             diag.help(format!(
                                 "`{}` implements `{trait_name}` so you could box the found value \
@@ -328,9 +335,15 @@ impl<T> Trait<T> for X {
                     (_, ty::Dynamic(t, _, ty::DynKind::Dyn))
                         if let Some(def_id) = t.principal_def_id() =>
                     {
-                        let has_non_blanket_impl =
-                            tcx.non_blanket_impls_for_ty(def_id, values.expected).next().is_some();
-                        if has_non_blanket_impl {
+                        let mut has_matching_impl = false;
+                        tcx.for_each_relevant_impl(def_id, values.expected, |did| {
+                            if DeepRejectCtxt::new(tcx, TreatParams::ForLookup)
+                                .types_may_unify(values.expected, tcx.type_of(did).skip_binder())
+                            {
+                                has_matching_impl = true;
+                            }
+                        });
+                        if has_matching_impl {
                             let trait_name = tcx.item_name(def_id);
                             diag.help(format!(
                                 "`{}` implements `{trait_name}` so you could change the expected \
@@ -342,9 +355,15 @@ impl<T> Trait<T> for X {
                     (ty::Dynamic(t, _, ty::DynKind::DynStar), _)
                         if let Some(def_id) = t.principal_def_id() =>
                     {
-                        let has_non_blanket_impl =
-                            tcx.non_blanket_impls_for_ty(def_id, values.found).next().is_some();
-                        if has_non_blanket_impl {
+                        let mut has_matching_impl = false;
+                        tcx.for_each_relevant_impl(def_id, values.found, |did| {
+                            if DeepRejectCtxt::new(tcx, TreatParams::ForLookup)
+                                .types_may_unify(values.found, tcx.type_of(did).skip_binder())
+                            {
+                                has_matching_impl = true;
+                            }
+                        });
+                        if has_matching_impl {
                             let trait_name = tcx.item_name(def_id);
                             diag.help(format!(
                                 "`{}` implements `{trait_name}`, `#[feature(dyn_star)]` is likely \