summaryrefslogtreecommitdiffstats
path: root/tests/ui/traits/new-solver/dont-loop-fulfill-on-region-constraints.rs
blob: b241e3bf865211c3997a428d240b83b78bb2b3dd (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
// compile-flags: -Ztrait-solver=next
// check-pass

trait Eq<'a, 'b, T> {}

trait Ambig {}
impl Ambig for () {}

impl<'a, T> Eq<'a, 'a, T> for () where T: Ambig {}

fn eq<'a, 'b, T>(t: T)
where
    (): Eq<'a, 'b, T>,
{
}

fn test<'r>() {
    let mut x = Default::default();

    // When we evaluate `(): Eq<'r, 'r, ?0>` we uniquify the regions.
    // That leads us to evaluate `(): Eq<'?0, '?1, ?0>`. The response of this
    // will be ambiguous (because `?0: Ambig` is ambig) and also not an "identity"
    // response, since the region constraints will contain `'?0 == '?1` (so
    // `is_changed` will return true). Since it's both ambig and changed,
    // fulfillment will both re-register the goal AND loop again. This hits the
    // overflow limit. This should neither be considered overflow, nor ICE.
    eq::<'r, 'r, _>(x);

    x = ();
}

fn main() {}