diff --git a/crates/hir-def/src/macro_expansion_tests/mbe/tt_conversion.rs b/crates/hir-def/src/macro_expansion_tests/mbe/tt_conversion.rs index 138db1b498bb..5850d7ad6899 100644 --- a/crates/hir-def/src/macro_expansion_tests/mbe/tt_conversion.rs +++ b/crates/hir-def/src/macro_expansion_tests/mbe/tt_conversion.rs @@ -106,6 +106,22 @@ fn f2() { /* error: expected ident */ } ) } +#[test] +fn lifetime_bound_to_ident_fragment() { + check( + r#" +macro_rules! m { ($t:ident) => { $t } } + +fn f() { m!('a); } +"#, + expect![[r#" +macro_rules! m { ($t:ident) => { $t } } + +fn f() { /* error: expected ident */missing; } +"#]], + ) +} + #[test] fn expansion_does_not_parse_as_expression() { check( diff --git a/crates/mbe/src/expander/matcher.rs b/crates/mbe/src/expander/matcher.rs index fe01fb1f1063..7780caac7582 100644 --- a/crates/mbe/src/expander/matcher.rs +++ b/crates/mbe/src/expander/matcher.rs @@ -842,11 +842,14 @@ fn match_meta_var<'t>( _ => unreachable!(), } .err(); - let tt_result = input.from_savepoint(savepoint); - return ValueResult { - value: Fragment::Tokens { tree: tt_result, origin: TokensOrigin::Raw }, - err, + let value = match err { + Some(_) => Fragment::Empty, + None => Fragment::Tokens { + tree: input.from_savepoint(savepoint), + origin: TokensOrigin::Raw, + }, }; + return ValueResult { value, err }; } MetaVarKind::Ty => (parser::PrefixEntryPoint::Ty, TokensOrigin::Ast), MetaVarKind::Pat => (parser::PrefixEntryPoint::PatTop, TokensOrigin::Ast), diff --git a/crates/mbe/src/tests.rs b/crates/mbe/src/tests.rs index f3ebb663d92a..9e93d1869d04 100644 --- a/crates/mbe/src/tests.rs +++ b/crates/mbe/src/tests.rs @@ -468,9 +468,8 @@ fn minus_belongs_to_literal() { } SUBTREE $$ 1:Root[0000, 0]@0..6#ROOT2024 1:Root[0000, 0]@0..6#ROOT2024 - PUNCH - [joint] 1:Root[0000, 0]@1..2#ROOT2024 - PUNCH - [alone] 1:Root[0000, 0]@2..3#ROOT2024 + IDENT missing 0:Root[0000, 0]@72..75#ROOT2024 - --"#]], + missing"#]], ); }