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`.
}
|