Skip to content

Commit 8412da6

Browse files
Add tests
1 parent b2eed3a commit 8412da6

9 files changed

+139
-1
lines changed

src/test/ui/borrowck/issue-81365.stderr renamed to src/test/ui/borrowck/issue-81365-1.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error[E0506]: cannot assign to `self.container_field` because it is borrowed
2-
--> $DIR/issue-81365.rs:21:9
2+
--> $DIR/issue-81365-1.rs:21:9
33
|
44
LL | let first = &self.target_field;
55
| ---- borrow of `self.container_field` occurs here
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use std::ops::Deref;
2+
3+
struct DerefTarget {
4+
target_field: bool,
5+
}
6+
struct Container {
7+
target: DerefTarget,
8+
container_field: bool,
9+
}
10+
11+
impl Deref for Container {
12+
type Target = DerefTarget;
13+
fn deref(&self) -> &Self::Target {
14+
&self.target
15+
}
16+
}
17+
18+
impl Container {
19+
fn bad_borrow(&mut self) {
20+
let first = &self.deref().target_field;
21+
self.container_field = true; //~ ERROR E0506
22+
first;
23+
}
24+
}
25+
26+
fn main() {}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
error[E0506]: cannot assign to `self.container_field` because it is borrowed
2+
--> $DIR/issue-81365-10.rs:21:9
3+
|
4+
LL | let first = &self.deref().target_field;
5+
| ---- borrow of `self.container_field` occurs here
6+
LL | self.container_field = true;
7+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
8+
LL | first;
9+
| ----- borrow later used here
10+
11+
error: aborting due to previous error
12+
13+
For more information about this error, try `rustc --explain E0506`.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use std::ops::{Deref, DerefMut};
2+
3+
struct DerefTarget {
4+
target_field: bool,
5+
}
6+
struct Container {
7+
target: DerefTarget,
8+
container_field: bool,
9+
}
10+
11+
impl Deref for Container {
12+
type Target = DerefTarget;
13+
fn deref(&self) -> &Self::Target {
14+
&self.target
15+
}
16+
}
17+
18+
impl DerefMut for Container {
19+
fn deref_mut(&mut self) -> &mut Self::Target {
20+
&mut self.target
21+
}
22+
}
23+
24+
impl Container {
25+
fn bad_borrow(&mut self) {
26+
let first = &mut self.target_field;
27+
self.container_field = true; //~ ERROR E0506
28+
first;
29+
}
30+
}
31+
32+
fn main() {}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
error[E0506]: cannot assign to `self.container_field` because it is borrowed
2+
--> $DIR/issue-81365-11.rs:27:9
3+
|
4+
LL | let first = &mut self.target_field;
5+
| ---- borrow of `self.container_field` occurs here
6+
LL | self.container_field = true;
7+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
8+
LL | first;
9+
| ----- borrow later used here
10+
11+
error: aborting due to previous error
12+
13+
For more information about this error, try `rustc --explain E0506`.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
error[E0506]: cannot assign to `self.container_field` because it is borrowed
2+
--> $DIR/issue-81365-8.rs:21:9
3+
|
4+
LL | let first = &(*self).target_field;
5+
| ------- borrow of `self.container_field` occurs here
6+
LL | self.container_field = true;
7+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
8+
LL | first;
9+
| ----- borrow later used here
10+
|
11+
= note: borrow occurs due to deref coercion to `DerefTarget`
12+
13+
error: aborting due to previous error
14+
15+
For more information about this error, try `rustc --explain E0506`.

src/test/ui/borrowck/issue-81365-9.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use std::ops::Deref;
2+
3+
struct DerefTarget {
4+
target_field: bool,
5+
}
6+
struct Container {
7+
target: DerefTarget,
8+
container_field: bool,
9+
}
10+
11+
impl Deref for Container {
12+
type Target = DerefTarget;
13+
fn deref(&self) -> &Self::Target {
14+
&self.target
15+
}
16+
}
17+
18+
impl Container {
19+
fn bad_borrow(&mut self) {
20+
let first = &Deref::deref(self).target_field;
21+
self.container_field = true; //~ ERROR E0506
22+
first;
23+
}
24+
}
25+
26+
fn main() {}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
error[E0506]: cannot assign to `self.container_field` because it is borrowed
2+
--> $DIR/issue-81365-9.rs:21:9
3+
|
4+
LL | let first = &Deref::deref(self).target_field;
5+
| ---- borrow of `self.container_field` occurs here
6+
LL | self.container_field = true;
7+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here
8+
LL | first;
9+
| ----- borrow later used here
10+
11+
error: aborting due to previous error
12+
13+
For more information about this error, try `rustc --explain E0506`.

0 commit comments

Comments
 (0)