diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-03-11 15:43:13 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-11 15:43:13 +0100 |
| commit | 9c38ae5653041af5384eca797e6148109d5661b8 (patch) | |
| tree | fa081a083891a7ad07aa1d9426e28dc2a93bfb07 | |
| parent | 244ec84a82032f0b4039cecdf914eeae0b791ee0 (diff) | |
| parent | 219195fc4c98649785154e2c66075be716bc0c01 (diff) | |
| download | rust-9c38ae5653041af5384eca797e6148109d5661b8.tar.gz rust-9c38ae5653041af5384eca797e6148109d5661b8.zip | |
Rollup merge of #108542 - bwmf2:expanded, r=wesleywiser
Force parentheses around `match` expression in binary expression This attempts to solve https://github.com/rust-lang/rust/issues/98790.
| -rw-r--r-- | compiler/rustc_ast_pretty/src/pprust/state/expr.rs | 4 | ||||
| -rw-r--r-- | tests/ui/macros/issue-98790.rs | 24 | ||||
| -rw-r--r-- | tests/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs | 2 |
3 files changed, 29 insertions, 1 deletions
diff --git a/compiler/rustc_ast_pretty/src/pprust/state/expr.rs b/compiler/rustc_ast_pretty/src/pprust/state/expr.rs index cacfe9eb2f1..a4d91a95662 100644 --- a/compiler/rustc_ast_pretty/src/pprust/state/expr.rs +++ b/compiler/rustc_ast_pretty/src/pprust/state/expr.rs @@ -244,6 +244,10 @@ impl<'a> State<'a> { (&ast::ExprKind::Let { .. }, _) if !parser::needs_par_as_let_scrutinee(prec) => { parser::PREC_FORCE_PAREN } + // For a binary expression like `(match () { _ => a }) OP b`, the parens are required + // otherwise the parser would interpret `match () { _ => a }` as a statement, + // with the remaining `OP b` not making sense. So we force parens. + (&ast::ExprKind::Match(..), _) => parser::PREC_FORCE_PAREN, _ => left_prec, }; diff --git a/tests/ui/macros/issue-98790.rs b/tests/ui/macros/issue-98790.rs new file mode 100644 index 00000000000..8fe6fc41d10 --- /dev/null +++ b/tests/ui/macros/issue-98790.rs @@ -0,0 +1,24 @@ +// run-pass + +macro_rules! stringify_item { + ($item:item) => { + stringify!($item) + }; +} + +macro_rules! repro { + ($expr:expr) => { + stringify_item! { + pub fn repro() -> bool { + $expr + } + } + }; +} + +fn main() { + assert_eq!( + repro!(match () { () => true } | true), + "pub fn repro() -> bool { (match () { () => true, }) | true }" + ); +} diff --git a/tests/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs b/tests/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs index b8b6f0846bb..39ba1714cc7 100644 --- a/tests/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs +++ b/tests/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs @@ -164,7 +164,7 @@ fn main() { // mac call // match - [ match elem { _ => elem } == 3 ] => "Assertion failed: match elem { _ => elem, } == 3" + [ match elem { _ => elem } == 3 ] => "Assertion failed: (match elem { _ => elem, }) == 3" // ret [ (|| { return elem; })() == 3 ] => "Assertion failed: (|| { return elem; })() == 3" |
