| //@ run-pass |
| // Check that coercions can unify if-else, match arms and array elements. |
| |
| // Try to construct if-else chains, matches and arrays out of given expressions. |
| macro_rules! check { |
| ($last:expr $(, $rest:expr)+) => { |
| // Last expression comes first because of whacky ifs and matches. |
| let _ = $(if false { $rest })else+ else { $last }; |
| |
| let _ = match 0 { $(_ if false => $rest,)+ _ => $last }; |
| |
| let _ = [$($rest,)+ $last]; |
| } |
| } |
| |
| // Check all non-uniform cases of 2 and 3 expressions of 2 types. |
| macro_rules! check2 { |
| ($a:expr, $b:expr) => { |
| check!($a, $b); |
| check!($b, $a); |
| |
| check!($a, $a, $b); |
| check!($a, $b, $a); |
| check!($a, $b, $b); |
| |
| check!($b, $a, $a); |
| check!($b, $a, $b); |
| check!($b, $b, $a); |
| } |
| } |
| |
| // Check all non-uniform cases of 2 and 3 expressions of 3 types. |
| macro_rules! check3 { |
| ($a:expr, $b:expr, $c:expr) => { |
| // Delegate to check2 for cases where a type repeats. |
| check2!($a, $b); |
| check2!($b, $c); |
| check2!($a, $c); |
| |
| // Check the remaining cases, i.e., permutations of ($a, $b, $c). |
| check!($a, $b, $c); |
| check!($a, $c, $b); |
| check!($b, $a, $c); |
| check!($b, $c, $a); |
| check!($c, $a, $b); |
| check!($c, $b, $a); |
| } |
| } |
| |
| use std::mem::size_of; |
| |
| fn foo() {} |
| fn bar() {} |
| |
| pub fn main() { |
| check3!(foo, bar, foo as fn()); |
| check3!(size_of::<u8>, size_of::<u16>, size_of::<usize> as fn() -> usize); |
| |
| let s = String::from("bar"); |
| check2!("foo", &s); |
| |
| let a = [1, 2, 3]; |
| let v = vec![1, 2, 3]; |
| check2!(&a[..], &v); |
| |
| // Make sure in-array coercion still works. |
| let _ = [("a", Default::default()), (Default::default(), "b"), (&s, &s)]; |
| } |