| #![feature(impl_trait_in_assoc_type)] |
| |
| //@ edition:2021 |
| |
| use std::future::Future; |
| |
| trait Foo { |
| type T; |
| type Fut2: Future<Output = Self::T>; // ICE got triggered with traits other than Future here |
| type Fut: Future<Output = Self::Fut2>; |
| fn get_fut(&self) -> Self::Fut; |
| } |
| |
| struct Implementor; |
| |
| impl Foo for Implementor { |
| type T = u64; |
| type Fut2 = impl Future<Output = u64>; |
| type Fut = impl Future<Output = Self::Fut2>; |
| |
| fn get_fut(&self) -> Self::Fut { |
| //~^ ERROR `{integer}` is not a future |
| async move { |
| 42 |
| // 42 does not impl Future and rustc does actually point out the error, |
| // but rustc used to panic. |
| // Putting a valid Future here always worked fine. |
| } |
| } |
| } |
| |
| fn main() {} |