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
|
// | | `Option<Foo>`, which does not implement the
|
||||||
// | | `Copy` trait
|
// | | `Copy` trait
|
||||||
// | captured outer variable
|
// | 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,
|
_ => 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
|
--> $DIR/unboxed-closures-move-upvar-from-non-once-ref-closure.rs:12:9
|
||||||
|
|
|
|
||||||
LL | let y = vec![format!("World")];
|
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(|| {
|
LL | call(|| {
|
||||||
| -- captured by this `Fn` closure
|
| -- captured by this `Fn` closure
|
||||||
LL | y.into_iter();
|
LL | y.into_iter();
|
||||||
| ^ ----------- `y` moved due to this method call
|
| ^ ----------- `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`
|
note: `into_iter` takes ownership of the receiver `self`, which moves `y`
|
||||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||||
|
|||||||
@@ -35,18 +35,14 @@ LL | fn test4(f: &mut Test) {
|
|||||||
error[E0507]: cannot move out of `f`, a captured variable in an `FnMut` closure
|
error[E0507]: cannot move out of `f`, a captured variable in an `FnMut` closure
|
||||||
--> $DIR/borrowck-call-is-borrow-issue-12224.rs:57:13
|
--> $DIR/borrowck-call-is-borrow-issue-12224.rs:57:13
|
||||||
|
|
|
|
||||||
LL | let mut f = move |g: Box<dyn FnMut(isize)>, b: isize| {
|
LL | let mut f = move |g: Box<dyn FnMut(isize)>, b: isize| {
|
||||||
| _________-----___-
|
| ----- captured outer variable
|
||||||
| | |
|
...
|
||||||
| | captured outer variable
|
LL | f(Box::new(|a| {
|
||||||
LL | | let _ = s.len();
|
| --- captured by this `FnMut` closure
|
||||||
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 |
|
||||||
LL | foo(f);
|
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
|
help: consider cloning the value if the performance cost is acceptable
|
||||||
|
|
|
|
||||||
|
|||||||
Reference in New Issue
Block a user