// run-pass #![allow(unused)] fn main() { } fn foo() { let b = mk::< Forward<(Box>,)>, >(); b.map_err(|_| ()).join(); } fn mk() -> T { loop {} } impl, E> Future for (I,) { type Error = E; } struct Forward { _a: T, } impl Future for Forward where T::Error: From, { type Error = T::Error; } trait Future { type Error; fn map_err(self, _: F) -> (Self, F) where F: FnOnce(Self::Error) -> E, Self: Sized, { loop {} } fn join(self) -> (MaybeDone, ()) where Self: Sized, { loop {} } } impl Future for Box { type Error = S::Error; } enum MaybeDone { _Done(A::Error), } impl Future for (A, F) where F: FnOnce(A::Error) -> U, { type Error = U; }