#![feature(specialization)] //~ WARN the feature `specialization` is incomplete // Regression test for a specialization-related ICE (#39448). trait A: Sized { fn foo(self, _: Self) -> Self { self } } impl A for u8 {} impl A for u16 {} impl FromA for u16 { fn from(x: u8) -> u16 { x as u16 } } trait FromA { fn from(t: T) -> Self; } impl> FromA for U { //~^ ERROR cycle detected when computing whether impls specialize one another default fn from(x: T) -> Self { ToA::to(x) } } trait ToA { fn to(self) -> T; } impl ToA for T where U: FromA, { fn to(self) -> U { U::from(self) } } #[allow(dead_code)] fn foo(x: T, y: U) -> U { x.foo(y.to()).to() } fn main() { let z = foo(8u8, 1u16); }