about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2024-03-17 21:25:38 +0000
committerEsteban Küber <esteban@kuber.com.ar>2024-04-11 16:41:42 +0000
commitd97d2fe7440ea3032a93fa3ebf8d62fea0337d04 (patch)
tree84f778762a45c6c7820a0dcdd557292424e9d926 /compiler
parentd578ac9e476a376246320db1d934972601c5b0f5 (diff)
downloadrust-d97d2fe7440ea3032a93fa3ebf8d62fea0337d04.tar.gz
rust-d97d2fe7440ea3032a93fa3ebf8d62fea0337d04.zip
Mention when the type of the moved value doesn't implement `Clone`
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs15
1 files changed, 13 insertions, 2 deletions
diff --git a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
index ee50e82d80d..860f8882ad3 100644
--- a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
+++ b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
@@ -1195,8 +1195,19 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
         let ty = ty.peel_refs();
         if self.implements_clone(ty) {
             self.suggest_cloning_inner(err, ty, expr);
-            // } else {
-            //     err.note(format!("if `{ty}` implemented `Clone`, you could clone the value"));
+        } else if let ty::Adt(def, args) = ty.kind()
+            && def.did().as_local().is_some()
+            && def.variants().iter().all(|variant| {
+                variant
+                    .fields
+                    .iter()
+                    .all(|field| self.implements_clone(field.ty(self.infcx.tcx, args)))
+            })
+        {
+            err.span_note(
+                self.infcx.tcx.def_span(def.did()),
+                format!("if `{ty}` implemented `Clone`, you could clone the value"),
+            );
         }
     }