]> git.lizzy.rs Git - rust.git/blob - tests/ui/closures/closure_no_cap_coerce_many_check_pass.rs
Rollup merge of #106144 - tgross35:patch-1, r=Mark-Simulacrum
[rust.git] / tests / ui / closures / closure_no_cap_coerce_many_check_pass.rs
1 // check-pass
2 // Ensure non-capturing Closure passes CoerceMany.
3 fn foo(x: usize) -> usize {
4     0
5 }
6
7 fn bar(x: usize) -> usize {
8     1
9 }
10
11 fn main() {
12     // One FnDef and one non-capturing Closure
13     let _ = match 0 {
14         0 => foo,
15         2 => |a| 2,
16         _ => unimplemented!(),
17     };
18
19     let _ = match 0 {
20         2 => |a| 2,
21         0 => foo,
22         _ => unimplemented!(),
23     };
24
25     let _ = [foo, |a| 2];
26     let _ = [|a| 2, foo];
27
28
29
30     // Two FnDefs and one non-capturing Closure
31     let _ = match 0 {
32         0 => foo,
33         1 => bar,
34         2 => |a| 2,
35         _ => unimplemented!(),
36     };
37
38     let _ = match 0 {
39         0 => foo,
40         2 => |a| 2,
41         1 => bar,
42         _ => unimplemented!(),
43     };
44
45     let _ = match 0 {
46         2 => |a| 2,
47         0 => foo,
48         1 => bar,
49         _ => unimplemented!(),
50     };
51
52     let _ = [foo, bar, |a| 2];
53     let _ = [foo, |a| 2, bar];
54     let _ = [|a| 2, foo, bar];
55
56
57
58     // One FnDef and two non-capturing Closures
59     let _ = match 0 {
60         0 => foo,
61         1 => |a| 1,
62         2 => |a| 2,
63         _ => unimplemented!(),
64     };
65
66     let _ = match 0 {
67         1 => |a| 1,
68         0 => foo,
69         2 => |a| 2,
70         _ => unimplemented!(),
71     };
72
73     let _ = match 0 {
74         1 => |a| 1,
75         2 => |a| 2,
76         0 => foo,
77         _ => unimplemented!(),
78     };
79
80     let _ = [foo, |a| 1, |a| 2];
81     let _ = [|a| 1, foo, |a| 2];
82     let _ = [|a| 1, |a| 2, foo];
83
84
85
86     // Three non-capturing Closures
87     let _ = match 0 {
88         0 => |a: usize| 0,
89         1 => |a| 1,
90         2 => |a| 2,
91         _ => unimplemented!(),
92     };
93
94     let _ = [|a: usize| 0, |a| 1, |a| 2];
95
96
97
98     // Three non-capturing Closures variable
99     let clo0 = |a: usize| 0;
100     let clo1 = |a| 1;
101     let clo2 = |a| 2;
102     let _ = match 0 {
103         0 => clo0,
104         1 => clo1,
105         2 => clo2,
106         _ => unimplemented!(),
107     };
108
109     let clo0 = |a: usize| 0;
110     let clo1 = |a| 1;
111     let clo2 = |a| 2;
112     let _ = [clo0, clo1, clo2];
113
114
115
116     // --- Function pointer related part
117
118     // Closure is not in a variable
119     type FnPointer = fn(usize) -> usize;
120
121     let _ = match 0 {
122         0 => foo as FnPointer,
123         2 => |a| 2,
124         _ => unimplemented!(),
125     };
126     let _ = match 0 {
127         2 => |a| 2,
128         0 => foo as FnPointer,
129         _ => unimplemented!(),
130     };
131     let _ = [foo as FnPointer, |a| 2];
132     let _ = [|a| 2, foo as FnPointer];
133     let _ = [foo, bar, |x| x];
134     let _ = [foo as FnPointer, bar, |x| x];
135     let _ = [foo, bar as FnPointer, |x| x];
136     let _ = [foo, bar, (|x| x) as FnPointer];
137     let _ = [foo as FnPointer, bar as FnPointer, |x| x];
138
139     // Closure is in a variable
140     let x = |a| 2;
141     let _ = match 0 {
142         0 => foo as FnPointer,
143         2 => x,
144         _ => unimplemented!(),
145     };
146     let x = |a| 2;
147     let _ = match 0 {
148         2 => x,
149         0 => foo as FnPointer,
150         _ => unimplemented!(),
151     };
152     let x = |a| 2;
153     let _ = [foo as FnPointer, x];
154     let _ = [x, foo as FnPointer];
155
156     let x = |a| 2;
157     let _ = [foo, bar, x];
158     let x: FnPointer = |a| 2;
159     let _ = [foo, bar, x];
160     let x = |a| 2;
161     let _ = [foo, bar as FnPointer, x];
162     let x = |a| 2;
163     let _ = [foo as FnPointer, bar, x];
164     let x = |a| 2;
165     let _ = [foo as FnPointer, bar as FnPointer, x];
166 }