Skip to content

Commit 4998807

Browse files
Merge #6813
6813: negative sign matching in mbe matching for literal r=edwin0cheng a=edwin0cheng Fix #6292 r @jonas-schievink Co-authored-by: Edwin Cheng <[email protected]>
2 parents c1ef623 + ae29fb0 commit 4998807

File tree

2 files changed

+39
-6
lines changed

2 files changed

+39
-6
lines changed

crates/mbe/src/mbe_expander/matcher.rs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,18 @@ impl<'a> TtIter<'a> {
356356
ExpandResult { value: _, err: Some(_) } => None,
357357
}
358358
}
359+
360+
pub(crate) fn eat_char(&mut self, c: char) -> Option<tt::TokenTree> {
361+
let mut fork = self.clone();
362+
match fork.expect_char(c) {
363+
Ok(_) => {
364+
let tt = self.next().cloned();
365+
*self = fork;
366+
tt
367+
}
368+
Err(_) => None,
369+
}
370+
}
359371
}
360372

361373
pub(super) fn match_repeat(
@@ -447,10 +459,22 @@ fn match_meta_var(kind: &str, input: &mut TtIter) -> ExpandResult<Option<Fragmen
447459
.expect_lifetime()
448460
.map(|tt| Some(tt))
449461
.map_err(|()| err!("expected lifetime")),
450-
"literal" => input
451-
.expect_literal()
452-
.map(|literal| Some(tt::Leaf::from(literal.clone()).into()))
453-
.map_err(|()| err!()),
462+
"literal" => {
463+
let neg = input.eat_char('-');
464+
input
465+
.expect_literal()
466+
.map(|literal| {
467+
let lit = tt::Leaf::from(literal.clone());
468+
match neg {
469+
None => Some(lit.into()),
470+
Some(neg) => Some(tt::TokenTree::Subtree(tt::Subtree {
471+
delimiter: None,
472+
token_trees: vec![neg, lit.into()],
473+
})),
474+
}
475+
})
476+
.map_err(|()| err!())
477+
}
454478
// `vis` is optional
455479
"vis" => match input.eat_vis() {
456480
Some(vis) => Ok(Some(vis)),

crates/mbe/src/tests.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,11 +1008,20 @@ fn test_literal() {
10081008
parse_macro(
10091009
r#"
10101010
macro_rules! foo {
1011-
($ type:ty $ lit:literal) => { const VALUE: $ type = $ lit;};
1011+
($ type:ty , $ lit:literal) => { const VALUE: $ type = $ lit;};
10121012
}
10131013
"#,
10141014
)
1015-
.assert_expand_items(r#"foo!(u8 0);"#, r#"const VALUE : u8 = 0 ;"#);
1015+
.assert_expand_items(r#"foo!(u8,0);"#, r#"const VALUE : u8 = 0 ;"#);
1016+
1017+
parse_macro(
1018+
r#"
1019+
macro_rules! foo {
1020+
($ type:ty , $ lit:literal) => { const VALUE: $ type = $ lit;};
1021+
}
1022+
"#,
1023+
)
1024+
.assert_expand_items(r#"foo!(i32,-1);"#, r#"const VALUE : i32 = - 1 ;"#);
10161025
}
10171026

10181027
#[test]

0 commit comments

Comments
 (0)