-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Closed
Labels
A-specializationArea: Trait impl specializationArea: Trait impl specializationE-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.
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);
}
Metadata
Metadata
Assignees
Labels
A-specializationArea: Trait impl specializationArea: Trait impl specializationE-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.