Add detailed error explanation for E0389

Cleanup of E0389

Added type-d out version of type in E0389 description
This commit is contained in:
Taylor Cramer 2016-05-04 14:00:43 -07:00
parent 3157691f96
commit f25cbe62e8

View File

@ -286,6 +286,70 @@ You can read more about cell types in the API documentation:
https://doc.rust-lang.org/std/cell/ https://doc.rust-lang.org/std/cell/
"##, "##,
E0389: r##"
An attempt was made to mutate data using a non-mutable reference. This
commonly occurs when attempting to assign to a non-mutable reference of a
mutable reference (`&(&mut T)`).
Example of erroneous code:
```compile_fail
struct FancyNum {
num: u8
}
fn main() {
let mut fancy = FancyNum{ num: 5 };
let fancy_ref = &(&mut fancy);
fancy_ref.num = 6; // error: cannot assign to data in a `&` reference
println!("{}", fancy_ref.num);
}
```
Here, `&mut fancy` is mutable, but `&(&mut fancy)` is not. Creating an
immutable reference to a value borrows it immutably. There can be multiple
references of type `&(&mut T)` that point to the same value, so they must be
immutable to prevent multiple mutable references to the same value.
To fix this, either remove the outer reference:
```
struct FancyNum {
num: u8
}
fn main() {
let mut fancy = FancyNum{ num: 5 };
let fancy_ref = &mut fancy;
// `fancy_ref` is now &mut FancyNum, rather than &(&mut FancyNum)
fancy_ref.num = 6; // No error!
println!("{}", fancy_ref.num);
}
```
Or make the outer reference mutable:
```
struct FancyNum {
num: u8
}
fn main() {
let mut fancy = FancyNum{ num: 5 };
let fancy_ref = &mut (&mut fancy);
// `fancy_ref` is now &mut(&mut FancyNum), rather than &(&mut FancyNum)
fancy_ref.num = 6; // No error!
println!("{}", fancy_ref.num);
}
```
"##,
E0499: r##" E0499: r##"
A variable was borrowed as mutable more than once. Erroneous code example: A variable was borrowed as mutable more than once. Erroneous code example:
@ -434,7 +498,6 @@ http://doc.rust-lang.org/stable/book/references-and-borrowing.html
register_diagnostics! { register_diagnostics! {
E0385, // {} in an aliasable location E0385, // {} in an aliasable location
E0388, // {} in a static location E0388, // {} in a static location
E0389, // {} in a `&` reference
E0500, // closure requires unique access to `..` but .. is already borrowed E0500, // closure requires unique access to `..` but .. is already borrowed
E0501, // cannot borrow `..`.. as .. because previous closure requires unique access E0501, // cannot borrow `..`.. as .. because previous closure requires unique access
E0502, // cannot borrow `..`.. as .. because .. is also borrowed as ... E0502, // cannot borrow `..`.. as .. because .. is also borrowed as ...