]> git.lizzy.rs Git - rust.git/commitdiff
add diagnostics for E0387
authorAlisdair Owens <awo101@zepler.net>
Sat, 8 Aug 2015 16:32:13 +0000 (17:32 +0100)
committerAlisdair Owens <awo101@zepler.net>
Sat, 8 Aug 2015 16:38:50 +0000 (17:38 +0100)
src/librustc_borrowck/diagnostics.rs

index 24bbd4fcb7eefcee57e562be4de13c215cc8c02e..79abd08bcb1df96f23c98febd575e40362353199 100644 (file)
@@ -95,6 +95,42 @@ fn main(){
     x = 5;
 }
 ```
+"##,
+
+E0387: r##"
+This error occurs when an attempt is made to mutate or mutably reference data
+that a closure has captured immutably. Examples of this error are shown below:
+
+```
+// Accepts a function or a closure that captures its environment immutably.
+// Closures passed to foo will not be able to mutate their closed-over state.
+fn foo<F: Fn()>(f: F) { }
+
+// Attempts to mutate closed-over data.  Error message reads:
+// `cannot assign to data in a captured outer variable...`
+fn mutable() {
+    let mut x = 0u32;
+    foo(|| x = 2);
+}
+
+// Attempts to take a mutable reference to closed-over data.  Error message
+// reads: `cannot borrow data mutably in a captured outer variable...`
+fn mut_addr() {
+    let mut x = 0u32;
+    foo(|| { let y = &mut x; });
+}
+```
+
+The problem here is that foo is defined as accepting a parameter of type `Fn`.
+Closures passed into foo will thus be inferred to be of type `Fn`, meaning that
+they capture their context immutably.
+
+The solution is to capture the data mutably. This can be done by defining `foo`
+to take FnMut rather than Fn:
+
+```
+fn foo<F: FnMut()>(f: F) { }
+```
 "##
 
 }
@@ -104,7 +140,6 @@ fn main(){
     E0383, // partial reinitialization of uninitialized structure
     E0385, // {} in an aliasable location
     E0386, // {} in an immutable container
-    E0387, // {} in a captured outer variable in an `Fn` closure
     E0388, // {} in a static location
     E0389  // {} in a `&` reference
 }