d18b4bb7a7
Fixes #73268 When a deref coercion occurs, we may end up with a move error if the base value has been partially moved out of. However, we do not indicate anywhere that a deref coercion is occuring, resulting in an error message with a confusing span. This PR adds an explicit note to move errors when a deref coercion is involved. We mention the name of the type that the deref-coercion resolved to, as well as the `Deref::Target` associated type being used.
25 lines
839 B
Plaintext
25 lines
839 B
Plaintext
error[E0382]: borrow of moved value: `arc_v`
|
|
--> $DIR/no-capture-arc.rs:14:16
|
|
|
|
|
LL | let arc_v = Arc::new(v);
|
|
| ----- move occurs because `arc_v` has type `Arc<Vec<i32>>`, which does not implement the `Copy` trait
|
|
LL |
|
|
LL | thread::spawn(move|| {
|
|
| ------ value moved into closure here
|
|
LL | assert_eq!((*arc_v)[3], 4);
|
|
| ----- variable moved due to use in closure
|
|
...
|
|
LL | assert_eq!((*arc_v)[2], 3);
|
|
| ^^^^^^^^ value borrowed here after move
|
|
|
|
|
= note: borrow occurs due to deref coercion to `Vec<i32>`
|
|
note: deref defined here
|
|
--> $SRC_DIR/alloc/src/sync.rs:LL:COL
|
|
|
|
|
LL | type Target = T;
|
|
| ^^^^^^^^^^^^^^^^
|
|
|
|
error: aborting due to previous error
|
|
|
|
For more information about this error, try `rustc --explain E0382`.
|