-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Erroneous loop diagnostic in nll #56113
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,7 +5,7 @@ LL | for &x in &vector { | |
| ------- | ||
| | | ||
| immutable borrow occurs here | ||
| immutable borrow used here, in later iteration of loop | ||
| immutable borrow later used here | ||
LL | let cap = vector.capacity(); | ||
LL | vector.extend(repeat(0)); //~ ERROR cannot borrow | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here | ||
|
@@ -17,7 +17,7 @@ LL | for &x in &vector { | |
| ------- | ||
| | | ||
| immutable borrow occurs here | ||
| immutable borrow used here, in later iteration of loop | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same thing here. |
||
| immutable borrow later used here | ||
... | ||
LL | vector[1] = 5; //~ ERROR cannot borrow | ||
| ^^^^^^ mutable borrow occurs here | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,13 +8,13 @@ LL | borrow(&*v); //[ast]~ ERROR cannot borrow | |
| ^^^ immutable borrow occurs here | ||
... | ||
LL | *x = box 5; | ||
| -- mutable borrow used here, in later iteration of loop | ||
| -- mutable borrow later used here | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. better |
||
|
||
error[E0502]: cannot borrow `*v` as immutable because it is also borrowed as mutable | ||
--> $DIR/borrowck-lend-flow-loop.rs:109:16 | ||
| | ||
LL | **x += 1; | ||
| -------- mutable borrow used here, in later iteration of loop | ||
| -------- mutable borrow later used here | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. less good, but this case is sort of crazy. (It's a bit hard to tell, actually, what is meant by "later" here -- it's supposed to be after the immutable borrow, I guess -- and in that case, we do go around the loop before we reach |
||
LL | borrow(&*v); //[ast]~ ERROR cannot borrow | ||
| ^^^ immutable borrow occurs here | ||
... | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ error[E0499]: cannot borrow `x` as mutable more than once at a time | |
LL | 1 => { addr.push(&mut x); } //[ast]~ ERROR [E0499] | ||
| ---- ^^^^^^ second mutable borrow occurs here | ||
| | | ||
| first borrow used here, in later iteration of loop | ||
| first borrow later used here | ||
... | ||
LL | _ => { addr.push(&mut x); } //[ast]~ ERROR [E0499] | ||
| ------ first mutable borrow occurs here | ||
|
@@ -13,7 +13,7 @@ error[E0499]: cannot borrow `x` as mutable more than once at a time | |
--> $DIR/borrowck-mut-borrow-linear-errors.rs:15:30 | ||
| | ||
LL | 1 => { addr.push(&mut x); } //[ast]~ ERROR [E0499] | ||
| ---- first borrow used here, in later iteration of loop | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The two changes in this files also happened in AST and we already approved that. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't see an analogous message in Were you referring to a different file when you said "also happened in AST" ? Or do you mean that the above diagnostic is analogous to what NLL is being changed to produced above? (To be clear, I think AST is currently producing a third totally different diagnostic message right now for this case...) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (note in particular that the AST-borrowck error message is highlighting a use of I'm not saying I object to the change. I'm just trying to understand the comment you have written here on github about it. |
||
| ---- first borrow later used here | ||
LL | //[mir]~^ ERROR [E0499] | ||
LL | 2 => { addr.push(&mut x); } //[ast]~ ERROR [E0499] | ||
| ^^^^^^ second mutable borrow occurs here | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ error[E0499]: cannot borrow `x` as mutable more than once at a time | |
LL | 1 => { addr.push(&mut x); } //[ast]~ ERROR [E0499] | ||
| ---- ^^^^^^ second mutable borrow occurs here | ||
| | | ||
| first borrow used here, in later iteration of loop | ||
| first borrow later used here | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe less good, but the example is also kind of weird |
||
... | ||
LL | _ => { addr.push(&mut x); } //[ast]~ ERROR [E0499] | ||
| ------ first mutable borrow occurs here | ||
|
@@ -13,7 +13,7 @@ error[E0499]: cannot borrow `x` as mutable more than once at a time | |
--> $DIR/borrowck-mut-borrow-linear-errors.rs:15:30 | ||
| | ||
LL | 1 => { addr.push(&mut x); } //[ast]~ ERROR [E0499] | ||
| ---- first borrow used here, in later iteration of loop | ||
| ---- first borrow later used here | ||
LL | //[mir]~^ ERROR [E0499] | ||
LL | 2 => { addr.push(&mut x); } //[ast]~ ERROR [E0499] | ||
| ^^^^^^ second mutable borrow occurs here | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,7 +17,7 @@ LL | let inner_second = &mut inner_void; //~ ERROR cannot borrow | |
| ^^^^^^^^^^^^^^^ second mutable borrow occurs here | ||
LL | inner_second.use_mut(); | ||
LL | inner_first.use_mut(); | ||
| ----------- first borrow used here, in later iteration of loop | ||
| ----------- first borrow later used here | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. better |
||
|
||
error: aborting due to 2 previous errors | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,7 +5,7 @@ LL | let v: Vec<&str> = line.split_whitespace().collect(); | |
| ^^^^ borrowed value does not live long enough | ||
... | ||
LL | acc += cnt2; | ||
| --- borrow used here, in later iteration of loop | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is better There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Anyway the error is still ungreat :) |
||
| --- borrow later used here | ||
... | ||
LL | } | ||
| - `line` dropped here while still borrowed | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
#![feature(nll)] | ||
|
||
struct Archive; | ||
struct ArchiveIterator<'a> { | ||
x: &'a Archive, | ||
} | ||
struct ArchiveChild<'a> { | ||
x: &'a Archive, | ||
} | ||
|
||
struct A { | ||
raw: &'static mut Archive, | ||
} | ||
struct Iter<'a> { | ||
raw: &'a mut ArchiveIterator<'a>, | ||
} | ||
struct C<'a> { | ||
raw: &'a mut ArchiveChild<'a>, | ||
} | ||
|
||
impl A { | ||
pub fn iter(&self) -> Iter<'_> { | ||
panic!() | ||
} | ||
} | ||
impl Drop for A { | ||
fn drop(&mut self) {} | ||
} | ||
impl<'a> Drop for C<'a> { | ||
fn drop(&mut self) {} | ||
} | ||
|
||
impl<'a> Iterator for Iter<'a> { | ||
type Item = C<'a>; | ||
fn next(&mut self) -> Option<C<'a>> { | ||
panic!() | ||
} | ||
} | ||
|
||
fn error(archive: &A) { | ||
let mut members: Vec<&mut ArchiveChild<'_>> = vec![]; | ||
for child in archive.iter() { | ||
members.push(child.raw); | ||
//~^ ERROR borrow may still be in use when destructor runs [E0713] | ||
} | ||
members.len(); | ||
} | ||
|
||
fn main() {} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
error[E0713]: borrow may still be in use when destructor runs | ||
--> $DIR/issue-53773.rs:43:22 | ||
| | ||
LL | members.push(child.raw); | ||
| ^^^^^^^^^ | ||
LL | //~^ ERROR borrow may still be in use when destructor runs [E0713] | ||
LL | } | ||
| - here, drop of `child` needs exclusive access to `*child.raw`, because the type `C<'_>` implements the `Drop` trait | ||
LL | members.len(); | ||
| ------- borrow later used here | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. good |
||
| | ||
= note: consider using a `let` binding to create a longer lived value | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0713`. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,7 +7,7 @@ LL | foo.mutate(); | |
| ^^^^^^^^^^^^ mutable borrow occurs here | ||
LL | //~^ ERROR cannot borrow `foo` as mutable | ||
LL | println!("foo={:?}", *string); | ||
| ------- immutable borrow used here, in later iteration of loop | ||
| ------- immutable borrow later used here | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. better |
||
|
||
error: aborting due to previous error | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,7 +7,7 @@ LL | while x < 10 { //~ ERROR cannot use `x` because it was mutably borrowed | |
| ^ use of borrowed `x` | ||
LL | let mut z = x; //~ ERROR cannot use `x` because it was mutably borrowed | ||
LL | _y.push(&mut z); | ||
| -- borrow used here, in later iteration of loop | ||
| -- borrow later used here | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. better |
||
|
||
error[E0503]: cannot use `x` because it was mutably borrowed | ||
--> $DIR/regions-escape-loop-via-vec.rs:6:21 | ||
|
@@ -18,15 +18,15 @@ LL | while x < 10 { //~ ERROR cannot use `x` because it was mutably borrowed | |
LL | let mut z = x; //~ ERROR cannot use `x` because it was mutably borrowed | ||
| ^ use of borrowed `x` | ||
LL | _y.push(&mut z); | ||
| -- borrow used here, in later iteration of loop | ||
| -- borrow later used here | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. better |
||
|
||
error[E0597]: `z` does not live long enough | ||
--> $DIR/regions-escape-loop-via-vec.rs:7:17 | ||
| | ||
LL | _y.push(&mut z); | ||
| -- ^^^^^^ borrowed value does not live long enough | ||
| | | ||
| borrow used here, in later iteration of loop | ||
| borrow later used here | ||
... | ||
LL | } | ||
| - `z` dropped here while still borrowed | ||
|
@@ -38,7 +38,7 @@ LL | let mut _y = vec![&mut x]; | |
| ------ borrow of `x` occurs here | ||
... | ||
LL | _y.push(&mut z); | ||
| -- borrow used here, in later iteration of loop | ||
| -- borrow later used here | ||
LL | //~^ ERROR `z` does not live long enough | ||
LL | x += 1; //~ ERROR cannot assign | ||
| ^^^^^^ use of borrowed `x` | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@nikomatsakis this change is for the worse, I don't remember you saying that with this approach some things were going to be worse but I couldn't find the discussion about it and if this is one of those cases or it's just an error in the code :).