Skip to content

Commit 5d7eda2

Browse files
committed
fix suggestion in E0373 for !Unpin coroutines
Coroutines can be prefixed with the `static` keyword to make them `!Unpin`. However, given the following function: ```rust 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.
1 parent d84b903 commit 5d7eda2

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

+4
Original file line numberDiff line numberDiff line change
@@ -3343,6 +3343,10 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
33433343
} else if string.starts_with("gen") {
33443344
// `gen` is 3 chars long
33453345
Some(3)
3346+
} else if string.starts_with("static") {
3347+
// `static` is 6 chars long
3348+
// This is used for `!Unpin` coroutines
3349+
Some(6)
33463350
} else {
33473351
None
33483352
};

0 commit comments

Comments
 (0)