diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-07-02 17:47:45 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-02 17:47:45 +0200 |
| commit | f8f67b296915e70a67fbf4595b1f54d9d773be57 (patch) | |
| tree | 0188cd7a6c3431559cc52d81c8a3bf37e743f2a8 /compiler/rustc_codegen_llvm/src | |
| parent | 7d97c59438e933e86f557ed999da3b8dfc6855a7 (diff) | |
| parent | 06982239a6210cfc7b0b370634c9a9160c9b9dc4 (diff) | |
| download | rust-f8f67b296915e70a67fbf4595b1f54d9d773be57.tar.gz rust-f8f67b296915e70a67fbf4595b1f54d9d773be57.zip | |
Rollup merge of #126883 - dtolnay:breakvalue, r=fmease
Parenthesize break values containing leading label
The AST pretty printer previously produced invalid syntax in the case of `break` expressions with a value that begins with a loop or block label.
```rust
macro_rules! expr {
($e:expr) => {
$e
};
}
fn main() {
loop {
break expr!('a: loop { break 'a 1; } + 1);
};
}
```
`rustc -Zunpretty=expanded main.rs `:
```console
#![feature(prelude_import)]
#![no_std]
#[prelude_import]
use ::std::prelude::rust_2015::*;
#[macro_use]
extern crate std;
macro_rules! expr { ($e:expr) => { $e }; }
fn main() { loop { break 'a: loop { break 'a 1; } + 1; }; }
```
The expanded code is not valid Rust syntax. Printing invalid syntax is bad because it blocks `cargo expand` from being able to format the output as Rust syntax using rustfmt.
```console
error: parentheses are required around this expression to avoid confusion with a labeled break expression
--> <anon>:9:26
|
9 | fn main() { loop { break 'a: loop { break 'a 1; } + 1; }; }
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
help: wrap the expression in parentheses
|
9 | fn main() { loop { break ('a: loop { break 'a 1; }) + 1; }; }
| + +
```
This PR updates the AST pretty-printer to insert parentheses around the value of a `break` expression as required to avoid this edge case.
Diffstat (limited to 'compiler/rustc_codegen_llvm/src')
0 files changed, 0 insertions, 0 deletions
