Skip to content

generalization ambiguity #108

Closed
rust-lang/rust
#124827
@lcnr

Description

@lcnr
#![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;
    
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    blocks-craterBlocks running a crater run for breakage w/ new solver

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions