Closed
Description
struct Foo;
impl !Send for Foo {}
let _: impl Send = || {
let guard = Foo;
drop(guard);
yield;
};
(full playground) fails with
error[E0277]: `Foo` cannot be sent between threads safely
--> src/main.rs:14:12
|
14 | let _: impl Send = || {
| ^^^^^^^^^ `Foo` cannot be sent between threads safely
|
= help: within `[generator@src/main.rs:14:24: 18:6 {Foo, ()}]`, the trait `std::marker::Send` is not implemented for `Foo`
= note: required because it appears within the type `{Foo, ()}`
= note: required because it appears within the type `[generator@src/main.rs:14:24: 18:6 {Foo, ()}]`
The guard should be dead and deallocated before the yield point so shouldn't appear in the generator type and affect the Send
ness. Wrapping the guard in a new scope before the yield
avoids this (included in the playground). First noticed in relation to async functions on u.rl.o.
Metadata
Metadata
Assignees
Labels
Area: Async & AwaitArea: CoroutinesArea: Type systemAsync-await issues that have been triaged during a working group meeting.Category: An issue proposing an enhancement or a PR with one.Low priorityRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the language team, which will review and decide on the PR/issue.
Type
Projects
Status
Done