rust/tests/ui/pattern/usefulness
bors ee80c8d0a8 Auto merge of #117611 - Nadrieril:linear-pass-take-4, r=cjgillot
Rewrite exhaustiveness in one pass

This is at least my 4th attempt at this in as many years x) Previous attempts were all too complicated or too slow. But we're finally here!

The previous version of the exhaustiveness algorithm computed reachability for each arm then exhaustiveness of the whole match. Since each of these steps does roughly the same things, this rewrites the algorithm to do them all in one go. I also think this makes things much simpler.

I also rewrote the documentation of the algorithm in depth. Hopefully it's up-to-date and easier to follow now. Plz comment if anything's unclear.

r? `@oli-obk` I think you're one of the rare other people to understand the exhaustiveness algorithm?

cc `@varkor` I know you're not active anymore, but if you feel like having a look you might enjoy this :D

Fixes https://github.com/rust-lang/rust/issues/79307
2023-11-26 00:14:14 +00:00
..
auxiliary Add note when matching on nested non-exhaustive enums 2023-08-28 14:50:32 +08:00
integer-ranges Auto merge of #117611 - Nadrieril:linear-pass-take-4, r=cjgillot 2023-11-26 00:14:14 +00:00
always-inhabited-union-ref.rs
always-inhabited-union-ref.stderr
conflicting_bindings.rs Always do all the pattern checks 2023-11-02 03:19:19 +01:00
conflicting_bindings.stderr Always do all the pattern checks 2023-11-02 03:19:19 +01:00
const-partial_eq-fallback-ice.rs
const-partial_eq-fallback-ice.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
const-pat-ice.rs
const-private-fields.rs
consts-opaque.rs make pointer_structural_match warn-by-default 2023-10-28 17:02:18 +02:00
consts-opaque.stderr make pointer_structural_match warn-by-default 2023-10-28 17:02:18 +02:00
deny-irrefutable-let-patterns.rs
deny-irrefutable-let-patterns.stderr
doc-hidden-fields.rs
doc-hidden-fields.stderr
doc-hidden-non-exhaustive.rs
doc-hidden-non-exhaustive.stderr Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
empty-match.exhaustive_patterns.stderr Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
empty-match.normal.stderr Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
empty-match.rs Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
floats.rs Evaluate float consts eagerly 2023-10-01 00:00:37 +02:00
floats.stderr Evaluate float consts eagerly 2023-10-01 00:00:37 +02:00
guards.rs
guards.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
irrefutable-let-patterns.rs
irrefutable-unit.rs
issue-2111.rs
issue-2111.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-3096-1.rs
issue-3096-1.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-3096-2.rs
issue-3096-2.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-3601.rs Keep rows with guards in the matrix 2023-11-22 03:25:15 +01:00
issue-3601.stderr Auto merge of #117611 - Nadrieril:linear-pass-take-4, r=cjgillot 2023-11-26 00:14:14 +00:00
issue-4321.rs
issue-4321.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-12116.rs
issue-12116.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-12369.rs
issue-12369.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-13727.rs
issue-13727.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-15129.rs
issue-15129.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-30240-b.rs
issue-30240-b.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-30240-rpass.rs
issue-30240.rs
issue-30240.stderr Improve clarity of diagnostic message on non-exhaustive matches 2023-09-03 19:55:11 +08:00
issue-31221.rs
issue-31221.stderr
issue-31561.rs Migrate pattern matching 2023-01-11 14:40:02 -08:00
issue-31561.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-35609.rs
issue-35609.stderr Tweak diagnostic for consistency 2023-11-02 03:19:19 +01:00
issue-39362.rs
issue-39362.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-40221.rs
issue-40221.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-50900.rs
issue-50900.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-53820-slice-pattern-large-array.rs
issue-56379.rs
issue-56379.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-57472.rs
issue-57472.stderr
issue-65413-constants-and-slices-exhaustiveness.rs
issue-66501.rs
issue-71930-type-of-match-scrutinee.rs
issue-72377.rs
issue-72377.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-72476-and-89393-associated-type.rs
issue-78123-non-exhaustive-reference.rs
issue-78123-non-exhaustive-reference.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-78549-ref-pat-and-str.rs
issue-80501-or-pat-and-macro.rs
issue-82772-match-box-as-struct.rs
issue-82772-match-box-as-struct.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
issue-85222-types-containing-non-exhaustive-types.rs Match usize/isize exhaustively 2023-10-27 19:56:12 +02:00
issue-85222-types-containing-non-exhaustive-types.stderr Match usize/isize exhaustively 2023-10-27 19:56:12 +02:00
issue-88747.rs
issue-105479-str-non-exhaustiveness.rs Improve clarity of diagnostic message on non-exhaustive matches 2023-09-03 19:55:11 +08:00
issue-105479-str-non-exhaustiveness.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
match-arm-statics-2.rs
match-arm-statics-2.stderr
match-arm-statics.rs
match-arm-statics.stderr
match-byte-array-patterns-2.rs
match-byte-array-patterns-2.stderr Perform match checking on THIR. 2023-04-03 15:59:21 +00:00
match-byte-array-patterns.rs
match-byte-array-patterns.stderr
match-non-exhaustive.rs add note for non-exhaustive matches with guards 2023-06-28 01:51:53 -04:00
match-non-exhaustive.stderr Keep rows with guards in the matrix 2023-11-22 03:25:15 +01:00
match-privately-empty.rs
match-privately-empty.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
match-ref-ice.rs
match-ref-ice.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
match-slice-patterns.rs
match-slice-patterns.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
match-vec-fixed.rs
match-vec-fixed.stderr
match-vec-unreachable.rs
match-vec-unreachable.stderr
nested-exhaustive-match.rs
nested-non-exhaustive-enums.rs Add note when matching on nested non-exhaustive enums 2023-08-28 14:50:32 +08:00
nested-non-exhaustive-enums.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
non-exhaustive-defined-here.rs Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
non-exhaustive-defined-here.stderr Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
non-exhaustive-match-nested.rs
non-exhaustive-match-nested.stderr Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
non-exhaustive-match.rs
non-exhaustive-match.stderr Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
non-exhaustive-pattern-witness.rs Match usize/isize exhaustively 2023-10-27 19:56:12 +02:00
non-exhaustive-pattern-witness.stderr Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
refutable-pattern-errors.rs Match usize/isize exhaustively 2023-10-27 19:56:12 +02:00
refutable-pattern-errors.stderr Match usize/isize exhaustively 2023-10-27 19:56:12 +02:00
refutable-pattern-in-fn-arg.rs Match usize/isize exhaustively 2023-10-27 19:56:12 +02:00
refutable-pattern-in-fn-arg.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
slice_of_empty.rs Fix handling slices of empty types 2023-10-05 00:58:14 +02:00
slice_of_empty.stderr Fix handling slices of empty types 2023-10-05 00:58:14 +02:00
slice-pattern-const-2.rs
slice-pattern-const-2.stderr
slice-pattern-const-3.rs
slice-pattern-const-3.stderr
slice-pattern-const.rs
slice-pattern-const.stderr
slice-patterns-exhaustiveness.rs Keep rows with guards in the matrix 2023-11-22 03:25:15 +01:00
slice-patterns-exhaustiveness.stderr Keep rows with guards in the matrix 2023-11-22 03:25:15 +01:00
slice-patterns-irrefutable.rs
slice-patterns-reachability.rs
slice-patterns-reachability.stderr
stable-gated-fields.rs
stable-gated-fields.stderr
stable-gated-patterns.rs
stable-gated-patterns.stderr Tweak spans for "adt defined here" note 2023-11-03 18:26:16 +01:00
struct-like-enum-nonexhaustive.rs
struct-like-enum-nonexhaustive.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
struct-pattern-match-useless.rs
struct-pattern-match-useless.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
top-level-alternation.rs
top-level-alternation.stderr
tuple-struct-nonexhaustive.rs
tuple-struct-nonexhaustive.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
type_polymorphic_byte_str_literals.rs
type_polymorphic_byte_str_literals.stderr
uninhabited.rs
unstable-gated-fields.rs
unstable-gated-fields.stderr
unstable-gated-patterns.rs
unstable-gated-patterns.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00