rust/tests/ui/moves
Esteban Küber 5082e6a300 Generalize logic pointing at binding moved into closure
Account not only for `fn` parameters when moving non-`Copy` values into closure, but also for let bindings.

```
error[E0507]: cannot move out of `bar`, a captured variable in an `FnMut` closure
  --> $DIR/borrowck-move-by-capture.rs:9:29
   |
LL |     let bar: Box<_> = Box::new(3);
   |         ---  ------ move occurs because `bar` has type `Box<isize>`, which does not implement the `Copy` trait
   |         |
   |         captured outer variable
LL |     let _g = to_fn_mut(|| {
   |                        -- captured by this `FnMut` closure
LL |         let _h = to_fn_once(move || -> isize { *bar });
   |                             ^^^^^^^^^^^^^^^^   ---- variable moved due to use in closure
   |                             |
   |                             `bar` is moved here
   |
help: consider cloning the value before moving it into the closure
   |
LL ~         let value = bar.clone();
LL ~         let _h = to_fn_once(move || -> isize { value });
   |
```

```
error[E0507]: cannot move out of `y`, a captured variable in an `Fn` closure
  --> $DIR/unboxed-closures-move-upvar-from-non-once-ref-closure.rs:12:9
   |
LL |     let y = vec![format!("World")];
   |         -   ---------------------- move occurs because `y` has type `Vec<String>`, which does not implement the `Copy` trait
   |         |
   |         captured outer variable
LL |     call(|| {
   |          -- captured by this `Fn` closure
LL |         y.into_iter();
   |         ^ ----------- `y` moved due to this method call
   |         |
   |         `y` is moved here
   |
note: `into_iter` takes ownership of the receiver `self`, which moves `y`
  --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
help: you can `clone` the value and consume it, but this might not be your desired behavior
   |
LL |         <Vec<String> as Clone>::clone(&y).into_iter();
   |         +++++++++++++++++++++++++++++++ +
help: consider cloning the value if the performance cost is acceptable
   |
LL |         y.clone().into_iter();
   |          ++++++++
```
2025-07-21 16:21:23 +00:00
..
auxiliary Fix some typos 2024-12-24 11:35:38 +08:00
assignment-of-clone-call-on-ref-due-to-missing-bound.current.fixed Fix next solver handling of shallow trait impl check 2025-03-19 14:40:14 +00:00
assignment-of-clone-call-on-ref-due-to-missing-bound.current.stderr Demonstrate next-solver missing diagnostic 2025-03-19 14:38:23 +00:00
assignment-of-clone-call-on-ref-due-to-missing-bound.next.fixed Fix next solver handling of shallow trait impl check 2025-03-19 14:40:14 +00:00
assignment-of-clone-call-on-ref-due-to-missing-bound.next.stderr Fix next solver handling of shallow trait impl check 2025-03-19 14:40:14 +00:00
assignment-of-clone-call-on-ref-due-to-missing-bound.rs Fix next solver handling of shallow trait impl check 2025-03-19 14:40:14 +00:00
borrow-closures-instead-of-move.rs Suggest borrowing arguments in generic positions when trait bounds are satisfied 2024-11-13 20:29:40 -08:00
borrow-closures-instead-of-move.stderr Suggest borrowing arguments in generic positions when trait bounds are satisfied 2024-11-13 20:29:40 -08:00
do-not-suggest-removing-wrong-ref-pattern-issue-132806.fixed add_move_error_suggestions: use a HIR visitor rather than SourceMap 2024-11-25 20:29:04 -08:00
do-not-suggest-removing-wrong-ref-pattern-issue-132806.rs add_move_error_suggestions: use a HIR visitor rather than SourceMap 2024-11-25 20:29:04 -08:00
do-not-suggest-removing-wrong-ref-pattern-issue-132806.stderr add_move_error_suggestions: use a HIR visitor rather than SourceMap 2024-11-25 20:29:04 -08:00
issue-22536-copy-mustnt-zero.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
issue-22536-copy-mustnt-zero.stderr Update tests 2024-02-07 10:42:01 +08:00
issue-34721.fixed Use non-2015 edition paths in tests that do not test for their resolution 2025-06-03 13:35:31 +02:00
issue-34721.rs Use non-2015 edition paths in tests that do not test for their resolution 2025-06-03 13:35:31 +02:00
issue-34721.stderr Mention type parameter in more cases and don't suggest ~const bound already there 2024-12-07 21:37:13 +00:00
issue-46099-move-in-macro.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
issue-46099-move-in-macro.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-72649-uninit-in-loop.rs Mention when type parameter could be Clone 2024-04-24 22:21:15 +00:00
issue-72649-uninit-in-loop.stderr Mention when type parameter could be Clone 2024-04-24 22:21:15 +00:00
issue-75904-move-closure-loop.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
issue-75904-move-closure-loop.stderr Mention when type parameter could be Clone 2024-04-24 22:21:15 +00:00
issue-99470-move-out-of-some.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
issue-99470-move-out-of-some.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
move-1-unique.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
move-2-unique.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
move-2.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
move-3-unique.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
move-4-unique.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
move-4.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
move-arg-2-unique.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
move-arg-2.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
move-arg.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
move-deref-coercion.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-deref-coercion.stderr Remove CallKind::Deref hack from UseSpans 2025-01-06 03:55:19 +00:00
move-fn-self-receiver.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-fn-self-receiver.stderr Peel off explicit (or implicit) deref before suggesting clone on move error in borrowck 2024-07-26 14:41:56 -04:00
move-guard-same-consts.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-guard-same-consts.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
move-in-guard-1.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-in-guard-1.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
move-in-guard-2.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-in-guard-2.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
move-into-dead-array-1.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-into-dead-array-1.stderr Make array suggestions slightly more accurate 2024-04-15 21:45:47 -04:00
move-into-dead-array-2.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-into-dead-array-2.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
move-nullary-fn.rs tests: remove //@ pretty-expanded usages 2024-11-26 02:50:48 +08:00
move-of-addr-of-mut.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-of-addr-of-mut.stderr Use /* value */ as a placeholder 2024-04-15 21:36:52 -04:00
move-out-of-array-1.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-out-of-array-1.stderr Mention when type parameter could be Clone 2024-04-24 22:21:15 +00:00
move-out-of-array-ref.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-out-of-array-ref.stderr Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-out-of-field.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
move-out-of-slice-1.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-out-of-slice-1.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
move-out-of-slice-2.rs Unimplement unsized_locals 2025-06-13 01:16:36 +02:00
move-out-of-slice-2.stderr Unimplement unsized_locals 2025-06-13 01:16:36 +02:00
move-out-of-tuple-field.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-out-of-tuple-field.stderr Move /src/test to /tests 2023-01-11 09:32:08 +00:00
move-scalar.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
moved-value-on-as-ref-arg.fixed suggest_borrow_generic_arg: instantiate clauses properly 2024-11-17 18:09:36 -08:00
moved-value-on-as-ref-arg.rs suggest_borrow_generic_arg: instantiate clauses properly 2024-11-17 18:09:36 -08:00
moved-value-on-as-ref-arg.stderr Use a common subdiagnostic format for generic borrows 2024-11-13 16:36:23 -08:00
moves-based-on-type-access-to-field.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
moves-based-on-type-access-to-field.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
moves-based-on-type-block-bad.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
moves-based-on-type-block-bad.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
moves-based-on-type-capture-clause-bad.fixed Suggest cloning Arc moved into closure 2025-06-24 18:44:41 +00:00
moves-based-on-type-capture-clause-bad.rs Suggest cloning Arc moved into closure 2025-06-24 18:44:41 +00:00
moves-based-on-type-capture-clause-bad.stderr Suggest cloning Arc moved into closure 2025-06-24 18:44:41 +00:00
moves-based-on-type-capture-clause.rs compiletest: Add a //@ needs-threads directive 2024-03-06 12:35:07 -08:00
moves-based-on-type-cyclic-types-issue-4821.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
moves-based-on-type-cyclic-types-issue-4821.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
moves-based-on-type-distribute-copy-over-paren.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
moves-based-on-type-distribute-copy-over-paren.stderr Move /src/test to /tests 2023-01-11 09:32:08 +00:00
moves-based-on-type-exprs.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
moves-based-on-type-exprs.stderr Don't use method span on clone suggestion 2023-07-10 20:09:28 +00:00
moves-based-on-type-match-bindings.rs compiletest: Make diagnostic kind mandatory on line annotations 2025-04-30 10:44:24 +03:00
moves-based-on-type-match-bindings.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
moves-based-on-type-move-out-of-closure-env-issue-1965.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
moves-based-on-type-move-out-of-closure-env-issue-1965.stderr Generalize logic pointing at binding moved into closure 2025-07-21 16:21:23 +00:00
moves-based-on-type-no-recursive-stack-closure.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
moves-based-on-type-no-recursive-stack-closure.stderr Suggest borrowing arguments in generic positions when trait bounds are satisfied 2024-11-13 20:29:40 -08:00
moves-based-on-type-tuple.rs UI tests: add missing diagnostic kinds where possible 2025-04-08 23:06:31 +03:00
moves-based-on-type-tuple.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
moves-sru-moved-field.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
moves-sru-moved-field.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
needs-clone-through-deref.fixed Silence redundant clone suggestion 2024-04-11 16:41:41 +00:00
needs-clone-through-deref.rs Silence redundant clone suggestion 2024-04-11 16:41:41 +00:00
needs-clone-through-deref.stderr Show diff suggestion format on verbose replacement 2025-02-10 20:21:39 +00:00
nested-loop-moved-value-wrong-continue.rs compiletest: Avoid ignoring empty diagnostics in one more place 2025-04-07 19:43:41 +03:00
nested-loop-moved-value-wrong-continue.stderr compiletest: Avoid ignoring empty diagnostics in one more place 2025-04-07 19:43:41 +03:00
no-capture-arc.rs Suggest cloning Arc moved into closure 2025-06-24 18:44:41 +00:00
no-capture-arc.stderr Suggest cloning Arc moved into closure 2025-06-24 18:44:41 +00:00
no-reuse-move-arc.fixed Suggest cloning Arc moved into closure 2025-06-24 18:44:41 +00:00
no-reuse-move-arc.rs Suggest cloning Arc moved into closure 2025-06-24 18:44:41 +00:00
no-reuse-move-arc.stderr Suggest cloning Arc moved into closure 2025-06-24 18:44:41 +00:00
pin-mut-reborrow-infer-var-issue-107419.fixed [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
pin-mut-reborrow-infer-var-issue-107419.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
pin-mut-reborrow-infer-var-issue-107419.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
pin-mut-reborrow.fixed [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
pin-mut-reborrow.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
pin-mut-reborrow.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
recreating-value-in-loop-condition.rs Add HELP to test 2024-03-17 21:45:03 +00:00
recreating-value-in-loop-condition.stderr Add HELP to test 2024-03-17 21:45:03 +00:00
region-var-in-moved-ty-issue-133118.rs suggest_borrow_generic_arg: instantiate clauses properly 2024-11-17 18:09:36 -08:00
region-var-in-moved-ty-issue-133118.stderr suggest_borrow_generic_arg: instantiate clauses properly 2024-11-17 18:09:36 -08:00
suggest-borrow-for-generic-arg.fixed Fix some typos 2024-12-24 11:35:38 +08:00
suggest-borrow-for-generic-arg.rs Fix some typos 2024-12-24 11:35:38 +08:00
suggest-borrow-for-generic-arg.stderr Suggest borrowing arguments in generic positions when trait bounds are satisfied 2024-11-13 20:29:40 -08:00
suggest-clone-when-some-obligation-is-unmet.fixed Account for .clone() when suggesting <T as Clone>::clone 2024-04-11 16:41:40 +00:00
suggest-clone-when-some-obligation-is-unmet.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
suggest-clone-when-some-obligation-is-unmet.stderr Show diff suggestion format on verbose replacement 2025-02-10 20:21:39 +00:00
suggest-clone.fixed Suggest .clone() in some move errors 2024-04-11 16:41:41 +00:00
suggest-clone.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
suggest-clone.stderr Suggest .clone() in some move errors 2024-04-11 16:41:41 +00:00
use_of_moved_value_clone_suggestions.rs UI tests: add missing diagnostic kinds where possible 2025-04-08 23:06:31 +03:00
use_of_moved_value_clone_suggestions.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
use_of_moved_value_copy_suggestions.fixed UI tests: add missing diagnostic kinds where possible 2025-04-08 23:06:31 +03:00
use_of_moved_value_copy_suggestions.rs UI tests: add missing diagnostic kinds where possible 2025-04-08 23:06:31 +03:00
use_of_moved_value_copy_suggestions.stderr Trim suggestion parts to the subset that is purely additive 2025-02-14 00:44:10 -08:00