2020-05-17 08:22:48 +00:00
|
|
|
#![feature(specialization)] //~ WARN the feature `specialization` is incomplete
|
2020-03-29 00:01:32 +00:00
|
|
|
|
2024-02-16 20:02:50 +00:00
|
|
|
//@ check-pass
|
2020-03-29 00:01:32 +00:00
|
|
|
|
|
|
|
trait Trait {
|
|
|
|
type Assoc;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> Trait for T {
|
|
|
|
default type Assoc = bool;
|
|
|
|
}
|
|
|
|
|
|
|
|
// This impl inherits the `Assoc` definition from above and "locks it in", or finalizes it, making
|
|
|
|
// child impls unable to further specialize it. However, since the specialization graph didn't
|
|
|
|
// correctly track this, we would refuse to project `Assoc` from this impl, even though that should
|
|
|
|
// happen for items that are final.
|
|
|
|
impl Trait for () {}
|
|
|
|
|
|
|
|
fn foo<X: Trait<Assoc=bool>>() {}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
foo::<()>(); // `<() as Trait>::Assoc` is normalized to `bool` correctly
|
|
|
|
}
|