From 911c305e6f6c10fc01403d62a456bf34fbbf901b Mon Sep 17 00:00:00 2001 From: Thomas Van Strydonck Date: Mon, 18 Aug 2025 20:04:27 +0200 Subject: [PATCH 1/2] fix: `impl Trait` inside macro parsed incorrectly --- src/parse/macros/mod.rs | 14 +++++++------- tests/source/issue-6036.rs | 14 ++++++++++++++ tests/target/issue-6036.rs | 22 ++++++++++++++++++++++ 3 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 tests/source/issue-6036.rs create mode 100644 tests/target/issue-6036.rs diff --git a/src/parse/macros/mod.rs b/src/parse/macros/mod.rs index 8a956faf03b..2c38a20e898 100644 --- a/src/parse/macros/mod.rs +++ b/src/parse/macros/mod.rs @@ -52,6 +52,13 @@ fn parse_macro_arg<'a, 'b: 'a>(parser: &'a mut Parser<'b>) -> Option { |parser: &mut Parser<'b>| parser.parse_expr(), |x: ptr::P| Some(x) ); + // `parse_item` returns `Option>`. + parse_macro_arg!( + Item, + NonterminalKind::Item, + |parser: &mut Parser<'b>| parser.parse_item(ForceCollect::No), + |x: Option>| x + ); parse_macro_arg!( Ty, NonterminalKind::Ty, @@ -64,13 +71,6 @@ fn parse_macro_arg<'a, 'b: 'a>(parser: &'a mut Parser<'b>) -> Option { |parser: &mut Parser<'b>| parser.parse_pat_no_top_alt(None, None), |x: ptr::P| Some(x) ); - // `parse_item` returns `Option>`. - parse_macro_arg!( - Item, - NonterminalKind::Item, - |parser: &mut Parser<'b>| parser.parse_item(ForceCollect::No), - |x: Option>| x - ); None } diff --git a/tests/source/issue-6036.rs b/tests/source/issue-6036.rs new file mode 100644 index 00000000000..f26d2e784f2 --- /dev/null +++ b/tests/source/issue-6036.rs @@ -0,0 +1,14 @@ +fmt_me!( +impl Foo { fn f(&self) {} } +); +fmt_me!( +impl Bar for Baz { fn m(&self) {} } +); + +// does get formatted +fmt_me!( +impl Foo { fn g(&self) {} } +mod test { +impl Foo { fn f(&self) {} } +} +); diff --git a/tests/target/issue-6036.rs b/tests/target/issue-6036.rs new file mode 100644 index 00000000000..9f911770d4e --- /dev/null +++ b/tests/target/issue-6036.rs @@ -0,0 +1,22 @@ +fmt_me!( + impl Foo { + fn f(&self) {} + } +); +fmt_me!( + impl Bar for Baz { + fn m(&self) {} + } +); + +// does get formatted +fmt_me!( + impl Foo { + fn g(&self) {} + } + mod test { + impl Foo { + fn f(&self) {} + } + } +); From de1cf14fecf4b3b3e69377907d6003f244cca5de Mon Sep 17 00:00:00 2001 From: Thomas Van Strydonck Date: Tue, 19 Aug 2025 10:25:43 +0200 Subject: [PATCH 2/2] fix: don't return when `parse_item` returns `None` --- src/parse/macros/mod.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/parse/macros/mod.rs b/src/parse/macros/mod.rs index 2c38a20e898..54e478b86e0 100644 --- a/src/parse/macros/mod.rs +++ b/src/parse/macros/mod.rs @@ -29,12 +29,13 @@ fn parse_macro_arg<'a, 'b: 'a>(parser: &'a mut Parser<'b>) -> Option { if Parser::nonterminal_may_begin_with($nt_kind, &cloned_parser.token) { match $try_parse(&mut cloned_parser) { Ok(x) => { - if parser.psess.dcx().has_errors().is_some() { + let maybe_parsed = $then(x); + if parser.psess.dcx().has_errors().is_some() || maybe_parsed.is_none() { parser.psess.dcx().reset_err_count(); } else { // Parsing succeeded. *parser = cloned_parser; - return Some(MacroArg::$macro_arg($then(x)?)); + return Some(MacroArg::$macro_arg(maybe_parsed?)); } } Err(e) => {