Closed
Description
The following example ices the compiler:
#![feature(specialization)]
trait A : Sized {
fn foo(self, _: Self) -> Self { self }
}
impl A for u8 {}
impl A for u16 {}
// requires specialization:
impl FromA<u8> for u16 {
fn from(x: u8) -> u16 { x as u16 }
}
trait FromA<T> {
fn from(T) -> Self;
}
//impl<T: A, U: A > FromA<T> for U { // no ICE
impl<T: A, U: A + FromA<T>> FromA<T> for U { // ICE
default fn from(x: T) -> Self { // specialization: :(
ToA::to(x)
}
}
trait ToA<T> {
fn to(self) -> T;
}
// From implies Into
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);
}