Skip to content

Commit

Permalink
add diagnostics for E0387
Browse files Browse the repository at this point in the history
  • Loading branch information
AlisdairO committed Aug 8, 2015
1 parent 920cf4b commit d83a0fd
Showing 1 changed file with 36 additions and 1 deletion.
37 changes: 36 additions & 1 deletion src/librustc_borrowck/diagnostics.rs
Expand Up @@ -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) { }
```
"##

}
Expand All @@ -104,7 +140,6 @@ register_diagnostics! {
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
}

0 comments on commit d83a0fd

Please sign in to comment.