| //@ edition:2018 | |
| //@ revisions: rpass1 | |
| // Regression test for #86753. The `type_implements_trait` query (since moved to a method) | |
| // was encountering an ICE during incremental testing when hashing its arguments. | |
| #![warn(rust_2021_compatibility)] | |
| use std::future::Future; | |
| use std::pin::Pin; | |
| use std::task::{Poll, Context}; | |
| struct LocalSet {} | |
| struct RunUntil<'a, F> { | |
| _local_set: &'a LocalSet, | |
| _future: F, | |
| } | |
| impl<'a, F> RunUntil<'a, F> { | |
| fn project<'pin>(self: Pin<&'pin mut Self>) -> Projection<'pin, 'a, F> { | |
| unimplemented!() | |
| } | |
| } | |
| struct Projection<'pin, 'a, F> | |
| where | |
| RunUntil<'a, F>: 'pin, | |
| { | |
| pub local_set: &'pin mut &'a LocalSet, | |
| pub future: Pin<&'pin mut F>, | |
| } | |
| impl LocalSet { | |
| fn with<T>(&self, _f: impl FnOnce() -> T) -> T { | |
| unimplemented!() | |
| } | |
| } | |
| impl<T: Future> Future for RunUntil<'_, T> { | |
| type Output = T::Output; | |
| fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { | |
| let me = self.project(); | |
| me.local_set.with(|| { | |
| let _ = cx.waker(); | |
| let f = me.future; | |
| let _ = f.poll(cx); | |
| Poll::Pending | |
| }) | |
| } | |
| } | |
| fn main() {} |