//@ build-fail //@ edition: 2021 #![feature(async_closure, noop_waker)] use std::future::Future; use std::pin::pin; use std::task::*; pub fn block_on(fut: impl Future) -> T { let mut fut = pin!(fut); // Poll loop, just to test the future... let ctx = &mut Context::from_waker(Waker::noop()); loop { match fut.as_mut().poll(ctx) { Poll::Pending => {} Poll::Ready(t) => break t, } } } trait Blah { async fn iter(&mut self, iterator: T) where T: IntoIterator; } impl Blah for () { async fn iter(&mut self, iterator: T) //~^ ERROR recursion in an async fn requires boxing where T: IntoIterator, { Blah::iter(self, iterator).await } } struct Wrap { t: T, } impl Wrap where T: Blah, { async fn ice(&mut self) { let arr: [(); 0] = []; self.t.iter(arr.into_iter()).await; } } fn main() { block_on(async { let mut t = Wrap { t: () }; t.ice(); }) }