Commit Graph

64 Commits

Author SHA1 Message Date
Jules Bertholet 76da7aebe4
Match ergonomics 2024: test type inference 2024-07-05 11:17:49 -04:00
Jules Bertholet 5a35fc446e
Match ergonomics 2024: `&` matches `&mut` on old editions 2024-07-05 11:17:13 -04:00
Jules Bertholet 5fd5b65093
Rename edition 2021 fail test 2024-07-05 11:06:18 -04:00
Jules Bertholet 372847dd44
Implement TC's match ergonomics 2024 proposal
Under gate `ref_pat_eat_one_layer_2024_structural`.
Enabling `ref_pat_eat_one_layer_2024` at the same time allows the union
of what the individual gates allow.
2024-06-27 00:12:24 -04:00
Trevor Gross 6fb6c19c96 Replace `f16` and `f128` pattern matching stubs with real implementations
This section of code depends on `rustc_apfloat` rather than our internal
types, so this is one potential ICE that we should be able to melt now.

This also fixes some missing range and match handling in `rustc_middle`.
2024-06-23 04:28:42 -05:00
Matthias Krüger 2611b292c4
Rollup merge of #125168 - Jules-Bertholet:match-ergonomics-2024-align-with-rfc, r=Nadrieril
Match ergonomics 2024: align implementation with RFC

- Remove eat-two-layers (`ref_pat_everywhere`)
- Consolidate `mut_preserve_binding_mode_2024` into `ref_pat_eat_one_layer_2024`
- `&mut` no longer peels off `&`
- Apply "no `ref mut` behind `&`" rule on all editions with `ref_pat_eat_one_layer_2024`
- Require `mut_ref` feature gate for all mutable by-reference bindings

r? ``@Nadrieril``

cc https://github.com/rust-lang/rust/issues/123076

``@rustbot`` label A-edition-2024 A-patterns
2024-06-06 04:17:26 +02:00
Nilstrieb 7b1527ff5f hir pretty: fix block indent 2024-05-20 20:30:44 +02:00
Jules Bertholet 0746577fa2
Gate implicit mutable by-reference bindings behind `mut ref` 2024-05-15 16:55:54 -04:00
Jules Bertholet eb91f3b051
`&mut` no longer peels off `&` 2024-05-15 16:06:05 -04:00
Jules Bertholet a32fb2f8aa
Remove `ref_pat_everywhere` 2024-05-15 16:06:04 -04:00
Jules Bertholet f57b970de8
Comments and fixes 2024-05-10 13:47:37 -04:00
Jules Bertholet 91bbbaa0f7
Fix spans when macros are involved 2024-05-10 13:47:36 -04:00
Jules Bertholet ed96c655c6
Various fixes:
- Only show error when move-check would not be triggered
- Add structured suggestion
2024-05-10 13:47:36 -04:00
Jules Bertholet 4f76f1069a
Match ergonomics 2024: let `&` patterns eat `&mut` 2024-05-10 13:47:34 -04:00
Ross Smyth 6967d1c0fc Stabilize exclusive_range 2024-05-02 19:42:31 -04:00
est31 c6e946d0f0 Change wording 2024-04-29 14:53:38 +02:00
est31 4284bca720 Add a note to the ArbitraryExpressionInPattern error 2024-04-28 21:27:26 +02:00
Jules Bertholet e3945bd3a8
Ensure inherited reference is never set to `&mut` behind an `&` 2024-04-15 23:34:50 -04:00
Jules Bertholet b6c409723b
Support `let &mut x = &&mut 0;` 2024-04-15 23:34:49 -04:00
Jules Bertholet 4cd87c463c
Properly downgrade inherited mutability 2024-04-15 23:34:47 -04:00
Jules Bertholet 93544d5db3
Match ergonomics 2024: Implement eat-one-layer 2024-04-15 23:34:44 -04:00
Guillaume Gomez f2f8d8b722
Rollup merge of #123311 - Jules-Bertholet:andpat-everywhere, r=Nadrieril
Match ergonomics: implement "`&`pat everywhere"

Implements the eat-two-layers (feature gate `and_pat_everywhere`, all editions) ~and the eat-one-layer (feature gate `and_eat_one_layer_2024`, edition 2024 only, takes priority on that edition when both feature gates are active)~ (EDIT: will be done in later PR) semantics.

cc #123076

r? ``@Nadrieril``

``@rustbot`` label A-patterns A-edition-2024
2024-04-05 16:38:50 +02:00
Michael Goulet bed8b70d67 Fix suggestions for match non-exhaustiveness 2024-04-02 19:06:28 -04:00
Michael Goulet 9d116e8e18 Don't ICE for postfix match after as 2024-04-02 18:31:42 -04:00
Jules Bertholet 9d200f2d88
Address review comments 2024-04-02 10:57:54 -05:00
Jules Bertholet f37a4d55ee
Implement "&<pat> everywhere"
The original proposal allows reference patterns
with "compatible" mutability, however it's not clear
what that means so for now we require an exact match.

I don't know the type system code well, so if something
seems to not make sense it's probably because I made a
mistake
2024-03-30 12:57:54 -05:00
Michael Goulet 950b40f111 Don't check match scrutinee of postfix match for unused parens 2024-03-26 11:16:49 -04:00
Matthias Krüger 783778c631
Rollup merge of #121619 - RossSmyth:pfix_match, r=petrochenkov
Experimental feature postfix match

This has a basic experimental implementation for the RFC postfix match (rust-lang/rfcs#3295, #121618). [Liaison is](https://rust-lang.zulipchat.com/#narrow/stream/213817-t-lang/topic/Postfix.20Match.20Liaison/near/423301844) ```@scottmcm``` with the lang team's [experimental feature gate process](https://github.com/rust-lang/lang-team/blob/master/src/how_to/experiment.md).

This feature has had an RFC for a while, and there has been discussion on it for a while. It would probably be valuable to see it out in the field rather than continue discussing it. This feature also allows to see how popular postfix expressions like this are for the postfix macros RFC, as those will take more time to implement.

It is entirely implemented in the parser, so it should be relatively easy to remove if needed.

This PR is split in to 5 commits to ease review.

1. The implementation of the feature & gating.
2. Add a MatchKind field, fix uses, fix pretty.
3. Basic rustfmt impl, as rustfmt crashes upon seeing this syntax without a fix.
4. Add new MatchSource to HIR for Clippy & other HIR consumers
2024-03-22 11:36:58 +01:00
Nadrieril f783043ebf Allow lint where we don't care 2024-03-09 01:13:42 +01:00
Ross Smyth 68a58f255a Add postfix-match experimental feature
Co-authored-by: Josh Stone <jistone@redhat.com>
2024-03-05 23:34:45 -05:00
Caio 2aab000105 Move tests 2024-03-03 16:30:48 -03:00
Ralf Jung 5b7786cd1d make non-PartialEq-typed consts as patterns a hard error 2024-02-25 11:30:10 +01:00
许杰友 Jieyou Xu (Joe) ec2cc761bc
[AUTO-GENERATED] Migrate ui tests from `//` to `//@` directives 2024-02-16 20:02:50 +00:00
Michael Goulet 6018e21d8a Remove a suggestion that is redundant 2024-02-15 17:20:44 +00:00
Michael Goulet c763f833d1 Only point out non-diverging arms for match suggestions 2024-02-15 15:44:46 +00:00
Matthias Krüger ed27148812
Rollup merge of #116284 - RalfJung:no-nan-match, r=cjgillot
make matching on NaN a hard error, and remove the rest of illegal_floating_point_literal_pattern

These arms would never be hit anyway, so the pattern makes little sense. We have had a future-compat lint against float matches in general for a *long* time, so I hope we can get away with immediately making this a hard error.

This is part of implementing https://github.com/rust-lang/rfcs/pull/3535.

Closes https://github.com/rust-lang/rust/issues/41620 by removing the lint.

https://github.com/rust-lang/reference/pull/1456 updates the reference to match.
2024-02-05 11:07:26 +01:00
Matthew Jasper 4feec41e05 `#![feature(inline_const_pat)]` is no longer incomplete 2024-02-01 10:27:54 +00:00
Ralf Jung 9f14fc4af4 add test checking behavior of matching on floats, and NaNs in consts 2024-01-26 17:25:03 +01:00
Ralf Jung 1254ee48c4 remove illegal_floating_point_literal_pattern lint 2024-01-26 17:25:02 +01:00
Esteban Küber 8221f9c837 Account for `!` arm in tail `match` expr
On functions with a default return type that influences the coerced type
of `match` arms, check if the failing arm is actually of type `!`. If
so, suggest changing the return type so the coercion against the prior
arms is successful.

```
error[E0308]: `match` arms have incompatible types
  --> $DIR/match-tail-expr-never-type-error.rs:9:13
   |
LL |   fn bar(a: bool) {
   |                  - help: try adding a return type: `-> i32`
LL | /     match a {
LL | |         true => 1,
   | |                 - this is found to be of type `{integer}`
LL | |         false => {
LL | |             never()
   | |             ^^^^^^^
   | |             |
   | |             expected integer, found `()`
   | |             this expression is of type `!`, but it get's coerced to `()` due to its surrounding expression
LL | |         }
LL | |     }
   | |_____- `match` arms have incompatible types
```

Fix #24157.
2023-11-27 16:19:02 +00:00
Nilstrieb 41e8d152dc Show number in error message even for one error
Co-authored-by: Adrian <adrian.iosdev@gmail.com>
2023-11-24 19:15:52 +01:00
Esteban Küber 5c3e01a340 On resolve error of `[rest..]`, suggest `[rest @ ..]`
When writing a pattern to collect multiple entries of a slice in a
single binding, it is easy to misremember or typo the appropriate syntax
to do so, instead writing the experimental `X..` pattern syntax. When we
encounter a resolve error because `X` isn't available, we suggest
`X @ ..` as an alternative.

```
error[E0425]: cannot find value `rest` in this scope
  --> $DIR/range-pattern-meant-to-be-slice-rest-pattern.rs:3:13
   |
LL |         [1, rest..] => println!("{rest:?}"),
   |             ^^^^ not found in this scope
   |
help: if you meant to collect the rest of the slice in `rest`, use the at operator
   |
LL |         [1, rest @ ..] => println!("{rest:?}"),
   |                  +
```

Fix #88404.
2023-11-17 00:55:55 +00:00
Nadrieril 746197c08a Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
Nadrieril 1baf8bf54d Fix range overflow checking 2023-10-11 04:55:55 +02:00
Nadrieril c5e17021cc Add tests 2023-10-11 04:54:49 +02:00
Ralf Jung a1d6fc4340 rename lint; add tracking issue 2023-09-25 19:05:10 +02:00
Ralf Jung c5fccb98ea work towards rejecting consts in patterns that do not implement PartialEq 2023-09-24 16:36:26 +02:00
Nikita Popov 531830cecd Update to LLVM 17.0.0
This rebases our LLVM fork to 17.0.0.

Fixes #115681.
2023-09-19 11:14:35 +02:00
Sebastian Toh d87b87d10e Improve clarity of diagnostic message on non-exhaustive matches 2023-09-03 19:55:11 +08:00
Sebastian Toh 43dd8613a3 Add note when matching on nested non-exhaustive enums 2023-08-28 14:50:32 +08:00