blob: a9f00217fb9359ef3a8ad0c6affc5c1bcace0b6f [file]
//! 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() {}