rust/compiler
Dylan DPC 8acbfe27d6
Rollup merge of #108388 - ohno418:better-suggestion-on-malformed-closure, r=davidtwco
parser: provide better suggestions and errors on closures with braces missing

We currently provide wrong suggestions and unhelpful errors on closure bodies with braces missing.

For example, given the following code:

```rust
fn main() {
    let _x = Box::new(|x|x+1;);
}
```

the current output is:

```
error: expected expression, found `)`
 --> ./main.rs:2:30
  |
2 |     let _x = Box::new(|x|x+1;);
  |                              ^ expected expression

error: closure bodies that contain statements must be surrounded by braces
 --> ./main.rs:2:25
  |
2 |     let _x = Box::new(|x|x+1;);
  |                         ^
3 | }
  | ^
  |
note: statement found outside of a block
 --> ./main.rs:2:29
  |
2 |     let _x = Box::new(|x|x+1;);
  |                          ---^ this `;` turns the preceding closure into a statement
  |                          |
  |                          this expression is a statement because of the trailing semicolon
note: the closure body may be incorrectly delimited
 --> ./main.rs:2:23
  |
2 |     let _x = Box::new(|x|x+1;);
  |                       ^^^^^^ this is the parsed closure...
3 | }
  | - ...but likely you meant the closure to end here
help: try adding braces
  |
2 ~     let _x = Box::new(|x| {x+1;);
3 ~ }}
  |

error: expected `;`, found `}`
 --> ./main.rs:2:32
  |
2 |     let _x = Box::new(|x|x+1;);
  |                                ^ help: add `;` here
3 | }
  | - unexpected token

error: aborting due to 3 previous errors
```

We got 3 errors, but all but the second are unnecessary or just wrong.

This commit allows outputting correct suggestions and errors. The above code would output like this:

```
error: closure bodies that contain statements must be surrounded by braces
 --> ./main.rs:2:25
  |
2 |     let _x = Box::new(|x|x+1;);
  |                         ^    ^
  |
note: statement found outside of a block
 --> ./main.rs:2:29
  |
2 |     let _x = Box::new(|x|x+1;);
  |                          ---^ this `;` turns the preceding closure into a statement
  |                          |
  |                          this expression is a statement because of the trailing semicolon
note: the closure body may be incorrectly delimited
 --> ./main.rs:2:23
  |
2 |     let _x = Box::new(|x|x+1;);
  |                       ^^^^^^ - ...but likely you meant the closure to end here
  |                       |
  |                       this is the parsed closure...
help: try adding braces
  |
2 |     let _x = Box::new(|x| {x+1;});
  |                           +    +

error: aborting due to previous error
```

Fixes https://github.com/rust-lang/rust/issues/107959.

r? diagnostics
2023-02-24 12:02:44 +05:30
..
rustc Add a new rustc_driver dylib to rexport rustc_driver_impl 2023-02-02 07:34:41 +01:00
rustc_abi Rollup merge of #107592 - workingjubilee:use-16-bit-enum-on-16-bit-targets, r=WaffleLapkin 2023-02-17 12:39:05 +01:00
rustc_apfloat compiler: remove unnecessary imports and qualified paths 2022-12-10 18:45:34 +01:00
rustc_arena compiler: remove unnecessary imports and qualified paths 2022-12-10 18:45:34 +01:00
rustc_ast Use ThinVec in a few more AST types. 2023-02-21 11:51:56 +11:00
rustc_ast_lowering pluralize stuff 2023-02-22 21:52:26 +00:00
rustc_ast_passes Move associated type bounds check to ast lowering 2023-02-22 20:18:14 +00:00
rustc_ast_pretty Use ThinVec in various AST types. 2023-02-21 11:51:56 +11:00
rustc_attr errors: generate typed identifiers in each crate 2023-02-22 09:15:53 +00:00
rustc_baked_icu_data update ICU4X to 1.1.0 2023-02-04 22:28:59 +01:00
rustc_borrowck Auto merge of #108369 - compiler-errors:ty-error-more, r=BoxyUwU 2023-02-23 09:20:10 +00:00
rustc_builtin_macros errors: generate typed identifiers in each crate 2023-02-22 09:15:53 +00:00
rustc_codegen_cranelift Auto merge of #108340 - eggyal:remove_traversal_trait_aliases, r=oli-obk 2023-02-22 18:26:51 +00:00
rustc_codegen_gcc Auto merge of #108340 - eggyal:remove_traversal_trait_aliases, r=oli-obk 2023-02-22 18:26:51 +00:00
rustc_codegen_llvm Auto merge of #108340 - eggyal:remove_traversal_trait_aliases, r=oli-obk 2023-02-22 18:26:51 +00:00
rustc_codegen_ssa Auto merge of #108340 - eggyal:remove_traversal_trait_aliases, r=oli-obk 2023-02-22 18:26:51 +00:00
rustc_const_eval Auto merge of #108340 - eggyal:remove_traversal_trait_aliases, r=oli-obk 2023-02-22 18:26:51 +00:00
rustc_data_structures Auto merge of #108300 - oli-obk:elsa, r=eholk 2023-02-22 08:44:30 +00:00
rustc_driver Remove unneeded extern crate 2023-02-02 07:47:39 +01:00
rustc_driver_impl various: translation resources from cg backend 2023-02-22 09:15:54 +00:00
rustc_error_codes Add extended error message for E0523 2023-02-06 06:58:30 -05:00
rustc_error_messages Handle selecting the default locale better 2023-02-23 01:14:10 +01:00
rustc_errors Restore behavior when primary bundle is missing 2023-02-23 01:14:10 +01:00
rustc_expand various: translation resources from cg backend 2023-02-22 09:15:54 +00:00
rustc_feature Adjust tracking issue for non_lifetime_binders 2023-02-18 02:42:43 +00:00
rustc_fs_util Remove useless borrows and derefs 2022-12-01 17:34:43 +00:00
rustc_graphviz Fix uninlined_format_args for some compiler crates 2023-01-05 19:01:12 +01:00
rustc_hir diagnostics: if AssocFn has self argument, describe as method 2023-02-22 08:40:33 -07:00
rustc_hir_analysis Auto merge of #108369 - compiler-errors:ty-error-more, r=BoxyUwU 2023-02-23 09:20:10 +00:00
rustc_hir_pretty Use Mutability::{is_mut, is_not} 2023-01-30 12:26:26 +00:00
rustc_hir_typeck Rollup merge of #106541 - fee1-dead-contrib:no-const-check-no, r=thomcc 2023-02-24 12:02:40 +05:30
rustc_incremental errors: generate typed identifiers in each crate 2023-02-22 09:15:53 +00:00
rustc_index Fix IndexVec::drain_enumerated 2023-01-19 15:25:33 +00:00
rustc_infer Auto merge of #108369 - compiler-errors:ty-error-more, r=BoxyUwU 2023-02-23 09:20:10 +00:00
rustc_interface Auto merge of #103042 - davidtwco:translation-distributed-ftl, r=oli-obk 2023-02-22 15:14:22 +00:00
rustc_lexer Update lexer lifetime test 2023-02-14 23:25:01 +08:00
rustc_lint Auto merge of #108340 - eggyal:remove_traversal_trait_aliases, r=oli-obk 2023-02-22 18:26:51 +00:00
rustc_lint_defs Extend BYTE_SLICE_IN_PACKED_STRUCT_WITH_DERIVE. 2023-02-09 11:47:12 +11:00
rustc_llvm Add kernel-address sanitizer support for freestanding targets 2023-02-14 20:54:25 -05:00
rustc_log Rollup merge of #107895 - matthiaskrgr:cl, r=compiler-errors 2023-02-11 17:18:44 +01:00
rustc_macros Auto merge of #108340 - eggyal:remove_traversal_trait_aliases, r=oli-obk 2023-02-22 18:26:51 +00:00
rustc_metadata errors: generate typed identifiers in each crate 2023-02-22 09:15:53 +00:00
rustc_middle Auto merge of #108369 - compiler-errors:ty-error-more, r=BoxyUwU 2023-02-23 09:20:10 +00:00
rustc_mir_build Auto merge of #108369 - compiler-errors:ty-error-more, r=BoxyUwU 2023-02-23 09:20:10 +00:00
rustc_mir_dataflow errors: generate typed identifiers in each crate 2023-02-22 09:15:53 +00:00
rustc_mir_transform Rollup merge of #108208 - cjgillot:flood-enum, r=oli-obk 2023-02-23 06:18:06 +01:00
rustc_monomorphize Auto merge of #108340 - eggyal:remove_traversal_trait_aliases, r=oli-obk 2023-02-22 18:26:51 +00:00
rustc_parse parser: provide better errors on closures with braces missing 2023-02-23 19:05:13 +09:00
rustc_parse_format Replace some thens with some then_somes 2023-02-16 15:26:03 +00:00
rustc_passes Rollup merge of #108377 - clubby789:duplicate-diagnostic-ice, r=compiler-errors 2023-02-24 12:02:43 +05:30
rustc_plugin_impl errors: generate typed identifiers in each crate 2023-02-22 09:15:53 +00:00
rustc_privacy Auto merge of #108324 - notriddle:notriddle/assoc-fn-method, r=compiler-errors,davidtwco,estebank,oli-obk 2023-02-23 00:19:12 +00:00
rustc_query_impl Upgrade thin-vec from 0.2.9 to 0.2.12. 2023-02-21 11:51:55 +11:00
rustc_query_system Rollup merge of #108169 - Zoxc:query-key-copy, r=cjgillot 2023-02-24 12:02:41 +05:30
rustc_resolve Auto merge of #108324 - notriddle:notriddle/assoc-fn-method, r=compiler-errors,davidtwco,estebank,oli-obk 2023-02-23 00:19:12 +00:00
rustc_serialize Auto merge of #104754 - nnethercote:more-ThinVec-in-ast, r=the8472 2023-02-21 07:02:57 +00:00
rustc_session Auto merge of #103042 - davidtwco:translation-distributed-ftl, r=oli-obk 2023-02-22 15:14:22 +00:00
rustc_smir
rustc_span Add test for precise algorithm used 2023-02-19 22:59:22 +00:00
rustc_symbol_mangling Auto merge of #108340 - eggyal:remove_traversal_trait_aliases, r=oli-obk 2023-02-22 18:26:51 +00:00
rustc_target Auto merge of #106476 - keith:ks/add-sanitizer-support-for-modern-ios-platforms, r=badboy 2023-02-18 05:58:41 +00:00
rustc_trait_selection Auto merge of #108369 - compiler-errors:ty-error-more, r=BoxyUwU 2023-02-23 09:20:10 +00:00
rustc_traits Rename ty_error_with_guaranteed to ty_error, ty_error to ty_error_misc 2023-02-22 22:23:45 +00:00
rustc_transmute Remove type-traversal trait aliases 2023-02-22 17:04:58 +00:00
rustc_ty_utils Rename ty_error_with_guaranteed to ty_error, ty_error to ty_error_misc 2023-02-22 22:23:45 +00:00
rustc_type_ir make first component of dyn* use pointer layout+type, and adjust DynStar comment 2023-02-18 19:24:55 +00:00