5 &format!("macro caught literal: {}", $l)
8 &format!("macro caught expr: {}", $e)
12 macro_rules! two_negative_literals {
13 ($l1:literal $l2:literal) => {
14 &format!("macro caught literals: {}, {}", $l1, $l2)
18 macro_rules! only_expr {
20 &format!("macro caught expr: {}", $e)
24 macro_rules! mtester_dbg {
26 &format!("macro caught literal: {:?}", $l)
29 &format!("macro caught expr: {:?}", $e)
33 macro_rules! catch_range {
34 ($s:literal ..= $e:literal) => {
35 &format!("macro caught literal: {} ..= {}", $s, $e)
37 (($s:expr) ..= ($e:expr)) => { // Must use ')' before '..='
38 &format!("macro caught expr: {} ..= {}", $s, $e)
42 macro_rules! pat_match {
43 ($s:literal ..= $e:literal) => {
45 $s ..= $e => "literal, in range",
46 _ => "literal, other",
57 macro_rules! match_attr {
58 (#[$attr:meta] $e:literal) => {
59 "attr matched literal"
61 (#[$attr:meta] $e:expr) => {
66 macro_rules! match_produced_attr {
68 // Struct with doc comment passed via $literal
70 struct LiteralProduced;
77 macro_rules! test_user {
78 ($s:literal, $e:literal) => {
80 let mut v = Vec::new();
87 ($s:expr, $e: expr) => {
89 let mut v = Vec::new();
99 // Cases where 'literal' catches
100 assert_eq!(mtester!("str"), "macro caught literal: str");
101 assert_eq!(mtester!(2), "macro caught literal: 2");
102 assert_eq!(mtester!(2.2), "macro caught literal: 2.2");
103 assert_eq!(mtester!(1u32), "macro caught literal: 1");
104 assert_eq!(mtester!(0x32), "macro caught literal: 50");
105 assert_eq!(mtester!('c'), "macro caught literal: c");
106 assert_eq!(mtester!(-1.2), "macro caught literal: -1.2");
107 assert_eq!(two_negative_literals!(-2 -3), "macro caught literals: -2, -3");
108 assert_eq!(catch_range!(2 ..= 3), "macro caught literal: 2 ..= 3");
109 assert_eq!(match_attr!(#[attr] 1), "attr matched literal");
110 assert_eq!(test_user!(10, 20), "literal");
111 assert_eq!(mtester!(false), "macro caught literal: false");
112 assert_eq!(mtester!(true), "macro caught literal: true");
113 match_produced_attr!("a");
114 let _a = LiteralProduced;
115 assert_eq!(pat_match!(1 ..= 3), "literal, in range");
116 assert_eq!(pat_match!(4 ..= 6), "literal, other");
118 // Cases where 'expr' catches
119 assert_eq!(mtester!((-1.2)), "macro caught expr: -1.2");
120 assert_eq!(only_expr!(-1.2), "macro caught expr: -1.2");
121 assert_eq!(mtester!((1 + 3)), "macro caught expr: 4");
122 assert_eq!(mtester_dbg!(()), "macro caught expr: ()");
123 assert_eq!(catch_range!((1 + 1) ..= (2 + 2)), "macro caught expr: 2 ..= 4");
124 assert_eq!(match_attr!(#[attr] (1 + 2)), "attr matched expr");
125 assert_eq!(test_user!(10, (20 + 2)), "expr");
127 match_produced_attr!((3 + 2));
128 let _b = ExprProduced;
130 // Cases where 'pat' matched
131 assert_eq!(pat_match!(3), "pat, single");
132 assert_eq!(pat_match!(6), "pat, other");