File: dont-loop-fulfill-on-region-constraints.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 893,176 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (32 lines) | stat: -rw-r--r-- 862 bytes parent folder | download | duplicates (6)
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: -Znext-solver
//@ 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() {}