// run-pass // Regression test for #31849: the problem here was actually a performance // cliff, but I'm adding the test for reference. pub trait Upcast { fn upcast(self) -> T; } impl Upcast<(T1, T2)> for (S1,S2) where S1: Upcast, S2: Upcast, { fn upcast(self) -> (T1, T2) { (self.0.upcast(), self.1.upcast()) } } impl Upcast<()> for () { fn upcast(self) -> () { () } } pub trait ToStatic { type Static: 'static; fn to_static(self) -> Self::Static where Self: Sized; } impl ToStatic for (T, U) where T: ToStatic, U: ToStatic { type Static = (T::Static, U::Static); fn to_static(self) -> Self::Static { (self.0.to_static(), self.1.to_static()) } } impl ToStatic for () { type Static = (); fn to_static(self) -> () { () } } trait Factory { type Output; fn build(&self) -> Self::Output; } impl Factory for (S, T) where S: Factory, T: Factory, S::Output: ToStatic, ::Static: Upcast, { type Output = (S::Output, T::Output); fn build(&self) -> Self::Output { (self.0.build().to_static().upcast(), self.1.build()) } } impl Factory for () { type Output = (); fn build(&self) -> Self::Output { () } } fn main() { // More parens, more time. let it = ((((((((((),()),()),()),()),()),()),()),()),()); it.build(); }