extern crate futures03_crate as futures; use auto_enums::enum_derive; enum Enum { A(A), B(B), } impl ::futures::sink::Sink<__Item> for Enum where A: ::futures::sink::Sink<__Item>, B: ::futures::sink::Sink< __Item, Error = >::Error, >, { type Error = >::Error; #[inline] fn poll_ready( self: ::core::pin::Pin<&mut Self>, cx: &mut ::core::task::Context<'_>, ) -> ::core::task::Poll<::core::result::Result<(), Self::Error>> { unsafe { match self.get_unchecked_mut() { Enum::A(x) => { >::poll_ready(::core::pin::Pin::new_unchecked(x), cx) } Enum::B(x) => { >::poll_ready(::core::pin::Pin::new_unchecked(x), cx) } } } } #[inline] fn start_send( self: ::core::pin::Pin<&mut Self>, item: __Item, ) -> ::core::result::Result<(), Self::Error> { unsafe { match self.get_unchecked_mut() { Enum::A(x) => { >::start_send(::core::pin::Pin::new_unchecked(x), item) } Enum::B(x) => { >::start_send(::core::pin::Pin::new_unchecked(x), item) } } } } #[inline] fn poll_flush( self: ::core::pin::Pin<&mut Self>, cx: &mut ::core::task::Context<'_>, ) -> ::core::task::Poll<::core::result::Result<(), Self::Error>> { unsafe { match self.get_unchecked_mut() { Enum::A(x) => { >::poll_flush(::core::pin::Pin::new_unchecked(x), cx) } Enum::B(x) => { >::poll_flush(::core::pin::Pin::new_unchecked(x), cx) } } } } #[inline] fn poll_close( self: ::core::pin::Pin<&mut Self>, cx: &mut ::core::task::Context<'_>, ) -> ::core::task::Poll<::core::result::Result<(), Self::Error>> { unsafe { match self.get_unchecked_mut() { Enum::A(x) => { >::poll_close(::core::pin::Pin::new_unchecked(x), cx) } Enum::B(x) => { >::poll_close(::core::pin::Pin::new_unchecked(x), cx) } } } } } impl ::core::marker::Unpin for Enum where A: ::core::marker::Unpin, B: ::core::marker::Unpin, {} const _: () = { trait MustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl MustNotImplDrop for T {} impl MustNotImplDrop for Enum {} }; fn main() {}