Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add test that our handling of projections hasn't gone too far:
overwriting one field should not allow reborrow of an unrelated field.
- Loading branch information
Showing
2 changed files
with
52 additions
and
0 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
// Double-check we didn't go too far with our resolution to issue | ||
// #62007: assigning over a field projection (`list.1 = n;` in this | ||
// case) should kill only borrows of `list.1`; `list.0` can *not* | ||
// necessarily be borrowed on the next iteration through the loop. | ||
|
||
#![allow(dead_code)] | ||
|
||
struct List<T> { | ||
value: T, | ||
next: Option<Box<List<T>>>, | ||
} | ||
|
||
fn to_refs<'a, T>(mut list: (&'a mut List<T>, &'a mut List<T>)) -> Vec<&'a mut T> { | ||
let mut result = vec![]; | ||
loop { | ||
result.push(&mut (list.0).value); //~ ERROR cannot borrow `list.0.value` as mutable | ||
if let Some(n) = (list.0).next.as_mut() { //~ ERROR cannot borrow `list.0.next` as mutable | ||
list.1 = n; | ||
} else { | ||
return result; | ||
} | ||
} | ||
} | ||
|
||
fn main() {} |
27 changes: 27 additions & 0 deletions
27
src/test/ui/nll/issue-62007-assign-differing-fields.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,27 @@ | ||
error[E0499]: cannot borrow `list.0.value` as mutable more than once at a time | ||
--> $DIR/issue-62007-assign-differing-fields.rs:16:21 | ||
| | ||
LL | fn to_refs<'a, T>(mut list: (&'a mut List<T>, &'a mut List<T>)) -> Vec<&'a mut T> { | ||
| -- lifetime `'a` defined here | ||
... | ||
LL | result.push(&mut (list.0).value); | ||
| ^^^^^^^^^^^^^^^^^^^ mutable borrow starts here in previous iteration of loop | ||
... | ||
LL | return result; | ||
| ------ returning this value requires that `list.0.value` is borrowed for `'a` | ||
|
||
error[E0499]: cannot borrow `list.0.next` as mutable more than once at a time | ||
--> $DIR/issue-62007-assign-differing-fields.rs:17:26 | ||
| | ||
LL | fn to_refs<'a, T>(mut list: (&'a mut List<T>, &'a mut List<T>)) -> Vec<&'a mut T> { | ||
| -- lifetime `'a` defined here | ||
... | ||
LL | if let Some(n) = (list.0).next.as_mut() { | ||
| ^^^^^^^^^^^^^--------- | ||
| | | ||
| mutable borrow starts here in previous iteration of loop | ||
| argument requires that `list.0.next` is borrowed for `'a` | ||
|
||
error: aborting due to 2 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0499`. |