pin-project icon indicating copy to clipboard operation
pin-project copied to clipboard

Allow #[pin_project(!Unpin)] to `impl !Unpin`

Open ssbr opened this issue 3 years ago • 3 comments

Suppose I have the following trait definition:

trait Trait {}
impl<T: Unpin> Trait for T {}

And I use it from another crate. Then this will not have overlapping impls:

struct Struct;
impl !Unpin for Struct {}
impl Trait for Struct {}

... because Rust understands that this doesn't overlap with the blanket impl in the trait definition. But this will not work:

struct Struct2(std::marker::PhantomPinned);
impl Trait for Struct {}

Nor will any other trick that isn't a straight up impl !Unpin.

Right now, if you use pin_project with a struct, you cannot impl !Unpin for that struct, which means that struct cannot implement Trait if it does not fall under the blanket impl. Would you accept a PR adding some way to impl !Unpin? For example, something like:

// creates an `impl !Unpin`, instead of an impl Unpin conditional on the impossible
#[pin_project(!Unpin=negative_impls)]
struct Struct { ... }

( In particular, I want this for https://github.com/google/crubit/blob/main/rs_bindings_from_cc/support/ctor.rs )

ssbr avatar Apr 21 '22 21:04 ssbr

I'm not opposed to supporting unstable features under an explicit option.

However, negative_impls breaks pin_project's soundness (#340), so I prefer not to provide features that require negative_impls to be enabled until that problem is fixed.

taiki-e avatar May 16 '22 14:05 taiki-e