d68f2a6b71
``` error[E0382]: use of moved value: `t` --> $DIR/use_of_moved_value_copy_suggestions.rs:7:9 | LL | fn duplicate_t<T>(t: T) -> (T, T) { | - move occurs because `t` has type `T`, which does not implement the `Copy` trait ... LL | (t, t) | - ^ value used here after move | | | value moved here | help: if `T` implemented `Clone`, you could clone the value --> $DIR/use_of_moved_value_copy_suggestions.rs:4:16 | LL | fn duplicate_t<T>(t: T) -> (T, T) { | ^ consider constraining this type parameter with `Clone` ... LL | (t, t) | - you could clone this value help: consider restricting type parameter `T` | LL | fn duplicate_t<T: Copy>(t: T) -> (T, T) { | ++++++ ``` The `help` is new. On ADTs, we also extend the output with span labels: ``` error[E0507]: cannot move out of static item `FOO` --> $DIR/issue-17718-static-move.rs:6:14 | LL | let _a = FOO; | ^^^ move occurs because `FOO` has type `Foo`, which does not implement the `Copy` trait | note: if `Foo` implemented `Clone`, you could clone the value --> $DIR/issue-17718-static-move.rs:1:1 | LL | struct Foo; | ^^^^^^^^^^ consider implementing `Clone` for this type ... LL | let _a = FOO; | --- you could clone this value help: consider borrowing here | LL | let _a = &FOO; | + ```
215 lines
8.3 KiB
Plaintext
215 lines
8.3 KiB
Plaintext
error[E0382]: use of moved value: `val.0`
|
|
--> $DIR/move-fn-self-receiver.rs:30:5
|
|
|
|
|
LL | val.0.into_iter().next();
|
|
| ----------- `val.0` moved due to this method call
|
|
LL | val.0;
|
|
| ^^^^^ value used here after move
|
|
|
|
|
note: `into_iter` takes ownership of the receiver `self`, which moves `val.0`
|
|
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
|
= note: move occurs because `val.0` has type `Vec<bool>`, which does not implement the `Copy` trait
|
|
help: you can `clone` the value and consume it, but this might not be your desired behavior
|
|
|
|
|
LL | val.0.clone().into_iter().next();
|
|
| ++++++++
|
|
|
|
error[E0382]: use of moved value: `foo`
|
|
--> $DIR/move-fn-self-receiver.rs:34:5
|
|
|
|
|
LL | let foo = Foo;
|
|
| --- move occurs because `foo` has type `Foo`, which does not implement the `Copy` trait
|
|
LL | foo.use_self();
|
|
| ---------- `foo` moved due to this method call
|
|
LL | foo;
|
|
| ^^^ value used here after move
|
|
|
|
|
note: `Foo::use_self` takes ownership of the receiver `self`, which moves `foo`
|
|
--> $DIR/move-fn-self-receiver.rs:13:17
|
|
|
|
|
LL | fn use_self(self) {}
|
|
| ^^^^
|
|
|
|
error[E0382]: use of moved value: `second_foo`
|
|
--> $DIR/move-fn-self-receiver.rs:38:5
|
|
|
|
|
LL | let second_foo = Foo;
|
|
| ---------- move occurs because `second_foo` has type `Foo`, which does not implement the `Copy` trait
|
|
LL | second_foo.use_self();
|
|
| ---------- `second_foo` moved due to this method call
|
|
LL | second_foo;
|
|
| ^^^^^^^^^^ value used here after move
|
|
|
|
error[E0382]: use of moved value: `boxed_foo`
|
|
--> $DIR/move-fn-self-receiver.rs:42:5
|
|
|
|
|
LL | let boxed_foo = Box::new(Foo);
|
|
| --------- move occurs because `boxed_foo` has type `Box<Foo>`, which does not implement the `Copy` trait
|
|
LL | boxed_foo.use_box_self();
|
|
| -------------- `boxed_foo` moved due to this method call
|
|
LL | boxed_foo;
|
|
| ^^^^^^^^^ value used here after move
|
|
|
|
|
note: `Foo::use_box_self` takes ownership of the receiver `self`, which moves `boxed_foo`
|
|
--> $DIR/move-fn-self-receiver.rs:14:21
|
|
|
|
|
LL | fn use_box_self(self: Box<Self>) {}
|
|
| ^^^^
|
|
help: you could `clone` the value and consume it, if the `Foo: Clone` trait bound could be satisfied
|
|
|
|
|
LL | boxed_foo.clone().use_box_self();
|
|
| ++++++++
|
|
help: consider annotating `Foo` with `#[derive(Clone)]`
|
|
|
|
|
LL + #[derive(Clone)]
|
|
LL | struct Foo;
|
|
|
|
|
|
|
error[E0382]: use of moved value: `pin_box_foo`
|
|
--> $DIR/move-fn-self-receiver.rs:46:5
|
|
|
|
|
LL | let pin_box_foo = Box::pin(Foo);
|
|
| ----------- move occurs because `pin_box_foo` has type `Pin<Box<Foo>>`, which does not implement the `Copy` trait
|
|
LL | pin_box_foo.use_pin_box_self();
|
|
| ------------------ `pin_box_foo` moved due to this method call
|
|
LL | pin_box_foo;
|
|
| ^^^^^^^^^^^ value used here after move
|
|
|
|
|
note: `Foo::use_pin_box_self` takes ownership of the receiver `self`, which moves `pin_box_foo`
|
|
--> $DIR/move-fn-self-receiver.rs:15:25
|
|
|
|
|
LL | fn use_pin_box_self(self: Pin<Box<Self>>) {}
|
|
| ^^^^
|
|
help: you could `clone` the value and consume it, if the `Foo: Clone` trait bound could be satisfied
|
|
|
|
|
LL | pin_box_foo.clone().use_pin_box_self();
|
|
| ++++++++
|
|
help: consider annotating `Foo` with `#[derive(Clone)]`
|
|
|
|
|
LL + #[derive(Clone)]
|
|
LL | struct Foo;
|
|
|
|
|
|
|
error[E0505]: cannot move out of `mut_foo` because it is borrowed
|
|
--> $DIR/move-fn-self-receiver.rs:50:5
|
|
|
|
|
LL | let mut mut_foo = Foo;
|
|
| ----------- binding `mut_foo` declared here
|
|
LL | let ret = mut_foo.use_mut_self();
|
|
| ------- borrow of `mut_foo` occurs here
|
|
LL | mut_foo;
|
|
| ^^^^^^^ move out of `mut_foo` occurs here
|
|
LL | ret;
|
|
| --- borrow later used here
|
|
|
|
|
note: if `Foo` implemented `Clone`, you could clone the value
|
|
--> $DIR/move-fn-self-receiver.rs:5:1
|
|
|
|
|
LL | struct Foo;
|
|
| ^^^^^^^^^^ consider implementing `Clone` for this type
|
|
...
|
|
LL | let ret = mut_foo.use_mut_self();
|
|
| ------- you could clone this value
|
|
|
|
error[E0382]: use of moved value: `rc_foo`
|
|
--> $DIR/move-fn-self-receiver.rs:55:5
|
|
|
|
|
LL | let rc_foo = Rc::new(Foo);
|
|
| ------ move occurs because `rc_foo` has type `Rc<Foo>`, which does not implement the `Copy` trait
|
|
LL | rc_foo.use_rc_self();
|
|
| ------------- `rc_foo` moved due to this method call
|
|
LL | rc_foo;
|
|
| ^^^^^^ value used here after move
|
|
|
|
|
note: `Foo::use_rc_self` takes ownership of the receiver `self`, which moves `rc_foo`
|
|
--> $DIR/move-fn-self-receiver.rs:16:20
|
|
|
|
|
LL | fn use_rc_self(self: Rc<Self>) {}
|
|
| ^^^^
|
|
help: you can `clone` the value and consume it, but this might not be your desired behavior
|
|
|
|
|
LL | rc_foo.clone().use_rc_self();
|
|
| ++++++++
|
|
|
|
error[E0382]: use of moved value: `foo_add`
|
|
--> $DIR/move-fn-self-receiver.rs:59:5
|
|
|
|
|
LL | let foo_add = Foo;
|
|
| ------- move occurs because `foo_add` has type `Foo`, which does not implement the `Copy` trait
|
|
LL | foo_add + Foo;
|
|
| ------------- `foo_add` moved due to usage in operator
|
|
LL | foo_add;
|
|
| ^^^^^^^ value used here after move
|
|
|
|
|
note: if `Foo` implemented `Clone`, you could clone the value
|
|
--> $DIR/move-fn-self-receiver.rs:5:1
|
|
|
|
|
LL | struct Foo;
|
|
| ^^^^^^^^^^ consider implementing `Clone` for this type
|
|
...
|
|
LL | foo_add + Foo;
|
|
| ------- you could clone this value
|
|
note: calling this operator moves the left-hand side
|
|
--> $SRC_DIR/core/src/ops/arith.rs:LL:COL
|
|
|
|
error[E0382]: use of moved value: `implicit_into_iter`
|
|
--> $DIR/move-fn-self-receiver.rs:63:5
|
|
|
|
|
LL | let implicit_into_iter = vec![true];
|
|
| ------------------ move occurs because `implicit_into_iter` has type `Vec<bool>`, which does not implement the `Copy` trait
|
|
LL | for _val in implicit_into_iter {}
|
|
| ------------------ `implicit_into_iter` moved due to this implicit call to `.into_iter()`
|
|
LL | implicit_into_iter;
|
|
| ^^^^^^^^^^^^^^^^^^ value used here after move
|
|
|
|
|
help: consider iterating over a slice of the `Vec<bool>`'s content to avoid moving into the `for` loop
|
|
|
|
|
LL | for _val in &implicit_into_iter {}
|
|
| +
|
|
|
|
error[E0382]: use of moved value: `explicit_into_iter`
|
|
--> $DIR/move-fn-self-receiver.rs:67:5
|
|
|
|
|
LL | let explicit_into_iter = vec![true];
|
|
| ------------------ move occurs because `explicit_into_iter` has type `Vec<bool>`, which does not implement the `Copy` trait
|
|
LL | for _val in explicit_into_iter.into_iter() {}
|
|
| ----------- `explicit_into_iter` moved due to this method call
|
|
LL | explicit_into_iter;
|
|
| ^^^^^^^^^^^^^^^^^^ value used here after move
|
|
|
|
|
help: you can `clone` the value and consume it, but this might not be your desired behavior
|
|
|
|
|
LL | for _val in explicit_into_iter.clone().into_iter() {}
|
|
| ++++++++
|
|
|
|
error[E0382]: use of moved value: `container`
|
|
--> $DIR/move-fn-self-receiver.rs:71:5
|
|
|
|
|
LL | let container = Container(vec![]);
|
|
| --------- move occurs because `container` has type `Container`, which does not implement the `Copy` trait
|
|
LL | for _val in container.custom_into_iter() {}
|
|
| ------------------ `container` moved due to this method call
|
|
LL | container;
|
|
| ^^^^^^^^^ value used here after move
|
|
|
|
|
note: `Container::custom_into_iter` takes ownership of the receiver `self`, which moves `container`
|
|
--> $DIR/move-fn-self-receiver.rs:23:25
|
|
|
|
|
LL | fn custom_into_iter(self) -> impl Iterator<Item = bool> {
|
|
| ^^^^
|
|
|
|
error[E0382]: use of moved value: `foo2`
|
|
--> $DIR/move-fn-self-receiver.rs:75:9
|
|
|
|
|
LL | let foo2 = Foo;
|
|
| ---- move occurs because `foo2` has type `Foo`, which does not implement the `Copy` trait
|
|
LL | loop {
|
|
| ---- inside of this loop
|
|
LL | foo2.use_self();
|
|
| ^^^^ ---------- `foo2` moved due to this method call, in previous iteration of loop
|
|
|
|
error: aborting due to 12 previous errors
|
|
|
|
Some errors have detailed explanations: E0382, E0505.
|
|
For more information about an error, try `rustc --explain E0382`.
|