rust/compiler
Matthias Krüger f3b19f54fa
Rollup merge of #133782 - dtolnay:closuresjumps, r=spastorino,traviscross
Precedence improvements: closures and jumps

This PR fixes some cases where rustc's pretty printers would redundantly parenthesize expressions that didn't need it.

<table>
<tr><th>Before</th><th>After</th></tr>
<tr><td><code>return (|x: i32| x)</code></td><td><code>return |x: i32| x</code></td></tr>
<tr><td><code>(|| -> &mut () { std::process::abort() }).clone()</code></td><td><code>|| -> &mut () { std::process::abort() }.clone()</code></td></tr>
<tr><td><code>(continue) + 1</code></td><td><code>continue + 1</code></td></tr>
</table>

Tested by `echo "fn main() { let _ = $AFTER; }" | rustc -Zunpretty=expanded /dev/stdin`.

The pretty-printer aims to render the syntax tree as it actually exists in rustc, as faithfully as possible, in Rust syntax. It can insert parentheses where forced by Rust's grammar in order to preserve the meaning of a macro-generated syntax tree, for example in the case of `a * $rhs` where $rhs is `b + c`. But for any expression parsed from source code, without a macro involved, there should never be a reason for inserting additional parentheses not present in the original.

For closures and jumps (return, break, continue, yield, do yeet, become) the unneeded parentheses came from the precedence of some of these expressions being misidentified. In the same order as the table above:

- Jumps and closures are supposed to have equal precedence. The [Rust Reference](https://doc.rust-lang.org/1.83.0/reference/expressions.html#expression-precedence) says so, and in Syn they do. There is no Rust syntax that would require making a precedence distinction between jumps and closures. But in rustc these were previously 2 distinct levels with the closure being lower, hence the parentheses around a closure inside a jump (but not a jump inside a closure).

- When a closure is written with an explicit return type, the grammar [requires](https://doc.rust-lang.org/1.83.0/reference/expressions/closure-expr.html) that the closure body consists of exactly one block expression, not any other arbitrary expression as usual for closures. Parsing of the closure body does not continue after the block expression. So in `|| { 0 }.clone()` the clone is inside the closure body and applies to `{ 0 }`, whereas in `|| -> _ { 0 }.clone()` the clone is outside and applies to the closure as a whole.

- Continue never needs parentheses. It was previously marked as having the lowest possible precedence but it should have been the highest, next to paths and loops and function calls, not next to jumps.
2024-12-21 01:30:15 +01:00
..
rustc switch jemalloc-sys back to tikv-jemalloc-sys, and update to 0.6.0 2024-12-03 08:56:33 +00:00
rustc_abi make no-variant types a dedicated Variants variant 2024-12-18 11:01:54 +01:00
rustc_arena move strict provenance lints to new feature gate, remove old feature gates 2024-10-21 15:22:17 +01:00
rustc_ast Rollup merge of #133782 - dtolnay:closuresjumps, r=spastorino,traviscross 2024-12-21 01:30:15 +01:00
rustc_ast_ir Add sugar for &pin (const|mut) types 2024-10-07 11:15:04 -07:00
rustc_ast_lowering Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_ast_passes Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_ast_pretty Rollup merge of #134161 - nnethercote:overhaul-token-cursors, r=spastorino 2024-12-18 22:56:53 +08:00
rustc_attr_data_structures rename rustc_attr to rustc_attr_parsing and create rustc_attr_data_structures 2024-12-16 19:08:19 +01:00
rustc_attr_parsing Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_baked_icu_data Delete the cfg(not(parallel)) serial compiler 2024-11-12 13:38:58 +00:00
rustc_borrowck Rollup merge of #134574 - lcnr:opaque-ty-hack-yeet, r=compiler-errors 2024-12-20 21:32:33 +01:00
rustc_builtin_macros Speed up Parser::expected_token_types. 2024-12-19 16:05:41 +11:00
rustc_codegen_cranelift Make DependencyList an IndexVec 2024-12-19 15:30:32 +00:00
rustc_codegen_gcc chore: fix some typos 2024-12-18 23:23:44 +08:00
rustc_codegen_llvm Remove some dead code around import library generation 2024-12-20 15:20:15 +00:00
rustc_codegen_ssa Rollup merge of #134561 - bjorn3:less_fatal_error_raise, r=compiler-errors 2024-12-20 21:32:30 +01:00
rustc_const_eval Auto merge of #134550 - jhpratt:rollup-wsfmo59, r=jhpratt 2024-12-20 07:27:15 +00:00
rustc_data_structures Remove jobserver from Session 2024-12-13 10:21:22 +00:00
rustc_driver
rustc_driver_impl Reduce the amount of explicit FatalError.raise() 2024-12-20 14:09:25 +00:00
rustc_error_codes Auto merge of #132706 - compiler-errors:async-closures, r=oli-obk 2024-12-13 00:37:51 +00:00
rustc_error_messages Delete the cfg(not(parallel)) serial compiler 2024-11-12 13:38:58 +00:00
rustc_errors Rollup merge of #134366 - harrisonkaiser:no-break-space, r=davidtwco 2024-12-20 21:46:59 +08:00
rustc_expand Speed up Parser::expected_token_types. 2024-12-19 16:05:41 +11:00
rustc_feature split up #[rustc_deny_explicit_impl] attribute 2024-12-20 16:57:14 +01:00
rustc_fluent_macro use tracked_path in rustc_fluent_macro 2024-10-19 22:32:38 +08:00
rustc_fs_util Couple of changes to make it easier to compile rustc for wasm 2024-09-26 19:51:14 +00:00
rustc_graphviz Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_hir Rollup merge of #133782 - dtolnay:closuresjumps, r=spastorino,traviscross 2024-12-21 01:30:15 +01:00
rustc_hir_analysis split up #[rustc_deny_explicit_impl] attribute 2024-12-20 16:57:14 +01:00
rustc_hir_pretty Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_hir_typeck Rollup merge of #134574 - lcnr:opaque-ty-hack-yeet, r=compiler-errors 2024-12-20 21:32:33 +01:00
rustc_incremental Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_index add MixedBitSet::clear 2024-12-17 18:54:39 +00:00
rustc_index_macros Auto merge of #130867 - michirakara:steps_between, r=dtolnay 2024-11-22 10:54:22 +00:00
rustc_infer Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_interface Rollup merge of #134514 - bjorn3:more_driver_refactors, r=jieyouxu 2024-12-20 21:47:00 +08:00
rustc_lexer Add test to check unicode identifier version 2024-12-09 06:23:59 -08:00
rustc_lint Auto merge of #133961 - lcnr:borrowck-cleanup, r=jackh726 2024-12-19 08:33:20 +00:00
rustc_lint_defs Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_llvm Remove some dead code around import library generation 2024-12-20 15:20:15 +00:00
rustc_log Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_macros Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_metadata Review comments 2024-12-20 08:35:02 +00:00
rustc_middle Rollup merge of #134573 - lukas-code:unimpl-dyn-pointerlike, r=compiler-errors 2024-12-20 21:32:33 +01:00
rustc_mir_build Auto merge of #134486 - compiler-errors:drop-for-lint, r=nikomatsakis 2024-12-19 15:58:08 +00:00
rustc_mir_dataflow Auto merge of #133328 - nnethercote:simplify-SwitchInt-handling, r=tmiasko 2024-12-18 22:57:23 +00:00
rustc_mir_transform coverage: Rename basic_coverage_blocks to just graph 2024-12-20 17:48:59 +11:00
rustc_monomorphize Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_next_trait_solver update new solver candidate assembly 2024-12-18 16:35:05 +01:00
rustc_parse Reduce the amount of explicit FatalError.raise() 2024-12-20 14:09:25 +00:00
rustc_parse_format Remove 'apostrophes' from rustc_parse_format 2024-10-14 23:22:51 +02:00
rustc_passes split up #[rustc_deny_explicit_impl] attribute 2024-12-20 16:57:14 +01:00
rustc_pattern_analysis no more Reveal :( 2024-11-23 13:52:54 +01:00
rustc_privacy Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_query_impl Rename ty_def_id so people will stop using it by accident 2024-12-13 16:36:38 +00:00
rustc_query_system Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_resolve Rollup merge of #134473 - acceptacross:master, r=compiler-errors 2024-12-18 21:38:10 -05:00
rustc_sanitizers Remove more traces of anonymous ADTs 2024-12-10 19:50:47 +00:00
rustc_serialize Fix explicit_iter_loop in rustc_serialize 2024-10-16 15:44:16 +02:00
rustc_session Rollup merge of #134561 - bjorn3:less_fatal_error_raise, r=compiler-errors 2024-12-20 21:32:30 +01:00
rustc_smir make no-variant types a dedicated Variants variant 2024-12-18 11:01:54 +01:00
rustc_span split up #[rustc_deny_explicit_impl] attribute 2024-12-20 16:57:14 +01:00
rustc_symbol_mangling Re-export more rustc_span::symbol things from rustc_span. 2024-12-18 13:38:53 +11:00
rustc_target make no-variant types a dedicated Variants variant 2024-12-18 11:01:54 +01:00
rustc_trait_selection Reduce the amount of explicit FatalError.raise() 2024-12-20 14:09:25 +00:00
rustc_traits Delay a bug when encountering an impl with unconstrained generics in codegen_select 2024-11-23 05:27:45 +00:00
rustc_transmute add comment explaining why ty_and_layout_field is not used 2024-12-18 11:01:54 +01:00
rustc_ty_utils make no-variant types a dedicated Variants variant 2024-12-18 11:01:54 +01:00
rustc_type_ir Rollup merge of #133643 - lcnr:merge-candidates, r=compiler-errors 2024-12-18 21:38:08 -05:00
rustc_type_ir_macros do not relate Abi and Safety 2024-10-22 23:13:04 +02:00
stable_mir make no-variant types a dedicated Variants variant 2024-12-18 11:01:54 +01:00