2025-03-09 05:07:11 +00:00
|
|
|
//@ revisions: explicit implicit
|
2024-03-09 02:29:52 +00:00
|
|
|
//@ run-pass
|
|
|
|
#![feature(deref_patterns)]
|
|
|
|
#![allow(incomplete_features)]
|
|
|
|
|
2025-03-17 01:21:00 +00:00
|
|
|
use std::rc::Rc;
|
|
|
|
|
2025-03-09 05:07:11 +00:00
|
|
|
#[cfg(explicit)]
|
2024-03-09 02:29:52 +00:00
|
|
|
fn simple_vec(vec: Vec<u32>) -> u32 {
|
|
|
|
match vec {
|
|
|
|
deref!([]) => 100,
|
2024-03-09 15:10:45 +00:00
|
|
|
deref!([x]) if x == 4 => x + 4,
|
2024-03-09 02:29:52 +00:00
|
|
|
deref!([x]) => x,
|
|
|
|
deref!([1, x]) => x + 200,
|
|
|
|
deref!(ref slice) => slice.iter().sum(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-03-09 05:07:11 +00:00
|
|
|
#[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)]
|
2024-03-09 02:29:52 +00:00
|
|
|
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,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-03-09 05:07:11 +00:00
|
|
|
#[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,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-03-09 08:06:00 +00:00
|
|
|
#[cfg(explicit)]
|
2024-04-03 22:46:35 +00:00
|
|
|
fn ref_mut(val: u32) -> u32 {
|
2025-03-17 01:21:00 +00:00
|
|
|
let mut b = vec![0u32];
|
2024-04-03 22:46:35 +00:00
|
|
|
match &mut b {
|
2025-03-17 01:21:00 +00:00
|
|
|
deref!([_x]) if false => unreachable!(),
|
|
|
|
deref!([x]) => {
|
2024-04-03 22:46:35 +00:00
|
|
|
*x = val;
|
|
|
|
}
|
|
|
|
_ => unreachable!(),
|
|
|
|
}
|
2025-03-17 01:21:00 +00:00
|
|
|
let deref!([x]) = &b else { unreachable!() };
|
2024-04-03 22:46:35 +00:00
|
|
|
*x
|
|
|
|
}
|
|
|
|
|
2025-03-09 08:06:00 +00:00
|
|
|
#[cfg(implicit)]
|
|
|
|
fn ref_mut(val: u32) -> u32 {
|
2025-03-17 01:21:00 +00:00
|
|
|
let mut b = vec![0u32];
|
2025-03-09 08:06:00 +00:00
|
|
|
match &mut b {
|
2025-03-17 01:21:00 +00:00
|
|
|
[_x] if false => unreachable!(),
|
|
|
|
[x] => {
|
2025-03-09 08:06:00 +00:00
|
|
|
*x = val;
|
|
|
|
}
|
|
|
|
_ => unreachable!(),
|
|
|
|
}
|
2025-03-17 01:21:00 +00:00
|
|
|
let [x] = &b else { unreachable!() };
|
2025-03-09 08:06:00 +00:00
|
|
|
*x
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(explicit)]
|
2024-04-08 18:05:23 +00:00
|
|
|
#[rustfmt::skip]
|
|
|
|
fn or_and_guard(tuple: (u32, u32)) -> u32 {
|
|
|
|
let mut sum = 0;
|
2025-03-17 01:21:00 +00:00
|
|
|
let b = Rc::new(tuple);
|
2024-04-08 18:05:23 +00:00
|
|
|
match b {
|
|
|
|
deref!((x, _) | (_, x)) if { sum += x; false } => {},
|
|
|
|
_ => {},
|
|
|
|
}
|
|
|
|
sum
|
|
|
|
}
|
|
|
|
|
2025-03-09 08:06:00 +00:00
|
|
|
#[cfg(implicit)]
|
|
|
|
#[rustfmt::skip]
|
|
|
|
fn or_and_guard(tuple: (u32, u32)) -> u32 {
|
|
|
|
let mut sum = 0;
|
2025-03-17 01:21:00 +00:00
|
|
|
let b = Rc::new(tuple);
|
2025-03-09 08:06:00 +00:00
|
|
|
match b {
|
|
|
|
(x, _) | (_, x) if { sum += x; false } => {},
|
|
|
|
_ => {},
|
|
|
|
}
|
|
|
|
sum
|
|
|
|
}
|
|
|
|
|
2024-03-09 02:29:52 +00:00
|
|
|
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);
|
2024-03-09 15:10:45 +00:00
|
|
|
assert_eq!(simple_vec(vec![4]), 8);
|
2024-03-09 02:29:52 +00:00
|
|
|
|
|
|
|
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);
|
2024-04-03 22:46:35 +00:00
|
|
|
|
2024-04-08 18:05:23 +00:00
|
|
|
assert_eq!(ref_mut(42), 42);
|
|
|
|
assert_eq!(or_and_guard((10, 32)), 42);
|
2024-03-09 02:29:52 +00:00
|
|
|
}
|