Tweak spans when encountering multiline initializer in move error
```
error[E0507]: cannot move out of `f`, a captured variable in an `FnMut` closure
--> $DIR/borrowck-call-is-borrow-issue-12224.rs:57:13
|
LL | let mut f = move |g: Box<dyn FnMut(isize)>, b: isize| {
| ----- captured outer variable
...
LL | f(Box::new(|a| {
| --- captured by this `FnMut` closure
LL |
LL | foo(f);
| ^ move occurs because `f` has type `{closure@$DIR/borrowck-call-is-borrow-issue-12224.rs:52:17: 52:58}`, which does not implement the `Copy` trait
```
instead of
```
error[E0507]: cannot move out of `f`, a captured variable in an `FnMut` closure
--> $DIR/borrowck-call-is-borrow-issue-12224.rs:57:13
|
LL | let mut f = move |g: Box<dyn FnMut(isize)>, b: isize| {
| _________-----___-
| | |
| | captured outer variable
LL | | let _ = s.len();
LL | | };
| |_____- move occurs because `f` has type `{closure@$DIR/borrowck-call-is-borrow-issue-12224.rs:52:17: 52:58}`, which does not implement the `Copy` trait
LL | f(Box::new(|a| {
| --- captured by this `FnMut` closure
LL |
LL | foo(f);
| ^ `f` is moved here
```
This commit is contained in:
@@ -663,8 +663,15 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
|
||||
// | | `Option<Foo>`, which does not implement the
|
||||
// | | `Copy` trait
|
||||
// | captured outer variable
|
||||
(None, Some(init)) => init.span,
|
||||
(None, None) => use_span,
|
||||
//
|
||||
// We don't want the case where the initializer is something that spans
|
||||
// multiple lines, like a closure, as the ASCII art gets messy.
|
||||
(None, Some(init))
|
||||
if !self.infcx.tcx.sess.source_map().is_multiline(init.span) =>
|
||||
{
|
||||
init.span
|
||||
}
|
||||
_ => use_span,
|
||||
},
|
||||
_ => use_span,
|
||||
};
|
||||
|
||||
@@ -2,15 +2,13 @@ error[E0507]: cannot move out of `y`, a captured variable in an `Fn` closure
|
||||
--> $DIR/unboxed-closures-move-upvar-from-non-once-ref-closure.rs:12:9
|
||||
|
|
||||
LL | let y = vec![format!("World")];
|
||||
| - ---------------------- move occurs because `y` has type `Vec<String>`, which does not implement the `Copy` trait
|
||||
| |
|
||||
| captured outer variable
|
||||
| - captured outer variable
|
||||
LL | call(|| {
|
||||
| -- captured by this `Fn` closure
|
||||
LL | y.into_iter();
|
||||
| ^ ----------- `y` moved due to this method call
|
||||
| |
|
||||
| `y` is moved here
|
||||
| move occurs because `y` has type `Vec<String>`, which does not implement the `Copy` trait
|
||||
|
|
||||
note: `into_iter` takes ownership of the receiver `self`, which moves `y`
|
||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||
|
||||
@@ -36,17 +36,13 @@ error[E0507]: cannot move out of `f`, a captured variable in an `FnMut` closure
|
||||
--> $DIR/borrowck-call-is-borrow-issue-12224.rs:57:13
|
||||
|
|
||||
LL | let mut f = move |g: Box<dyn FnMut(isize)>, b: isize| {
|
||||
| _________-----___-
|
||||
| | |
|
||||
| | captured outer variable
|
||||
LL | | let _ = s.len();
|
||||
LL | | };
|
||||
| |_____- move occurs because `f` has type `{closure@$DIR/borrowck-call-is-borrow-issue-12224.rs:52:17: 52:58}`, which does not implement the `Copy` trait
|
||||
| ----- captured outer variable
|
||||
...
|
||||
LL | f(Box::new(|a| {
|
||||
| --- captured by this `FnMut` closure
|
||||
LL |
|
||||
LL | foo(f);
|
||||
| ^ `f` is moved here
|
||||
| ^ move occurs because `f` has type `{closure@$DIR/borrowck-call-is-borrow-issue-12224.rs:52:17: 52:58}`, which does not implement the `Copy` trait
|
||||
|
|
||||
help: consider cloning the value if the performance cost is acceptable
|
||||
|
|
||||
|
||||
Reference in New Issue
Block a user