summaryrefslogtreecommitdiffstats
path: root/tests/ui/closures/closure_no_cap_coerce_many_check_pass.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/closures/closure_no_cap_coerce_many_check_pass.rs')
-rw-r--r--tests/ui/closures/closure_no_cap_coerce_many_check_pass.rs166
1 files changed, 166 insertions, 0 deletions
diff --git a/tests/ui/closures/closure_no_cap_coerce_many_check_pass.rs b/tests/ui/closures/closure_no_cap_coerce_many_check_pass.rs
new file mode 100644
index 000000000..ce461810e
--- /dev/null
+++ b/tests/ui/closures/closure_no_cap_coerce_many_check_pass.rs
@@ -0,0 +1,166 @@
+// check-pass
+// Ensure non-capturing Closure passes CoerceMany.
+fn foo(x: usize) -> usize {
+ 0
+}
+
+fn bar(x: usize) -> usize {
+ 1
+}
+
+fn main() {
+ // One FnDef and one non-capturing Closure
+ let _ = match 0 {
+ 0 => foo,
+ 2 => |a| 2,
+ _ => unimplemented!(),
+ };
+
+ let _ = match 0 {
+ 2 => |a| 2,
+ 0 => foo,
+ _ => unimplemented!(),
+ };
+
+ let _ = [foo, |a| 2];
+ let _ = [|a| 2, foo];
+
+
+
+ // Two FnDefs and one non-capturing Closure
+ let _ = match 0 {
+ 0 => foo,
+ 1 => bar,
+ 2 => |a| 2,
+ _ => unimplemented!(),
+ };
+
+ let _ = match 0 {
+ 0 => foo,
+ 2 => |a| 2,
+ 1 => bar,
+ _ => unimplemented!(),
+ };
+
+ let _ = match 0 {
+ 2 => |a| 2,
+ 0 => foo,
+ 1 => bar,
+ _ => unimplemented!(),
+ };
+
+ let _ = [foo, bar, |a| 2];
+ let _ = [foo, |a| 2, bar];
+ let _ = [|a| 2, foo, bar];
+
+
+
+ // One FnDef and two non-capturing Closures
+ let _ = match 0 {
+ 0 => foo,
+ 1 => |a| 1,
+ 2 => |a| 2,
+ _ => unimplemented!(),
+ };
+
+ let _ = match 0 {
+ 1 => |a| 1,
+ 0 => foo,
+ 2 => |a| 2,
+ _ => unimplemented!(),
+ };
+
+ let _ = match 0 {
+ 1 => |a| 1,
+ 2 => |a| 2,
+ 0 => foo,
+ _ => unimplemented!(),
+ };
+
+ let _ = [foo, |a| 1, |a| 2];
+ let _ = [|a| 1, foo, |a| 2];
+ let _ = [|a| 1, |a| 2, foo];
+
+
+
+ // Three non-capturing Closures
+ let _ = match 0 {
+ 0 => |a: usize| 0,
+ 1 => |a| 1,
+ 2 => |a| 2,
+ _ => unimplemented!(),
+ };
+
+ let _ = [|a: usize| 0, |a| 1, |a| 2];
+
+
+
+ // Three non-capturing Closures variable
+ let clo0 = |a: usize| 0;
+ let clo1 = |a| 1;
+ let clo2 = |a| 2;
+ let _ = match 0 {
+ 0 => clo0,
+ 1 => clo1,
+ 2 => clo2,
+ _ => unimplemented!(),
+ };
+
+ let clo0 = |a: usize| 0;
+ let clo1 = |a| 1;
+ let clo2 = |a| 2;
+ let _ = [clo0, clo1, clo2];
+
+
+
+ // --- Function pointer related part
+
+ // Closure is not in a variable
+ type FnPointer = fn(usize) -> usize;
+
+ let _ = match 0 {
+ 0 => foo as FnPointer,
+ 2 => |a| 2,
+ _ => unimplemented!(),
+ };
+ let _ = match 0 {
+ 2 => |a| 2,
+ 0 => foo as FnPointer,
+ _ => unimplemented!(),
+ };
+ let _ = [foo as FnPointer, |a| 2];
+ let _ = [|a| 2, foo as FnPointer];
+ let _ = [foo, bar, |x| x];
+ let _ = [foo as FnPointer, bar, |x| x];
+ let _ = [foo, bar as FnPointer, |x| x];
+ let _ = [foo, bar, (|x| x) as FnPointer];
+ let _ = [foo as FnPointer, bar as FnPointer, |x| x];
+
+ // Closure is in a variable
+ let x = |a| 2;
+ let _ = match 0 {
+ 0 => foo as FnPointer,
+ 2 => x,
+ _ => unimplemented!(),
+ };
+ let x = |a| 2;
+ let _ = match 0 {
+ 2 => x,
+ 0 => foo as FnPointer,
+ _ => unimplemented!(),
+ };
+ let x = |a| 2;
+ let _ = [foo as FnPointer, x];
+ let _ = [x, foo as FnPointer];
+
+ let x = |a| 2;
+ let _ = [foo, bar, x];
+ let x: FnPointer = |a| 2;
+ let _ = [foo, bar, x];
+ let x = |a| 2;
+ let _ = [foo, bar as FnPointer, x];
+ let x = |a| 2;
+ let _ = [foo as FnPointer, bar, x];
+ let x = |a| 2;
+ let _ = [foo as FnPointer, bar as FnPointer, x];
+}