| #![feature(prelude_import)] |
| #![no_std] |
| //@ compile-flags: -Zunpretty=expanded |
| //@ check-pass |
| |
| // This test covers the AST pretty-printer's insertion of parentheses in some |
| // macro metavariable edge cases. Synthetic parentheses (i.e. not appearing in |
| // the syntax tree) need to be printed in order for the printed code to be valid |
| // Rust syntax. We also test negative cases: the pretty-printer should not be |
| // synthesizing parentheses indiscriminately; only where necessary. |
| |
| #![feature(let_chains)] |
| #![feature(if_let_guard)] |
| #[prelude_import] |
| use ::std::prelude::rust_2015::*; |
| #[macro_use] |
| extern crate std; |
| |
| macro_rules! expr { ($expr:expr) => { $expr }; } |
| |
| macro_rules! stmt { ($stmt:stmt) => { $stmt }; } |
| |
| fn break_labeled_loop() { |
| let no_paren = |
| 'outer: loop { break 'outer 'inner: loop { break 'inner 1; } + 1; }; |
| |
| let paren_around_break_value = |
| 'outer: loop { break ('inner: loop { break 'inner 1; } + 1); }; |
| |
| macro_rules! breaking { ($value:expr) => { break $value }; } |
| |
| let paren_around_break_value = |
| loop { break ('inner: loop { break 'inner 1; } + 1); }; |
| } |
| |
| fn if_let() { |
| macro_rules! if_let { |
| ($pat:pat, $expr:expr) => { if let $pat = $expr {} }; |
| } |
| |
| if let no_paren = true && false {} |
| if let paren_around_binary = (true && false) {}; |
| if let no_paren = true {}; |
| |
| struct Struct {} |
| match () { _ if let no_paren = Struct {} => {} } |
| } |
| |
| fn let_else() { |
| let no_paren = 1 + 1 else { return; }; |
| let paren_around_loop = (loop {}) else { return; }; |
| } |
| |
| fn local() { |
| macro_rules! let_expr_minus_one { |
| ($pat:pat, $expr:expr) => { let $pat = $expr - 1; }; |
| } |
| |
| let void; |
| let no_paren = match void {} - 1; |
| |
| macro_rules! let_expr_else_return { |
| ($pat:pat, $expr:expr) => { let $pat = $expr else { return; }; }; |
| } |
| let |
| |
| no_paren = void() else { return; }; |
| } |
| |
| fn match_arm() { |
| macro_rules! match_arm { |
| ($pat:pat, $expr:expr) => { match () { $pat => $expr } }; |
| } |
| match () { |
| |
| |
| no_paren => 1 - 1, |
| }; |
| match () { paren_around_brace => ({ 1 }) - 1, }; |
| } |
| |
| /// https://github.com/rust-lang/rust/issues/98790 |
| fn stmt_boundary() { |
| macro_rules! expr_as_stmt { ($expr:expr) => { stmt!($expr) }; } |
| |
| let paren_around_match; |
| (match paren_around_match {}) | true; |
| |
| macro_rules! minus_one { ($expr:expr) => { expr_as_stmt!($expr - 1) }; } |
| |
| let (no_paren, paren_around_loop); |
| no_paren - 1; |
| (match paren_around_match {}) - 1; |
| (match paren_around_match {})() - 1; |
| (match paren_around_match {})[0] - 1; |
| (loop { break paren_around_loop; }) - 1; |
| } |
| |
| fn vis_inherited() { |
| macro_rules! vis_inherited { |
| ($vis:vis struct) => { $vis struct Struct; }; |
| } |
| struct Struct; |
| |
| } |