2024-05-17 02:57:24 +00:00
|
|
|
#![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 }; }
|
|
|
|
|
2024-06-23 21:14:00 +00:00
|
|
|
fn break_labeled_loop() {
|
|
|
|
let no_paren =
|
|
|
|
'outer: loop { break 'outer 'inner: loop { break 'inner 1; } + 1; };
|
|
|
|
|
|
|
|
let paren_around_break_value =
|
2024-06-23 23:58:15 +00:00
|
|
|
'outer: loop { break ('inner: loop { break 'inner 1; } + 1); };
|
2024-06-23 21:14:00 +00:00
|
|
|
|
|
|
|
macro_rules! breaking { ($value:expr) => { break $value }; }
|
|
|
|
|
|
|
|
let paren_around_break_value =
|
2024-06-23 23:58:15 +00:00
|
|
|
loop { break ('inner: loop { break 'inner 1; } + 1); };
|
2024-06-23 21:14:00 +00:00
|
|
|
}
|
|
|
|
|
2024-05-17 02:57:24 +00:00
|
|
|
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;
|
|
|
|
|
|
|
|
}
|