From 68854b798ebda70014985d26722e7f6820254658 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 12 May 2024 13:24:36 -0700 Subject: [PATCH 1/2] Add AST pretty-printer tests for let-else --- tests/ui/macros/stringify.rs | 15 +++++++++++++++ .../{pretty-let-else.rs => let-else-hir.rs} | 0 ...pretty-let-else.stdout => let-else-hir.stdout} | 0 tests/ui/unpretty/let-else.rs | 11 +++++++++++ tests/ui/unpretty/let-else.stdout | 15 +++++++++++++++ 5 files changed, 41 insertions(+) rename tests/ui/unpretty/{pretty-let-else.rs => let-else-hir.rs} (100%) rename tests/ui/unpretty/{pretty-let-else.stdout => let-else-hir.stdout} (100%) create mode 100644 tests/ui/unpretty/let-else.rs create mode 100644 tests/ui/unpretty/let-else.stdout diff --git a/tests/ui/macros/stringify.rs b/tests/ui/macros/stringify.rs index 472cb4d417be8..6b215ba525deb 100644 --- a/tests/ui/macros/stringify.rs +++ b/tests/ui/macros/stringify.rs @@ -675,6 +675,11 @@ fn test_stmt() { "let (a, b): (u32, u32) = (1, 2);", "let (a, b): (u32, u32) = (1, 2)" ); + c2!(stmt, + [ let _ = f() else { return; } ], + "let _ = f() else { return; };", + "let _ = f() else { return; }", + ); macro_rules! c2_let_expr_minus_one { ([ $expr:expr ], $stmt_expected:expr, $tokens_expected:expr $(,)?) => { c2!(stmt, [ let _ = $expr - 1 ], $stmt_expected, $tokens_expected); @@ -685,6 +690,16 @@ fn test_stmt() { "let _ = match void {} - 1;", "let _ = match void {} - 1", ); + macro_rules! c2_let_expr_else_return { + ([ $expr:expr ], $stmt_expected:expr, $tokens_expected:expr $(,)?) => { + c2!(stmt, [ let _ = $expr else { return; } ], $stmt_expected, $tokens_expected); + }; + } + c2_let_expr_else_return!( + [ f() ], + "let _ = f() else { return; };", + "let _ = f() else { return; }", + ); // StmtKind::Item c1!(stmt, [ struct S; ], "struct S;"); diff --git a/tests/ui/unpretty/pretty-let-else.rs b/tests/ui/unpretty/let-else-hir.rs similarity index 100% rename from tests/ui/unpretty/pretty-let-else.rs rename to tests/ui/unpretty/let-else-hir.rs diff --git a/tests/ui/unpretty/pretty-let-else.stdout b/tests/ui/unpretty/let-else-hir.stdout similarity index 100% rename from tests/ui/unpretty/pretty-let-else.stdout rename to tests/ui/unpretty/let-else-hir.stdout diff --git a/tests/ui/unpretty/let-else.rs b/tests/ui/unpretty/let-else.rs new file mode 100644 index 0000000000000..4db6eca99b18f --- /dev/null +++ b/tests/ui/unpretty/let-else.rs @@ -0,0 +1,11 @@ +//@ compile-flags: -Zunpretty=expanded +//@ check-pass + +macro_rules! expr { + ($e:expr) => { $e }; +} + +fn main() { + let _ = expr!(1 + 1) else { return; }; + let _ = expr!(loop {}) else { return; }; +} diff --git a/tests/ui/unpretty/let-else.stdout b/tests/ui/unpretty/let-else.stdout new file mode 100644 index 0000000000000..5f6972cd4295f --- /dev/null +++ b/tests/ui/unpretty/let-else.stdout @@ -0,0 +1,15 @@ +#![feature(prelude_import)] +#![no_std] +#[prelude_import] +use ::std::prelude::rust_2015::*; +#[macro_use] +extern crate std; +//@ compile-flags: -Zunpretty=expanded +//@ check-pass + +macro_rules! expr { ($e:expr) => { $e }; } + +fn main() { + let _ = 1 + 1 else { return; }; + let _ = loop {} else { return; }; +} From 94cc82c088b9301dc4dcf84ce127a64bbd77dddf Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 12 May 2024 13:39:43 -0700 Subject: [PATCH 2/2] Pretty-print let-else with added parenthesization when needed --- compiler/rustc_ast_pretty/src/pprust/state.rs | 6 +++++- tests/ui/unpretty/let-else.stdout | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_ast_pretty/src/pprust/state.rs b/compiler/rustc_ast_pretty/src/pprust/state.rs index 2c176828c841f..b7bdb2e14a6da 100644 --- a/compiler/rustc_ast_pretty/src/pprust/state.rs +++ b/compiler/rustc_ast_pretty/src/pprust/state.rs @@ -1238,7 +1238,11 @@ impl<'a> State<'a> { if let Some((init, els)) = loc.kind.init_else_opt() { self.nbsp(); self.word_space("="); - self.print_expr(init, FixupContext::default()); + self.print_expr_cond_paren( + init, + els.is_some() && classify::expr_trailing_brace(init).is_some(), + FixupContext::default(), + ); if let Some(els) = els { self.cbox(INDENT_UNIT); self.ibox(INDENT_UNIT); diff --git a/tests/ui/unpretty/let-else.stdout b/tests/ui/unpretty/let-else.stdout index 5f6972cd4295f..4bc4d9e085f97 100644 --- a/tests/ui/unpretty/let-else.stdout +++ b/tests/ui/unpretty/let-else.stdout @@ -11,5 +11,5 @@ macro_rules! expr { ($e:expr) => { $e }; } fn main() { let _ = 1 + 1 else { return; }; - let _ = loop {} else { return; }; + let _ = (loop {}) else { return; }; }