diff --git a/compiler/rustc_hir_typeck/src/method/mod.rs b/compiler/rustc_hir_typeck/src/method/mod.rs index 586b753f454..6d6e9f248a4 100644 --- a/compiler/rustc_hir_typeck/src/method/mod.rs +++ b/compiler/rustc_hir_typeck/src/method/mod.rs @@ -18,8 +18,8 @@ self, GenericArgs, GenericArgsRef, GenericParamDefKind, Ty, TypeVisitableExt, }; use rustc_middle::{bug, span_bug}; -use rustc_span::Span; use rustc_span::symbol::Ident; +use rustc_span::{ErrorGuaranteed, Span}; use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt; use rustc_trait_selection::traits::{self, NormalizeExt}; use tracing::{debug, instrument}; @@ -66,6 +66,9 @@ pub(crate) enum MethodError<'tcx> { // Found a match, but the return type is wrong BadReturnType, + + // Error has already been emitted, no need to emit another one. + ErrorReported(ErrorGuaranteed), } // Contains a list of static methods that may apply, a list of unsatisfied trait predicates which @@ -120,6 +123,7 @@ pub fn method_exists_for_diagnostic( Err(PrivateMatch(..)) => false, Err(IllegalSizedBound { .. }) => true, Err(BadReturnType) => false, + Err(ErrorReported(_)) => false, } } diff --git a/compiler/rustc_hir_typeck/src/method/probe.rs b/compiler/rustc_hir_typeck/src/method/probe.rs index 371380e575d..3bb7070d61d 100644 --- a/compiler/rustc_hir_typeck/src/method/probe.rs +++ b/compiler/rustc_hir_typeck/src/method/probe.rs @@ -446,13 +446,7 @@ pub(crate) fn probe_op( _ => bug!("unexpected bad final type in method autoderef"), }; self.demand_eqtype(span, ty, Ty::new_error(self.tcx, guar)); - return Err(MethodError::NoMatch(NoMatchData { - static_candidates: Vec::new(), - unsatisfied_predicates: Vec::new(), - out_of_scope_traits: Vec::new(), - similar_candidate: None, - mode, - })); + return Err(MethodError::ErrorReported(guar)); } } diff --git a/compiler/rustc_hir_typeck/src/method/suggest.rs b/compiler/rustc_hir_typeck/src/method/suggest.rs index e03be4f43f7..43564413ffb 100644 --- a/compiler/rustc_hir_typeck/src/method/suggest.rs +++ b/compiler/rustc_hir_typeck/src/method/suggest.rs @@ -386,6 +386,8 @@ trait `{}` provides `{item_name}` is implemented but not reachable", return err.emit(); } + MethodError::ErrorReported(guar) => guar, + MethodError::BadReturnType => bug!("no return type expectations but got BadReturnType"), } } diff --git a/tests/ui/methods/dont-suggest-import-on-deref-err.rs b/tests/ui/methods/dont-suggest-import-on-deref-err.rs new file mode 100644 index 00000000000..c24ab791982 --- /dev/null +++ b/tests/ui/methods/dont-suggest-import-on-deref-err.rs @@ -0,0 +1,13 @@ +use std::clone::Clone; +use std::ops::Deref; + +#[derive(Clone)] +pub struct Foo {} + +impl Deref for Foo {} +//~^ ERROR not all trait items implemented + +pub fn main() { + let f = Foo {}; + let _ = f.clone(); +} diff --git a/tests/ui/methods/dont-suggest-import-on-deref-err.stderr b/tests/ui/methods/dont-suggest-import-on-deref-err.stderr new file mode 100644 index 00000000000..20a63ff375d --- /dev/null +++ b/tests/ui/methods/dont-suggest-import-on-deref-err.stderr @@ -0,0 +1,12 @@ +error[E0046]: not all trait items implemented, missing: `Target`, `deref` + --> $DIR/dont-suggest-import-on-deref-err.rs:7:1 + | +LL | impl Deref for Foo {} + | ^^^^^^^^^^^^^^^^^^ missing `Target`, `deref` in implementation + | + = help: implement the missing item: `type Target = /* Type */;` + = help: implement the missing item: `fn deref(&self) -> &::Target { todo!() }` + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0046`.