add diagnostics for E0387
This commit is contained in:
parent
920cf4b4b2
commit
d83a0fdf7d
1 changed files with 36 additions and 1 deletions
|
|
@ -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 @@ 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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue