Non-static generators should always be unpin
Closed this issue · 1 comments
compiler-errors commented
#![feature(generators, generator_trait)]
use std::marker::{PhantomPinned, Unpin};
fn assert_unpin<G: Unpin>(_: G) {
}
fn main() {
// Even though this generator holds a `PhantomPinned` in its environment, it
// remains `Unpin`.
assert_unpin(|| {
let pinned = PhantomPinned;
yield;
drop(pinned);
});
}
Just needs special logic added to builtin impls.
compiler-errors commented
Conversely:
use std::marker::Unpin;
fn assert_unpin<T: Unpin>(_: T) {
}
fn main() {
let mut generator = static || {
yield;
};
assert_unpin(generator); //~ ERROR E0277
}passes but it should not.