29a630eb72
We already handle this case this way on the coherence side, and it matches the new solver's behaviour. While there is some breakage around type-alias-impl-trait (see new "type annotations needed" in tests/ui/type-alias-impl-trait/issue-84660-unsoundness.rs), no stable code breaks, and no new stable code is accepted.
47 lines
801 B
Rust
47 lines
801 B
Rust
#![feature(specialization)] //~ WARN the feature `specialization` is incomplete
|
|
|
|
trait Foo: Copy + ToString {}
|
|
|
|
impl<T: Copy + ToString> Foo for T {}
|
|
|
|
fn hide<T: Foo>(x: T) -> impl Foo {
|
|
x
|
|
}
|
|
|
|
fn two(x: bool) -> impl Foo {
|
|
if x {
|
|
return 1_i32;
|
|
}
|
|
0_u32
|
|
//~^ ERROR mismatched types
|
|
//~| expected `i32`, found `u32`
|
|
}
|
|
|
|
fn sum_to(n: u32) -> impl Foo {
|
|
if n == 0 {
|
|
0
|
|
} else {
|
|
n + sum_to(n - 1)
|
|
//~^ ERROR cannot satisfy `<u32 as Add<impl Foo>>::Output == i32`
|
|
}
|
|
}
|
|
|
|
trait Leak: Sized {
|
|
type T;
|
|
fn leak(self) -> Self::T;
|
|
}
|
|
impl<T> Leak for T {
|
|
default type T = ();
|
|
default fn leak(self) -> Self::T {
|
|
panic!()
|
|
}
|
|
}
|
|
impl Leak for i32 {
|
|
type T = i32;
|
|
fn leak(self) -> i32 {
|
|
self
|
|
}
|
|
}
|
|
|
|
fn main() {}
|