]> git.lizzy.rs Git - rust.git/blob - tests/ui/closures/issue-72408-nested-closures-exponential.rs
Rollup merge of #106836 - ibraheemdev:sync-sender-spin, r=Amanieu
[rust.git] / tests / ui / closures / issue-72408-nested-closures-exponential.rs
1 // build-pass
2
3 // Closures include captured types twice in a type tree.
4 //
5 // Wrapping one closure with another leads to doubling
6 // the amount of types in the type tree.
7 //
8 // This test ensures that rust can handle
9 // deeply nested type trees with a lot
10 // of duplicated subtrees.
11
12 fn dup(f: impl Fn(i32) -> i32) -> impl Fn(i32) -> i32 {
13     move |a| f(a * 2)
14 }
15
16 fn main() {
17     let f = |a| a;
18
19     let f = dup(f);
20     let f = dup(f);
21     let f = dup(f);
22     let f = dup(f);
23     let f = dup(f);
24
25     let f = dup(f);
26     let f = dup(f);
27     let f = dup(f);
28     let f = dup(f);
29     let f = dup(f);
30
31     let f = dup(f);
32     let f = dup(f);
33     let f = dup(f);
34     let f = dup(f);
35     let f = dup(f);
36
37     let f = dup(f);
38     let f = dup(f);
39     let f = dup(f);
40     let f = dup(f);
41     let f = dup(f);
42
43     // Compiler dies around here if it tries
44     // to walk the tree exhaustively.
45
46     let f = dup(f);
47     let f = dup(f);
48     let f = dup(f);
49     let f = dup(f);
50     let f = dup(f);
51
52     let f = dup(f);
53     let f = dup(f);
54     let f = dup(f);
55     let f = dup(f);
56     let f = dup(f);
57
58     println!("Type size was at least {}", f(1));
59 }