diff --git a/src/parse/macros/mod.rs b/src/parse/macros/mod.rs index 8a956faf03b..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) => { @@ -52,6 +53,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 +72,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) {} + } + } +);