| //@ revisions: explicit implicit | |
| //@ run-pass | |
| #![feature(deref_patterns)] | |
| #![allow(incomplete_features)] | |
| use std::rc::Rc; | |
| #[cfg(explicit)] | |
| fn simple_vec(vec: Vec<u32>) -> u32 { | |
| match vec { | |
| deref!([]) => 100, | |
| deref!([x]) if x == 4 => x + 4, | |
| deref!([x]) => x, | |
| deref!([1, x]) => x + 200, | |
| deref!(ref slice) => slice.iter().sum(), | |
| } | |
| } | |
| #[cfg(implicit)] | |
| fn simple_vec(vec: Vec<u32>) -> u32 { | |
| match vec { | |
| [] => 100, | |
| [x] if x == 4 => x + 4, | |
| [x] => x, | |
| [1, x] => x + 200, | |
| deref!(ref slice) => slice.iter().sum(), | |
| } | |
| } | |
| #[cfg(explicit)] | |
| fn nested_vec(vecvec: Vec<Vec<u32>>) -> u32 { | |
| match vecvec { | |
| deref!([]) => 0, | |
| deref!([deref!([x])]) => x, | |
| deref!([deref!([0, x]) | deref!([1, x])]) => x, | |
| deref!([ref x]) => x.iter().sum(), | |
| deref!([deref!([]), deref!([1, x, y])]) => y - x, | |
| _ => 2000, | |
| } | |
| } | |
| #[cfg(implicit)] | |
| fn nested_vec(vecvec: Vec<Vec<u32>>) -> u32 { | |
| match vecvec { | |
| [] => 0, | |
| [[x]] => x, | |
| [[0, x] | [1, x]] => x, | |
| [ref x] => x.iter().sum(), | |
| [[], [1, x, y]] => y - x, | |
| _ => 2000, | |
| } | |
| } | |
| #[cfg(explicit)] | |
| fn ref_mut(val: u32) -> u32 { | |
| let mut b = vec![0u32]; | |
| match &mut b { | |
| deref!([_x]) if false => unreachable!(), | |
| deref!([x]) => { | |
| *x = val; | |
| } | |
| _ => unreachable!(), | |
| } | |
| let deref!([x]) = &b else { unreachable!() }; | |
| *x | |
| } | |
| #[cfg(implicit)] | |
| fn ref_mut(val: u32) -> u32 { | |
| let mut b = vec![0u32]; | |
| match &mut b { | |
| [_x] if false => unreachable!(), | |
| [x] => { | |
| *x = val; | |
| } | |
| _ => unreachable!(), | |
| } | |
| let [x] = &b else { unreachable!() }; | |
| *x | |
| } | |
| #[cfg(explicit)] | |
| #[rustfmt::skip] | |
| fn or_and_guard(tuple: (u32, u32)) -> u32 { | |
| let mut sum = 0; | |
| let b = Rc::new(tuple); | |
| match b { | |
| deref!((x, _) | (_, x)) if { sum += x; false } => {}, | |
| _ => {}, | |
| } | |
| sum | |
| } | |
| #[cfg(implicit)] | |
| #[rustfmt::skip] | |
| fn or_and_guard(tuple: (u32, u32)) -> u32 { | |
| let mut sum = 0; | |
| let b = Rc::new(tuple); | |
| match b { | |
| (x, _) | (_, x) if { sum += x; false } => {}, | |
| _ => {}, | |
| } | |
| sum | |
| } | |
| fn main() { | |
| assert_eq!(simple_vec(vec![1]), 1); | |
| assert_eq!(simple_vec(vec![1, 2]), 202); | |
| assert_eq!(simple_vec(vec![1, 2, 3]), 6); | |
| assert_eq!(simple_vec(vec![4]), 8); | |
| assert_eq!(nested_vec(vec![vec![0, 42]]), 42); | |
| assert_eq!(nested_vec(vec![vec![1, 42]]), 42); | |
| assert_eq!(nested_vec(vec![vec![1, 2, 3]]), 6); | |
| assert_eq!(nested_vec(vec![vec![], vec![1, 2, 3]]), 1); | |
| assert_eq!(ref_mut(42), 42); | |
| assert_eq!(or_and_guard((10, 32)), 42); | |
| } |