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