]> git.proxmox.com Git - rustc.git/blob - tests/ui/closures/issue-72408-nested-closures-exponential.rs
New upstream version 1.68.2+dfsg1
[rustc.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 }