fix suggestion in E0373 for !Unpin coroutines by jwong101 · Pull Request #125301 · rust-lang/rust (original) (raw)

Coroutines can be prefixed with the static keyword to make them
!Unpin.
However, given the following function:

fn check() -> impl Sized { let x = 0; #[coroutine] static || { yield; x } }

We currently suggest prefixing move before static, which is
syntactically incorrect:

error[E0373]: coroutine may outlive the current function, but it borrows
...
 --> src/main.rs:6:5
  |
6 |     static || {
  |     ^^^^^^^^^ may outlive borrowed value `x`
7 |         yield;
8 |         x
  |         - `x` is borrowed here
  |
note: coroutine is returned here
 --> src/main.rs:6:5
  |
6 | /     static || {
7 | |         yield;
8 | |         x
9 | |     }
  | |_____^
help: to force the coroutine to take ownership of `x` (and any other
referenced variables), use the `move` keyword
  |     // this is syntactically incorrect, it should be `static move ||`
6 |     move static || {
  |     ++++

This PR suggests adding move after static for these coroutines.

I also added a UI test for this case.