| //@ 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; | |
| } |