]> git.lizzy.rs Git - rust.git/blobdiff - compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs
Suggest possible clone when we have &T
[rust.git] / compiler / rustc_hir_typeck / src / fn_ctxt / suggestions.rs
index 066e98c74578fe047d2fcce200a3c1839158fdc7..991b0399542bf3037b19024fb9b7e37899c9fe48 100644 (file)
@@ -1014,6 +1014,35 @@ pub(crate) fn suggest_block_to_brackets_peeling_refs(
         }
     }
 
+    pub(crate) fn suggest_clone_for_ref(
+        &self,
+        diag: &mut Diagnostic,
+        expr: &hir::Expr<'_>,
+        expr_ty: Ty<'tcx>,
+        expected_ty: Ty<'tcx>,
+    ) -> bool {
+        if let ty::Ref(_, inner_ty, hir::Mutability::Not) = expr_ty.kind() &&
+            let Some(clone_trait_def) = self.tcx.lang_items().clone_trait() &&
+                expected_ty == *inner_ty &&
+                self
+                .infcx
+                .type_implements_trait(
+                    clone_trait_def,
+                    [self.tcx.erase_regions(expected_ty)],
+                    self.param_env
+                )
+                .must_apply_modulo_regions() {
+                    diag.span_suggestion_verbose(
+                        expr.span.shrink_to_hi(),
+                        "consider using clone here",
+                        ".clone()",
+                        Applicability::MachineApplicable,
+                    );
+                    return true;
+                }
+        false
+    }
+
     pub(crate) fn suggest_copied_or_cloned(
         &self,
         diag: &mut Diagnostic,