rust/compiler
Dylan DPC 0138151c21
Rollup merge of #118625 - ShE3py:expr-in-pats, r=WaffleLapkin
Improve handling of expressions in patterns

Closes #112593.

Methodcalls' dots in patterns are silently recovered as commas (e.g. `Foo("".len())` -> `Foo("", len())`) so extra diagnostics are emitted:
```rs
struct Foo(u8, String, u8);

fn bar(foo: Foo) -> bool {
    match foo {
        Foo(4, "yippee".yeet(), 7) => true,
        _ => false
    }
}
```
```
error: expected one of `)`, `,`, `...`, `..=`, `..`, or `|`, found `.`
 --> main.rs:5:24
  |
5 |         Foo(4, "yippee".yeet(), 7) => true,
  |                        ^
  |                        |
  |                        expected one of `)`, `,`, `...`, `..=`, `..`, or `|`
  |                        help: missing `,`

error[E0531]: cannot find tuple struct or tuple variant `yeet` in this scope
 --> main.rs:5:25
  |
5 |         Foo(4, "yippee".yeet(), 7) => true,
  |                         ^^^^ not found in this scope

error[E0023]: this pattern has 4 fields, but the corresponding tuple struct has 3 fields
 --> main.rs:5:13
  |
1 | struct Foo(u8, String, u8);
  |            --  ------  -- tuple struct has 3 fields
...
5 |         Foo(4, "yippee".yeet(), 7) => true,
  |             ^  ^^^^^^^^ ^^^^^^  ^ expected 3 fields, found 4

error: aborting due to 3 previous errors
```

This PR checks for patterns that ends with a dot and a lowercase ident (as structs/variants should be uppercase):
```
error: expected a pattern, found a method call
 --> main.rs:5:16
  |
5 |         Foo(4, "yippee".yeet(), 7) => true,
  |                ^^^^^^^^^^^^^^^ method calls are not allowed in patterns

error: aborting due to 1 previous error
```

Also check for expressions:
```rs
fn is_idempotent(x: f32) -> bool {
    match x {
        x * x => true,
        _ => false,
    }
}

fn main() {
    let mut t: [i32; 5];
    let t[0] = 1;
}
```
```
error: expected a pattern, found an expression
 --> main.rs:3:9
  |
3 |         x * x => true,
  |         ^^^^^ arbitrary expressions are not allowed in patterns

error: expected a pattern, found an expression
  --> main.rs:10:9
   |
10 |     let t[0] = 1;
   |         ^^^^ arbitrary expressions are not allowed in patterns
```

Would be cool if the compiler could suggest adding a guard for `match`es, but I've no idea how to do it.

---
`@rustbot` label +A-diagnostics +A-parser +A-patterns +C-enhancement
2024-01-29 12:56:51 +00:00
..
rustc Clean up rustc_*/Cargo.toml. 2023-10-30 08:46:02 +11:00
rustc_abi Fix rustc_abi build on stable 2024-01-16 21:15:31 +01:00
rustc_arena Fix Stable trait and its impls to work with the new with_tables 2024-01-19 09:42:51 +00:00
rustc_ast Rollup merge of #120329 - nnethercote:3349-precursors, r=fee1-dead 2024-01-26 14:43:31 +01:00
rustc_ast_lowering Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_ast_passes Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_ast_pretty Remove unused features 2024-01-25 14:01:33 +00:00
rustc_attr Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_baked_icu_data Bump cfg(bootstrap)s 2023-11-15 19:41:28 -05:00
rustc_borrowck Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_builtin_macros Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_codegen_cranelift Merge commit '3e50cf6502' into sync_cg_clif-2024-01-26 2024-01-26 18:33:45 +00:00
rustc_codegen_gcc Auto merge of #116167 - RalfJung:structural-eq, r=lcnr 2024-01-26 00:17:00 +00:00
rustc_codegen_llvm Auto merge of #120062 - davidtwco:llvm-data-layout-check, r=wesleywiser 2024-01-27 12:19:41 +00:00
rustc_codegen_ssa Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_const_eval Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_data_structures Remove unused features 2024-01-25 14:01:33 +00:00
rustc_driver Bump cfg(bootstrap)s 2023-11-15 19:41:28 -05:00
rustc_driver_impl Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_error_codes Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_error_messages Remove unused features 2024-01-25 14:01:33 +00:00
rustc_errors Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_expand Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_feature Add feature gate 2024-01-24 23:52:03 +01:00
rustc_fluent_macro annotate-snippets: update to 0.10 2024-01-07 16:53:32 +03:00
rustc_fs_util Clean up rustc_*/Cargo.toml. 2023-10-30 08:46:02 +11:00
rustc_graphviz remove unused pub fn 2023-11-23 14:11:02 +03:00
rustc_hir Auto merge of #119968 - clubby789:unused-feature, r=compiler-errors 2024-01-26 03:18:34 +00:00
rustc_hir_analysis Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_hir_pretty Add PatKind::Err 2024-01-17 03:14:16 +01:00
rustc_hir_typeck Auto merge of #120165 - reitermarkus:nonzero-switch-alias-direction, r=dtolnay 2024-01-29 08:52:13 +00:00
rustc_incremental Remove unused features 2024-01-25 14:01:33 +00:00
rustc_index Auto merge of #120024 - Mark-Simulacrum:fast-union-merge, r=cjgillot 2024-01-27 22:26:37 +00:00
rustc_index_macros Restrict access to the private field of newtype indexes 2024-01-19 15:38:47 +00:00
rustc_infer Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_interface Remove unused features 2024-01-25 14:01:33 +00:00
rustc_lexer Use unescape_unicode for raw C string literals. 2024-01-25 12:28:11 +11:00
rustc_lint Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_lint_defs Rollup merge of #119948 - asquared31415:unsafe_op_in_unsafe_fn_fix, r=TaKO8Ki 2024-01-22 16:13:28 +01:00
rustc_llvm Revert "Auto merge of #113923 - DianQK:restore-no-builtins-lto, r=pnkfelix" 2024-01-12 18:23:04 +08:00
rustc_log rustc_log: provide a way to init logging based on the values, not names, of the env vars 2023-11-11 15:24:33 +01:00
rustc_macros Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_metadata Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_middle Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_mir_build Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_mir_dataflow Remove unused features 2024-01-25 14:01:33 +00:00
rustc_mir_transform Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_monomorphize Remove unused features 2024-01-25 14:01:33 +00:00
rustc_next_trait_solver Remove movability from TyKind::Coroutine 2023-12-28 16:35:01 +00:00
rustc_parse Rollup merge of #118625 - ShE3py:expr-in-pats, r=WaffleLapkin 2024-01-29 12:56:51 +00:00
rustc_parse_format Rename the unescaping functions. 2024-01-25 12:28:11 +11:00
rustc_passes Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_pattern_analysis Rollup merge of #118803 - Nadrieril:min-exhaustive-patterns, r=compiler-errors 2024-01-26 06:36:36 +01:00
rustc_privacy Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_query_impl Remove unused features 2024-01-25 14:01:33 +00:00
rustc_query_system Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_resolve Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_serialize Remove unused features 2024-01-25 14:01:33 +00:00
rustc_session Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_smir Do not normalize closure signature when building FnOnce shim 2024-01-22 16:50:30 +00:00
rustc_span Add NonZero symbol. 2024-01-27 16:38:57 +01:00
rustc_symbol_mangling Auto merge of #118636 - h1467792822:dev, r=michaelwoerister 2024-01-27 02:32:30 +00:00
rustc_target Remove unused features 2024-01-25 14:01:33 +00:00
rustc_trait_selection Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_traits Remove unused features 2024-01-25 14:01:33 +00:00
rustc_transmute Remove unused features 2024-01-25 14:01:33 +00:00
rustc_ty_utils Stop using String for error codes. 2024-01-29 07:41:41 +11:00
rustc_type_ir Restrict access to the private field of newtype indexes 2024-01-19 15:38:47 +00:00
stable_mir Remove unused features 2024-01-25 14:01:33 +00:00