about summary refs log tree commit diff
path: root/compiler/rustc_mir_transform/src/coverage/counters.rs
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2024-02-26 20:06:19 +0000
committerEsteban Küber <esteban@kuber.com.ar>2024-03-17 21:32:26 +0000
commit14473adf425623268252a4d10b5dd0d4f458daad (patch)
tree8a75e9698a57f8c55a47544c3dc49ac07e34753c /compiler/rustc_mir_transform/src/coverage/counters.rs
parent22e241e32e1331aab358ac2843ec63d4cc4ea9f4 (diff)
downloadrust-14473adf425623268252a4d10b5dd0d4f458daad.tar.gz
rust-14473adf425623268252a4d10b5dd0d4f458daad.zip
Detect when move of `!Copy` value occurs within `loop` and should likely not be cloned
When encountering a move error on a value within a loop of any kind,
identify if the moved value belongs to a call expression that should not
be cloned and avoid the semantically incorrect suggestion. Also try to
suggest moving the call expression outside of the loop instead.

```
error[E0382]: use of moved value: `vec`
  --> $DIR/recreating-value-in-loop-condition.rs:6:33
   |
LL |     let vec = vec!["one", "two", "three"];
   |         --- move occurs because `vec` has type `Vec<&str>`, which does not implement the `Copy` trait
LL |     while let Some(item) = iter(vec).next() {
   |     ----------------------------^^^--------
   |     |                           |
   |     |                           value moved here, in previous iteration of loop
   |     inside of this loop
   |
note: consider changing this parameter type in function `iter` to borrow instead if owning the value isn't necessary
  --> $DIR/recreating-value-in-loop-condition.rs:1:17
   |
LL | fn iter<T>(vec: Vec<T>) -> impl Iterator<Item = T> {
   |    ----         ^^^^^^ this parameter takes ownership of the value
   |    |
   |    in this function
help: consider moving the expression out of the loop so it is only moved once
   |
LL ~     let mut value = iter(vec);
LL ~     while let Some(item) = value.next() {
   |
```

We use the presence of a `break` in the loop that would be affected by
the moved value as a heuristic for "shouldn't be cloned".

Fix #121466.
Diffstat (limited to 'compiler/rustc_mir_transform/src/coverage/counters.rs')
0 files changed, 0 insertions, 0 deletions