Skip to content

Commit

Permalink
Add detailed error explanation for E0389
Browse files Browse the repository at this point in the history
Cleanup of E0389

Added type-d out version of type in E0389 description
  • Loading branch information
cramertj committed May 6, 2016
1 parent 3157691 commit f25cbe6
Showing 1 changed file with 64 additions and 1 deletion.
65 changes: 64 additions & 1 deletion src/librustc_borrowck/diagnostics.rs
Expand Up @@ -286,6 +286,70 @@ You can read more about cell types in the API documentation:
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##"
A variable was borrowed as mutable more than once. Erroneous code example:
Expand Down Expand Up @@ -434,7 +498,6 @@ http://doc.rust-lang.org/stable/book/references-and-borrowing.html
register_diagnostics! {
E0385, // {} in an aliasable location
E0388, // {} in a static location
E0389, // {} in a `&` reference
E0500, // closure requires unique access to `..` but .. is already borrowed
E0501, // cannot borrow `..`.. as .. because previous closure requires unique access
E0502, // cannot borrow `..`.. as .. because .. is also borrowed as ...
Expand Down

0 comments on commit f25cbe6

Please sign in to comment.