Rollup merge of #70535 - jonas-schievink:graph-refactor, r=nikomatsakis
Track the finalizing node in the specialization graph Fixes https://github.com/rust-lang/rust/issues/70419 Fixes https://github.com/rust-lang/rust/issues/70442 r? @eddyb
This commit is contained in:
commit
0e0d84c13c
9 changed files with 148 additions and 120 deletions
23
src/test/ui/specialization/issue-70442.rs
Normal file
23
src/test/ui/specialization/issue-70442.rs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#![feature(specialization)]
|
||||
|
||||
// check-pass
|
||||
|
||||
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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue