File: 108499.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, sid, trixie
  • size: 893,396 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; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (44 lines) | stat: -rw-r--r-- 1,124 bytes parent folder | download | duplicates (3)
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
40
41
42
43
44
//@ known-bug: #108499

// at lower recursion limits the recursion limit is reached before the bug happens
#![recursion_limit = "2000"]

// this will try to calculate 3↑↑3=3^(3^3)
type Test = <() as Op<((), ()), [[[(); 0]; 0]; 0], [[[(); 0]; 0]; 0],
    [[[[(); 0]; 0]; 0]; 0]>>::Result;

use std::default::Default;

fn main() {
    // force the compiler to actually evaluate `Test`
    println!("{}", Test::default());
}

trait Op<X, A, B, C> {
    type Result;
}

// this recursive function defines the hyperoperation sequence,
// a canonical example of the type of recursion which produces the issue
// the problem seems to be caused by having two recursive calls, the second
// of which depending on the first
impl<
    X: Op<(X, Y), A, [B; 0], [C; 0]>,
    Y: Op<(X, Y), A, X::Result, C>,
    A, B, C,
> Op<(X, Y), A, [[B; 0]; 0], [C; 0]> for () {
    type Result = Y::Result;
}

// base cases
impl<X, A, B> Op<X, A, B, ()> for () {
    type Result = [B; 0];
}

impl<X, A> Op<X, A, [(); 0], [(); 0]> for () {
    type Result = [A; 0];
}

impl<X, A, C> Op<X, A, [(); 0], [[C; 0]; 0]> for () {
    type Result = A;
}