-
Notifications
You must be signed in to change notification settings - Fork 13k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Provide more suggestions for cloning immutable bindings
When encountering multiple mutable borrows, suggest cloning and adding derive annotations as needed. ``` error[E0596]: cannot borrow `sm.x` as mutable, as it is behind a `&` reference --> $DIR/accidentally-cloning-ref-borrow-error.rs:32:9 | LL | foo(&mut sm.x); | ^^^^^^^^^ `sm` is a `&` reference, so the data it refers to cannot be borrowed as mutable | help: `Str` doesn't implement `Clone`, so this call clones the reference `&Str` --> $DIR/accidentally-cloning-ref-borrow-error.rs:31:21 | LL | let mut sm = sr.clone(); | ^^^^^^^ help: consider annotating `Str` with `#[derive(Clone)]` | LL + #[derive(Clone)] LL | struct Str { | help: consider specifying this binding's type | LL | let mut sm: &mut Str = sr.clone(); | ++++++++++ ``` ``` error[E0596]: cannot borrow `*inner` as mutable, as it is behind a `&` reference --> $DIR/issue-91206.rs:14:5 | LL | inner.clear(); | ^^^^^ `inner` is a `&` reference, so the data it refers to cannot be borrowed as mutable | help: you can `clone` the `Vec<usize>` value and consume it, but this might not be your desired behavior --> $DIR/issue-91206.rs:11:17 | LL | let inner = client.get_inner_ref(); | ^^^^^^^^^^^^^^^^^^^^^^ help: consider specifying this binding's type | LL | let inner: &mut Vec<usize> = client.get_inner_ref(); | +++++++++++++++++ ```
- Loading branch information
Showing
9 changed files
with
196 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
tests/ui/borrowck/accidentally-cloning-ref-borrow-error.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
#[derive(Debug)] | ||
struct X<T>(T); | ||
|
||
impl<T: Clone> Clone for X<T> { | ||
fn clone(&self) -> X<T> { | ||
X(self.0.clone()) | ||
} | ||
} | ||
|
||
#[derive(Debug)] | ||
struct Y; | ||
|
||
#[derive(Debug)] | ||
struct Str { | ||
x: Option<i32>, | ||
} | ||
|
||
fn foo(s: &mut Option<i32>) { | ||
if s.is_none() { | ||
*s = Some(0); | ||
} | ||
println!("{:?}", s); | ||
} | ||
|
||
fn bar<T: std::fmt::Debug>(s: &mut X<T>) { | ||
println!("{:?}", s); | ||
} | ||
fn main() { | ||
let s = Str { x: None }; | ||
let sr = &s; | ||
let mut sm = sr.clone(); | ||
foo(&mut sm.x); //~ ERROR cannot borrow `sm.x` as mutable, as it is behind a `&` reference | ||
|
||
let x = X(Y); | ||
let xr = &x; | ||
let mut xm = xr.clone(); | ||
bar(&mut xm); //~ ERROR cannot borrow data in a `&` reference as mutable | ||
} |
30 changes: 30 additions & 0 deletions
30
tests/ui/borrowck/accidentally-cloning-ref-borrow-error.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
error[E0596]: cannot borrow `sm.x` as mutable, as it is behind a `&` reference | ||
--> $DIR/accidentally-cloning-ref-borrow-error.rs:32:9 | ||
| | ||
LL | foo(&mut sm.x); | ||
| ^^^^^^^^^ `sm` is a `&` reference, so the data it refers to cannot be borrowed as mutable | ||
| | ||
help: `Str` doesn't implement `Clone`, so this call clones the reference `&Str` | ||
--> $DIR/accidentally-cloning-ref-borrow-error.rs:31:21 | ||
| | ||
LL | let mut sm = sr.clone(); | ||
| ^^^^^^^ | ||
help: consider annotating `Str` with `#[derive(Clone)]` | ||
| | ||
LL + #[derive(Clone)] | ||
LL | struct Str { | ||
| | ||
help: consider specifying this binding's type | ||
| | ||
LL | let mut sm: &mut Str = sr.clone(); | ||
| ++++++++++ | ||
|
||
error[E0596]: cannot borrow data in a `&` reference as mutable | ||
--> $DIR/accidentally-cloning-ref-borrow-error.rs:37:9 | ||
| | ||
LL | bar(&mut xm); | ||
| ^^^^^^^ cannot borrow as mutable | ||
|
||
error: aborting due to 2 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0596`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters