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:
Esteban Küber
2025-07-20 02:22:55 +00:00
parent 5082e6a300
commit 8df93e6966
3 changed files with 18 additions and 17 deletions

View File

@@ -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,
}; };

View File

@@ -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

View File

@@ -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
| |