Code change:
<ins> error[E0382]: use of moved value: `bar` --> $DIR/moved-value-on-as-ref-arg.rs:27:16 | LL |     let bar = Bar; |         --- move occurs because `bar` has type `Bar`, which does not implement the `Copy` trait LL |     foo(bar); |         --- value moved here LL |     let _baa = bar; |                ^^^ value used here after move | help: borrow the value to avoid moving it | LL |     foo(&bar); |         + error[E0382]: use of moved value: `bar` --> $DIR/moved-value-on-as-ref-arg.rs:30:16 | LL |     let mut bar = Bar; |         ------- move occurs because `bar` has type `Bar`, which does not implement the `Copy` trait LL |     qux(bar); |         --- value moved here LL |     let _baa = bar; |                ^^^ value used here after move | note: if `Bar` implemented `Clone`, you could clone the value --> $DIR/moved-value-on-as-ref-arg.rs:5:1 | LL | struct Bar; | ^^^^^^^^^^ consider implementing `Clone` for this type ... LL |     qux(bar); |         --- you could clone this value help: borrow the value to avoid moving it | LL |     qux(&mut bar); |         ++++ error[E0382]: use of moved value: `bar` --> $DIR/moved-value-on-as-ref-arg.rs:33:16 | LL |     let bar = Bar; |         --- move occurs because `bar` has type `Bar`, which does not implement the `Copy` trait LL |     bat(bar); |         --- value moved here LL |     let _baa = bar; |                ^^^ value used here after move | help: borrow the value to avoid moving it | LL |     bat(&bar); |         + error[E0382]: use of moved value: `bar` --> $DIR/moved-value-on-as-ref-arg.rs:36:16 | LL |     let mut bar = Bar; |         ------- move occurs because `bar` has type `Bar`, which does not implement the `Copy` trait LL |     baz(bar); |         --- value moved here LL |     let _baa = bar; |                ^^^ value used here after move | note: if `Bar` implemented `Clone`, you could clone the value --> $DIR/moved-value-on-as-ref-arg.rs:5:1 | LL | struct Bar; | ^^^^^^^^^^ consider implementing `Clone` for this type ... LL |     baz(bar); |         --- you could clone this value help: borrow the value to avoid moving it | LL |     baz(&mut bar); |         ++++ error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0382`. </ins>

Related discussion:
text: ... and trying to use afterwards, which triggers Example: currently yields I suggest that it should also contain
AsRef is a library trait, so IMO we should not do that. Also to me "value moved here" is pretty much the "you need to use this as reference".
While this might be obvious to us, I've had students struggling strongly with these errors. When I tell them "just add an ampersand", they're like "Oh, that makes total sense". I don't see that as reason not to do it. Could you elaborate?
This should also handle , , .
and aren't as clear, since the object will be modified, so the user might also want to , but that can later be signalled through and/or multiple suggestions
Obvious way of doing this would involve making a language item or otherwise special in some other way. To me it is pretty clear that language and the standard library should be as independent as possible and IME a diagnostic is a pretty minor gain for the special casing involved. One could imagine a similar diagnostic independent of library traits (e.g. always suggest a reference for "value moved here" if there’s a trait implementation for also), but then the problem of suggestion not being always correct kicks in. So, I will not oppose a change that implements this without making any more of the libstd/libcore special and is always correct, but I have no idea how anybody even begin approaching this problem.
I fully agree that that is not desirable In clippy we have similar diagnostics which in this case would simply check for (see for all the paths that we resolve manually).
Triage: this still produces the same error message. Given the concerns voiced above, should this issue stay open? I suppose we could leave this open should someone come up with a clever way to handle this without special casing , but that seems unlikely.
We have diagnostic items nowadays, so we can make a diagnostic item and detect in in these situations. Though I'm not sure how easy it is to detect. The error may get reported far too late
Current :