about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRuud van Asseldonk <ruuda@google.com>2016-01-28 22:23:47 +0100
committerRuud van Asseldonk <ruuda@google.com>2016-01-28 22:27:41 +0100
commitf841f061ecdff7c5fd791f164b4d873399621bde (patch)
treeb95d09bd6f15ab131ad77040de6713f6e401d7bf
parentb8b18aac12214d7135a083e2e6946aa197185d49 (diff)
Improve message for rustc --explain E0507
E0507 can occur when you try to move out of a member of a mutably
borrowed struct, in which case `mem::replace` can help. Mentioning that
here hopefully saves future users a trip to Google.
-rw-r--r--src/librustc_borrowck/diagnostics.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/librustc_borrowck/diagnostics.rs b/src/librustc_borrowck/diagnostics.rs
index 7ad4d3ca708..6cbea1abbb5 100644
--- a/src/librustc_borrowck/diagnostics.rs
+++ b/src/librustc_borrowck/diagnostics.rs
@@ -377,6 +377,33 @@ fn main() {
 }
 ```
 
+Moving out of a member of a mutably borrowed struct is fine if you put something
+back. `mem::replace` can be used for that:
+
+```
+struct TheDarkKnight;
+
+impl TheDarkKnight {
+    fn nothing_is_true(self) {}
+}
+
+struct Batcave {
+    knight: TheDarkKnight
+}
+
+fn main() {
+    use std::mem;
+
+    let mut cave = Batcave {
+        knight: TheDarkKnight
+    };
+    let borrowed = &mut cave;
+
+    borrowed.knight.nothing_is_true(); // E0507
+    mem::replace(&mut borrowed.knight, TheDarkKnight).nothing_is_true(); // ok!
+}
+```
+
 You can find more information about borrowing in the rust-book:
 http://doc.rust-lang.org/stable/book/references-and-borrowing.html
 "##,