|  | //@ run-pass | 
|  | //@ edition:2021 | 
|  |  | 
|  | use Foo::*; | 
|  |  | 
|  | #[allow(dead_code)] | 
|  | #[derive(Eq, PartialEq, Debug)] | 
|  | enum Foo { | 
|  | A(u64), | 
|  | B(u64), | 
|  | C, | 
|  | D, | 
|  | } | 
|  |  | 
|  | macro_rules! foo { | 
|  | ($orpat:pat, $val:expr) => { | 
|  | match $val { | 
|  | x @ ($orpat) => x, // leading vert would not be allowed in $orpat | 
|  | _ => B(0xDEADBEEFu64), | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | macro_rules! bar { | 
|  | ($orpat:pat, $val:expr) => { | 
|  | match $val { | 
|  | $orpat => 42, // leading vert allowed here | 
|  | _ => 0xDEADBEEFu64, | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | // Test or-pattern. | 
|  | let y = foo!(A(_)|B(_), A(32)); | 
|  | assert_eq!(y, A(32)); | 
|  |  | 
|  | // Leading vert in or-pattern. | 
|  | let y = bar!(|C| D, C); | 
|  | assert_eq!(y, 42u64); | 
|  | } |