summaryrefslogtreecommitdiffstats
path: root/tests/ui/traits/new-solver/canonical-ty-var-eq-in-response.rs
blob: d1c6b1077e8efd0d2d35cb3b1c60abd8c75b7b00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// check-pass
// compile-flags: -Ztrait-solver=next

trait Mirror {
    type Item;
}

struct Wrapper<T>(T);
impl<T> Mirror for Wrapper<T> {
    type Item = T;
}

fn mirror<T>()
where
    Wrapper<T>: Mirror<Item = i32>,
{
}

fn main() {
    mirror::<_ /* ?0 */>();

    // Solving `<Wrapper<?0> as Mirror>::Item = i32`

    // First, we replace the term with a fresh infer var:
    // `<Wrapper<?0> as Mirror>::Item = ?1`

    // We select the impl candidate on line #6, which leads us to learn that
    // `?0 == ?1`.

    // That should be reflected in our canonical response, which should have
    // `^0 = ^0, ^1 = ^0`
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // !! We used to return a totally unconstrained response here :< !!
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    // Then, during the "equate term" part of the projection solving, we
    // instantiate the response from the unconstrained projection predicate,
    // and equate `?0 == i32`.
}