| #![feature(specialization)] | |
| // 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<u8> for u16 { | |
| fn from(x: u8) -> u16 { | |
| x as u16 | |
| } | |
| } | |
| trait FromA<T> { | |
| fn from(t: T) -> Self; | |
| } | |
| impl<T: A, U: A + FromA<T>> FromA<T> for U { | |
| //~^ ERROR cycle detected when computing whether impls specialize one another | |
| default fn from(x: T) -> Self { | |
| ToA::to(x) | |
| } | |
| } | |
| trait ToA<T> { | |
| fn to(self) -> T; | |
| } | |
| impl<T, U> ToA<U> for T | |
| where | |
| U: FromA<T>, | |
| { | |
| fn to(self) -> U { | |
| U::from(self) | |
| } | |
| } | |
| #[allow(dead_code)] | |
| fn foo<T: A, U: A>(x: T, y: U) -> U { | |
| x.foo(y.to()).to() | |
| } | |
| fn main() { | |
| let z = foo(8u8, 1u16); | |
| } |