about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs37
1 files changed, 23 insertions, 14 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs
index a3e3a964ca2..da16941b923 100644
--- a/compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs
+++ b/compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs
@@ -104,6 +104,8 @@ pub trait TypeErrCtxtExt<'tcx> {
         error: &SelectionError<'tcx>,
     );
 
+    fn fn_arg_obligation(&self, obligation: &PredicateObligation<'tcx>) -> bool;
+
     fn report_const_param_not_wf(
         &self,
         ty: Ty<'tcx>,
@@ -434,20 +436,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
                         {
                             return;
                         }
-                        if let ObligationCauseCode::FunctionArgumentObligation {
-                            arg_hir_id,
-                            ..
-                        } = obligation.cause.code()
-                            && let Some(Node::Expr(arg)) = self.tcx.hir().find(*arg_hir_id)
-                            && let arg = arg.peel_borrows()
-                            && let hir::ExprKind::Path(hir::QPath::Resolved(
-                                None,
-                                hir::Path { res: hir::def::Res::Local(hir_id), .. },
-                            )) = arg.kind
-                            && let Some(Node::Pat(pat)) = self.tcx.hir().find(*hir_id)
-                            && let Some(preds) = self.reported_trait_errors.borrow().get(&pat.span)
-                            && preds.contains(&obligation.predicate)
-                        {
+                        if self.fn_arg_obligation(&obligation) {
                             // Silence redundant errors on binding acccess that are already
                             // reported on the binding definition (#56607).
                             return;
@@ -948,6 +937,26 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
         err.emit();
     }
 
+    fn fn_arg_obligation(&self, obligation: &PredicateObligation<'tcx>) -> bool {
+        if let ObligationCauseCode::FunctionArgumentObligation {
+            arg_hir_id,
+            ..
+        } = obligation.cause.code()
+            && let Some(Node::Expr(arg)) = self.tcx.hir().find(*arg_hir_id)
+            && let arg = arg.peel_borrows()
+            && let hir::ExprKind::Path(hir::QPath::Resolved(
+                None,
+                hir::Path { res: hir::def::Res::Local(hir_id), .. },
+            )) = arg.kind
+            && let Some(Node::Pat(pat)) = self.tcx.hir().find(*hir_id)
+            && let Some(preds) = self.reported_trait_errors.borrow().get(&pat.span)
+            && preds.contains(&obligation.predicate)
+        {
+            return true;
+        }
+        false
+    }
+
     fn report_const_param_not_wf(
         &self,
         ty: Ty<'tcx>,