Skip to content

Commit a34730d

Browse files
authored
Rollup merge of rust-lang#58199 - clintfred:partial-move-err-msg, r=estebank
Add better error message for partial move closes rust-lang#56657 r? @davidtwco
2 parents b4c8dc0 + 02fe6a7 commit a34730d

9 files changed

+18
-12
lines changed

src/librustc_mir/borrow_check/error_reporting.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
130130
);
131131

132132
let mut is_loop_move = false;
133+
let is_partial_move = move_site_vec.iter().any(|move_site| {
134+
let move_out = self.move_data.moves[(*move_site).moi];
135+
let moved_place = &self.move_data.move_paths[move_out.path].place;
136+
used_place != moved_place && used_place.is_prefix_of(moved_place)
137+
});
133138
for move_site in &move_site_vec {
134139
let move_out = self.move_data.moves[(*move_site).moi];
135140
let moved_place = &self.move_data.move_paths[move_out.path].place;
@@ -175,8 +180,9 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
175180
err.span_label(
176181
span,
177182
format!(
178-
"value {} here after move",
179-
desired_action.as_verb_in_past_tense()
183+
"value {} here {}",
184+
desired_action.as_verb_in_past_tense(),
185+
if is_partial_move { "after partial move" } else { "after move" },
180186
),
181187
);
182188
}

src/test/ui/borrowck/borrowck-uninit-field-access.ast.nll.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ error[E0382]: use of moved value: `line2`
2020
LL | let _moved = (line2.origin, line2.middle);
2121
| ------------ value moved here
2222
LL | line2.consume(); //[ast]~ ERROR use of partially moved value: `line2` [E0382]
23-
| ^^^^^ value used here after move
23+
| ^^^^^ value used here after partial move
2424
|
2525
= note: move occurs because `line2.middle` has type `Point`, which does not implement the `Copy` trait
2626

src/test/ui/borrowck/borrowck-uninit-field-access.mir.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ error[E0382]: use of moved value: `line2`
2020
LL | let _moved = (line2.origin, line2.middle);
2121
| ------------ value moved here
2222
LL | line2.consume(); //[ast]~ ERROR use of partially moved value: `line2` [E0382]
23-
| ^^^^^ value used here after move
23+
| ^^^^^ value used here after partial move
2424
|
2525
= note: move occurs because `line2.middle` has type `Point`, which does not implement the `Copy` trait
2626

src/test/ui/moves/moves-based-on-type-cyclic-types-issue-4821.nll.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ LL | Some(right) => consume(right),
55
| ----- value moved here
66
...
77
LL | consume(node) + r //~ ERROR use of partially moved value: `node`
8-
| ^^^^ value used here after move
8+
| ^^^^ value used here after partial move
99
|
1010
= note: move occurs because value has type `std::boxed::Box<List>`, which does not implement the `Copy` trait
1111

src/test/ui/moves/moves-based-on-type-match-bindings.nll.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ LL | Foo {f} => {}
55
| - value moved here
66
...
77
LL | touch(&x); //~ ERROR use of partially moved value: `x`
8-
| ^^ value borrowed here after move
8+
| ^^ value borrowed here after partial move
99
|
1010
= note: move occurs because `x.f` has type `std::string::String`, which does not implement the `Copy` trait
1111

src/test/ui/nll/move-subpaths-moves-root.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ error[E0382]: use of moved value: `x`
44
LL | drop(x.0);
55
| --- value moved here
66
LL | drop(x); //~ ERROR use of moved value
7-
| ^ value used here after move
7+
| ^ value used here after partial move
88
|
99
= note: move occurs because `x.0` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait
1010

src/test/ui/ref-suggestion.nll.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ LL | (Some(y), ()) => {},
2525
| - value moved here
2626
...
2727
LL | x; //~ ERROR use of partially moved value
28-
| ^ value used here after move
28+
| ^ value used here after partial move
2929
|
3030
= note: move occurs because value has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait
3131

src/test/ui/unsized-locals/borrow-after-move.nll.stderr

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ LL | let y = *x;
55
| -- value moved here
66
LL | drop_unsized(y);
77
LL | println!("{}", &x);
8-
| ^^ value borrowed here after move
8+
| ^^ value borrowed here after partial move
99
|
1010
= note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait
1111

@@ -27,7 +27,7 @@ LL | let y = *x;
2727
| -- value moved here
2828
LL | y.foo();
2929
LL | println!("{}", &x);
30-
| ^^ value borrowed here after move
30+
| ^^ value borrowed here after partial move
3131
|
3232
= note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait
3333

@@ -48,7 +48,7 @@ error[E0382]: borrow of moved value: `x`
4848
LL | x.foo();
4949
| - value moved here
5050
LL | println!("{}", &x);
51-
| ^^ value borrowed here after move
51+
| ^^ value borrowed here after partial move
5252
|
5353
= note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait
5454

src/test/ui/unsized-locals/double-move.nll.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ error[E0382]: use of moved value: `x`
1414
LL | let _y = *x;
1515
| -- value moved here
1616
LL | drop_unsized(x); //~ERROR use of moved value
17-
| ^ value used here after move
17+
| ^ value used here after partial move
1818
|
1919
= note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait
2020

0 commit comments

Comments
 (0)