about summary refs log tree commit diff
diff options
context:
space:
mode:
authoryukang <moorekang@gmail.com>2024-07-16 22:00:04 +0800
committeryukang <moorekang@gmail.com>2024-07-16 22:01:55 +0800
commit48ddf5e32398287efed553e88043bafc04177917 (patch)
tree5c0a81960f67303ba40a9b016e0d3523b503e746
parent077d0da30a888ea049a471bca6301d706ca66c25 (diff)
downloadrust-48ddf5e32398287efed553e88043bafc04177917.tar.gz
rust-48ddf5e32398287efed553e88043bafc04177917.zip
Fix the issue of invalid suggestion for a reference of iterator
-rw-r--r--compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs4
-rw-r--r--tests/ui/traits/suggest-dereferences/invalid-suggest-deref-issue-127590.stderr8
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 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
             && 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 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
                         );
                         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()) {