| //! Regression test for <https://github.com/rust-lang/rust/issues/135287> |
| //@ revisions: rpass1 rpass2 |
| //@ edition:2021 |
| #![allow(dead_code)] |
| |
| use std::future::Future; |
| use std::marker::PhantomData; |
| use std::pin::Pin; |
| use std::task::{Context, Poll}; |
| |
| #[cfg(rpass1)] |
| struct SourceDocument {} |
| |
| #[cfg(rpass2)] |
| enum SourceDocument {} |
| |
| trait Loader { |
| type Value; |
| fn load(&self) -> impl Future<Output = Self::Value>; |
| } |
| |
| struct SourceDocumentLoader; |
| impl Loader for SourceDocumentLoader { |
| type Value = SourceDocument; |
| async fn load(&self) -> Self::Value { |
| todo!() |
| } |
| } |
| |
| struct ManualSend<T>(T); |
| unsafe impl<T: Send> Send for ManualSend<T> {} |
| |
| struct PendingButCovariant<T>(PhantomData<T>); |
| impl<T> Future for PendingButCovariant<T> { |
| type Output = T; |
| |
| fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> { |
| Poll::Pending |
| } |
| } |
| |
| struct DataLoader<T>(T); |
| impl<T> DataLoader<T> { |
| async fn load_one(&self) -> ManualSend<T::Value> |
| where |
| T: Loader, |
| { |
| PendingButCovariant(PhantomData).await |
| } |
| } |
| |
| trait ContainerType { |
| fn resolve_field(&self) -> impl Future<Output = ()> + Send; |
| } |
| impl ContainerType for () { |
| async fn resolve_field(&self) { |
| let loader = DataLoader(SourceDocumentLoader); |
| loader.load_one().await; |
| } |
| } |
| |
| fn main() {} |