diff options
| author | Aaron Hill <aa1ronham@gmail.com> | 2020-12-22 22:15:40 -0500 |
|---|---|---|
| committer | Aaron Hill <aa1ronham@gmail.com> | 2021-01-08 14:37:07 -0500 |
| commit | de90afc72e2393efad0fb9cdfd765703a044fe02 (patch) | |
| tree | 66c1d947d40638e700f2abf17dd20af674ab7dbc /src | |
| parent | ddf2cc7f8eb34f1a63b491d6a52e3e8208393c09 (diff) | |
| download | rust-de90afc72e2393efad0fb9cdfd765703a044fe02.tar.gz rust-de90afc72e2393efad0fb9cdfd765703a044fe02.zip | |
Explain method-call move errors in loops
PR #73708 added a more detailed explanation of move errors that occur due to a call to a method that takes `self`. This PR extends that logic to work when a move error occurs due to a method call in the previous iteration of a loop.
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/moves/move-fn-self-receiver.rs | 5 | ||||
| -rw-r--r-- | src/test/ui/moves/move-fn-self-receiver.stderr | 11 | ||||
| -rw-r--r-- | src/test/ui/suggestions/borrow-for-loop-head.stderr | 8 |
3 files changed, 22 insertions, 2 deletions
diff --git a/src/test/ui/moves/move-fn-self-receiver.rs b/src/test/ui/moves/move-fn-self-receiver.rs index 6107f53fa19..946642ef6f3 100644 --- a/src/test/ui/moves/move-fn-self-receiver.rs +++ b/src/test/ui/moves/move-fn-self-receiver.rs @@ -69,6 +69,11 @@ fn move_out(val: Container) { let container = Container(vec![]); for _val in container.custom_into_iter() {} container; //~ ERROR use of moved + + let foo2 = Foo; + loop { + foo2.use_self(); //~ ERROR use of moved + } } fn main() {} diff --git a/src/test/ui/moves/move-fn-self-receiver.stderr b/src/test/ui/moves/move-fn-self-receiver.stderr index dd263c1e906..8c509363d02 100644 --- a/src/test/ui/moves/move-fn-self-receiver.stderr +++ b/src/test/ui/moves/move-fn-self-receiver.stderr @@ -152,7 +152,16 @@ note: this function consumes the receiver `self` by taking ownership of it, whic LL | fn custom_into_iter(self) -> impl Iterator<Item = bool> { | ^^^^ -error: aborting due to 11 previous errors +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 { +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`. diff --git a/src/test/ui/suggestions/borrow-for-loop-head.stderr b/src/test/ui/suggestions/borrow-for-loop-head.stderr index de342a969f4..64ce6c1e16d 100644 --- a/src/test/ui/suggestions/borrow-for-loop-head.stderr +++ b/src/test/ui/suggestions/borrow-for-loop-head.stderr @@ -15,8 +15,14 @@ LL | for i in &a { LL | for j in a { | ^ | | - | value moved here, in previous iteration of loop + | `a` moved due to this implicit call to `.into_iter()`, in previous iteration of loop | help: consider borrowing to avoid moving into the for loop: `&a` + | +note: this function consumes the receiver `self` by taking ownership of it, which moves `a` + --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL + | +LL | fn into_iter(self) -> Self::IntoIter; + | ^^^^ error: aborting due to 2 previous errors |
