Closed
Description
I have seen a lot of newcomers to futures stumble with Pin<&mut Self>
methods consuming the pin, if possible this seems like a good candidate for a custom diagnostic.
As a self-contained example (playground):
use std::pin::Pin;
struct Foo;
impl Foo {
fn foo(self: Pin<&mut Self>) {}
}
fn main() {
let mut foo = Foo;
let foo = Pin::new(&mut foo);
foo.foo();
foo.foo();
}
currently errors with
Compiling playground v0.0.1 (/playground)
error[E0382]: use of moved value: `foo`
--> src/main.rs:13:5
|
11 | let foo = Pin::new(&mut foo);
| --- move occurs because `foo` has type `std::pin::Pin<&mut Foo>`, which does not implement the `Copy` trait
12 | foo.foo();
| --- value moved here
13 | foo.foo();
| ^^^ value used here after move
error: aborting due to previous error
For more information about this error, try `rustc --explain E0382`.
error: Could not compile `playground`.
To learn more, run the command again with --verbose.
it would be useful if this error included something like
hint: use `foo.as_mut().foo()` to reborrow the `Pin` instead of moving it
Metadata
Metadata
Assignees
Labels
Area: Async & AwaitArea: The borrow checkerArea: Messages for errors, warnings, and lintsArea: Suggestions generated by the compiler applied by `cargo fix`Async-await issues that have been triaged during a working group meeting.Category: An issue proposing an enhancement or a PR with one.Diagnostics: Confusing error or lint; hard to understand for new users.Relevant to the compiler team, which will review and decide on the PR/issue.