Auto merge of #54782 - pnkfelix:issue-54556-semi-on-tail-diagnostic, r=nikomatsakis
NLL: temps in block tail expression diagnostic This change adds a diagnostic that explains when temporaries in a block tail expression live longer than block local variables that they borrow, and attempts to suggest turning the tail expresion into a statement (either by adding a semicolon at the end, when its result value is clearly unused, or by introducing a `let`-binding for the result value and then returning that). Fix #54556
This commit is contained in:
commit
dbecb7a644
66 changed files with 958 additions and 141 deletions
|
|
@ -11,7 +11,7 @@ LL | c.push(Box::new(|| y = 0));
|
|||
| second mutable borrow occurs here
|
||||
LL | //~^ ERROR cannot borrow `y` as mutable more than once at a time
|
||||
LL | }
|
||||
| - first borrow later used here, when `c` is dropped
|
||||
| - first borrow might be used here, when `c` is dropped and runs the destructor for type `std::cell::RefCell<std::vec::Vec<std::boxed::Box<dyn std::ops::FnMut()>>>`
|
||||
|
||||
error[E0499]: cannot borrow `y` as mutable more than once at a time
|
||||
--> $DIR/issue-18783.rs:26:29
|
||||
|
|
@ -26,7 +26,7 @@ LL | Push::push(&c, Box::new(|| y = 0));
|
|||
| second mutable borrow occurs here
|
||||
LL | //~^ ERROR cannot borrow `y` as mutable more than once at a time
|
||||
LL | }
|
||||
| - first borrow later used here, when `c` is dropped
|
||||
| - first borrow might be used here, when `c` is dropped and runs the destructor for type `std::cell::RefCell<std::vec::Vec<std::boxed::Box<dyn std::ops::FnMut()>>>`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -3,9 +3,15 @@ error[E0502]: cannot borrow `heap` as immutable because it is also borrowed as m
|
|||
|
|
||||
LL | let borrow = heap.peek_mut();
|
||||
| ---- mutable borrow occurs here
|
||||
...
|
||||
LL |
|
||||
LL | match (borrow, ()) {
|
||||
| ------------ a temporary with access to the mutable borrow is created here ...
|
||||
LL | (Some(_), ()) => {
|
||||
LL | println!("{:?}", heap); //~ ERROR cannot borrow `heap` as immutable
|
||||
| ^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL | };
|
||||
| - ... and the mutable borrow might be used here, when that temporary is dropped and runs the destructor for type `(std::option::Option<std::collections::binary_heap::PeekMut<'_, i32>>, ())`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue