mirror of
https://github.com/rust-lang/rust
synced 2024-09-05 16:57:03 +00:00
167 lines
3.2 KiB
Rust
167 lines
3.2 KiB
Rust
//@ 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];
|
|
}
|