rust-lang / trait-system-refactor-initiative

The Rustc Trait System Refactor Initiative
21 stars 0 forks source link

generalization ambiguity #108

Closed lcnr closed 5 months ago

lcnr commented 5 months ago
#![allow(unused)]

trait Trait<'a> {
    type Assoc;
}

impl<'a> Trait<'a> for () {
    type Assoc = ();
}

fn foo<T: for<'a> Trait<'a>>(x: T) -> for<'a> fn(<T as Trait<'a>>::Assoc) {
    |_| ()
}

fn unconstrained<T>() -> T {
    todo!()
}

fn main() {
    // in universe 0
    let mut x = unconstrained();

    let bump: for<'a, 'b> fn(&'a (), &'b ()) = |_, _| ();
    let _: for<'a> fn(&'a (), &'a ()) = bump;
    // in universe 1
    let mut y = Default::default();

    // ?x.0 :> for<'a> fn(<?y.1 as Trait<'a>>::Assoc) ~>
    // ?x.0 instantiated for<'a> fn(<?x'.0 as Trait<'a>>::Assoc)
    x = foo(y);

    // for<'a> fn(<?x'.0 as Trait<'a>>::Assoc) :> <() as Trait<'a>>::Assoc stays ambig
    let _: () = y;

}
lcnr commented 5 months ago

fixed by https://github.com/rust-lang/rust/pull/124827