From 48ddf5e32398287efed553e88043bafc04177917 Mon Sep 17 00:00:00 2001 From: yukang Date: Tue, 16 Jul 2024 22:00:04 +0800 Subject: [PATCH] Fix the issue of invalid suggestion for a reference of iterator --- .../src/error_reporting/traits/suggestions.rs | 4 +++- .../invalid-suggest-deref-issue-127590.stderr | 8 -------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs b/compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs index f8843b892db..2bf582dcfb1 100644 --- a/compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs +++ b/compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs @@ -466,7 +466,6 @@ fn suggest_dereferences( && let Some(arg_ty) = typeck_results.expr_ty_adjusted_opt(expr) { // Suggest dereferencing the argument to a function/method call if possible - let mut real_trait_pred = trait_pred; while let Some((parent_code, parent_trait_pred)) = code.parent() { code = parent_code; @@ -553,6 +552,9 @@ fn suggest_dereferences( ); if self.predicate_may_hold(&obligation) && self.predicate_must_hold_modulo_regions(&sized_obligation) + // Do not suggest * if it is already a reference, + // will suggest removing the borrow instead in that case. + && !matches!(expr.kind, hir::ExprKind::AddrOf(..)) { let call_node = self.tcx.hir_node(*call_hir_id); let msg = "consider dereferencing here"; diff --git a/tests/ui/traits/suggest-dereferences/invalid-suggest-deref-issue-127590.stderr b/tests/ui/traits/suggest-dereferences/invalid-suggest-deref-issue-127590.stderr index 14befe796cf..a3ed51ace08 100644 --- a/tests/ui/traits/suggest-dereferences/invalid-suggest-deref-issue-127590.stderr +++ b/tests/ui/traits/suggest-dereferences/invalid-suggest-deref-issue-127590.stderr @@ -10,10 +10,6 @@ LL | for (src, dest) in std::iter::zip(fields.iter(), &variant.iter()) { = note: required for `&std::slice::Iter<'_, {integer}>` to implement `IntoIterator` note: required by a bound in `std::iter::zip` --> $SRC_DIR/core/src/iter/adapters/zip.rs:LL:COL -help: consider dereferencing here - | -LL | for (src, dest) in std::iter::zip(fields.iter(), *&variant.iter()) { - | + help: consider removing the leading `&`-reference | LL - for (src, dest) in std::iter::zip(fields.iter(), &variant.iter()) { @@ -43,10 +39,6 @@ LL | for (src, dest) in std::iter::zip(fields.iter(), &variant.iter().clone( = note: required for `&std::slice::Iter<'_, {integer}>` to implement `IntoIterator` note: required by a bound in `std::iter::zip` --> $SRC_DIR/core/src/iter/adapters/zip.rs:LL:COL -help: consider dereferencing here - | -LL | for (src, dest) in std::iter::zip(fields.iter(), *&variant.iter().clone()) { - | + help: consider removing the leading `&`-reference | LL - for (src, dest) in std::iter::zip(fields.iter(), &variant.iter().clone()) {