Commit graph

86 commits

Author SHA1 Message Date
bors
36ecbc94eb Auto merge of #80632 - Nadrieril:fix-80501, r=varkor
Identify unreachable subpatterns more reliably

In https://github.com/rust-lang/rust/pull/80104 I used `Span`s to identify unreachable sub-patterns in the presence of or-patterns during exhaustiveness checking. In https://github.com/rust-lang/rust/issues/80501 it was revealed that `Span`s are complicated and that this was not a good idea.
Instead, this PR identifies subpatterns logically: as a path in the tree of subpatterns of a given pattern. I made a struct that captures a set of such subpatterns. This is a bit complex, but thankfully self-contained; the rest of the code does not need to know anything about it.
Fixes https://github.com/rust-lang/rust/issues/80501. I think I managed to keep the perf neutral.

r? `@varkor`
2021-02-07 16:48:57 +00:00
Dan Aloni
eaefe4a230 path trimming: ignore type aliases 2021-02-06 12:03:48 +02:00
Nadrieril
307a278d5c Identify subpatterns by the path to them instead of spans 2021-01-24 20:28:30 +00:00
Nadrieril
3c1a1c6227 Add tests 2021-01-24 20:28:28 +00:00
Nadrieril
b82f149d08 Add tests for uninhabited types 2021-01-12 19:59:10 +00:00
Nadrieril
622bfdb2fd Deduplicate some tests using revisions 2021-01-12 19:59:10 +00:00
Daniel Noom
914bc17178 Add notes to stderr of non-exhaustive-reference test 2021-01-03 21:12:27 +01:00
Daniel Noom
998bf0ab88 Add note to non-exhaustive match on reference to empty
Rust prints "type `&A` is non-empty" even is A is empty.
This is the intended behavior, but can be confusing.
This commit adds a note to non-exhaustive pattern errors if they are a
reference to something uninhabited.

I did not add tests to check that the note is not shown for
non-references or inhabited references, because this is already done
in other tests.

Maybe the added test is superfluous, because
`always-inhabited-union-ref` already checks for this case.

This does not handle &&Void or &&&void etc. I could add those as special
cases as well and ignore people who need quadruple
references.

Fixes #78123
2021-01-03 19:05:23 +01:00
Nadrieril
42b77c709e Add some tests 2020-12-22 15:20:23 +00:00
bors
75e1acb63a Auto merge of #78242 - Nadrieril:rename-overlapping_endpoints-lint, r=varkor
Rename `overlapping_patterns` lint

As discussed in https://github.com/rust-lang/rust/issues/65477. I also tweaked a few things along the way.

r? `@varkor`
`@rustbot` modify labels: +A-exhaustiveness-checking
2020-12-22 10:32:03 +00:00
Nadrieril
5b6c175566 Tweak diagnostics 2020-12-19 17:48:31 +00:00
Nadrieril
2d71a0b9b9 Keep all witnesses of non-exhaustiveness 2020-12-18 16:21:38 +00:00
Nadrieril
2309783a0b Add tests 2020-12-18 16:21:38 +00:00
Nadrieril
5687c16279 overlapping_range_endpoints does not belong in the unused lint group 2020-11-29 21:29:19 +00:00
Nadrieril
94ad5e1672 Improve error message 2020-11-29 21:29:19 +00:00
Nadrieril
c89d439bb5 Be consistent about linting singletons 2020-11-29 21:29:19 +00:00
Nadrieril
d1a50ffb7c Rename the overlapping_patterns lint to overlapping_range_endpoints 2020-11-29 21:29:19 +00:00
Nadrieril
06ca6bba8d Add tests 2020-11-29 21:29:18 +00:00
Nadrieril
d8983655c1 Correctly detect usize/isize range overlaps 2020-11-28 21:23:38 +00:00
Nadrieril
3213efcd9a Improve integer range tests 2020-11-21 01:38:42 +00:00
Nadrieril
82bf5b61cd Regroup many usefulness-related test in the same folder 2020-11-19 19:52:54 +00:00
bors
8256379832 Auto merge of #78995 - Nadrieril:clean-empty-match, r=varkor
Handle empty matches cleanly in exhaustiveness checking

This removes the special-casing of empty matches that was done in `check_match`. This fixes most of https://github.com/rust-lang/rust/issues/55123.
Somewhat unrelatedly, I also made `_match.rs` more self-contained, because I think it's cleaner.

r? `@varkor`
`@rustbot` modify labels: +A-exhaustiveness-checking
2020-11-18 21:24:40 +00:00
oli
a1cdf722f4 Fix exhaustiveness in case a byte string literal is used at slice type 2020-11-17 09:07:23 +00:00
Nadrieril
69821cf8df Add a test for foreign empty enums 2020-11-16 21:13:00 +00:00
Nadrieril
b025813f03 Handle empty matches cleanly 2020-11-12 17:41:36 +00:00
Nadrieril
257ed899c8 Add tests 2020-11-12 17:24:42 +00:00
Nadrieril
4cd30197eb Fix #78549
Before #78430, string literals worked because `specialize_constructor`
didn't actually care too much which constructor was passed to it unless
needed. Since then, string literals are special cased and a bit hacky. I
did not anticipate patterns for the `&str` type other than string
literals, hence this bug. This makes string literals less hacky.
2020-11-01 02:04:42 +00:00
Nadrieril
5bfd3e7259 Accidentally fixed #78071 2020-10-20 00:06:00 +01:00
Nadrieril
da0ba2f645 The only remaining constant patterns are opaque 2020-10-18 14:21:20 +01:00
Oliver Scherer
bb8111069e Destructure byte array constants to array patterns instead of keeping them opaque 2020-10-18 14:21:20 +01:00
Nadrieril
3b37d941a2 Add some tests 2020-10-18 14:21:19 +01:00
Oliver Scherer
b2532a8730 Implement destructuring for all aggregates and for references 2020-09-20 13:28:18 +02:00
Dan Aloni
07e7823c01 pretty: trim paths of unique symbols
If a symbol name can only be imported from one place for a type, and
as long as it was not glob-imported anywhere in the current crate, we
can trim its printed path and print only the name.

This has wide implications on error messages with types, for example,
shortening `std::vec::Vec` to just `Vec`, as long as there is no other
`Vec` importable anywhere.

This adds a new '-Z trim-diagnostic-paths=false' option to control this
feature.

On the good path, with no diagnosis printed, we should try to avoid
issuing this query, so we need to prevent trimmed_def_paths query on
several cases.

This change also relies on a previous commit that differentiates
between `Debug` and `Display` on various rustc types, where the latter
is trimmed and presented to the user and the former is not.
2020-09-02 22:26:37 +03:00
mark
2c31b45ae8 mv std libs to library/ 2020-07-27 19:51:13 -05:00
Yuki Okushi
b93ecc1dac
Address code reviews 2020-07-05 03:43:43 +09:00
Yuki Okushi
dcbe85abad
Explain exhaustive matching on {usize,isize} maximum values 2020-07-05 02:10:57 +09:00
Oliver Scherer
819cde5dab Show the values and computation that would overflow a const evaluation or propagation 2020-06-26 10:08:52 +02:00
Lzu Tao
c755292859 Prefer the associated consts for pattern matching error 2020-06-13 01:18:18 +00:00
Nadrieril
3e8ba3a3cb Remove out-of-date comment 2020-05-23 19:39:38 +01:00
Nadrieril
7addc115eb Work around type normalization issues 2020-05-23 18:59:27 +01:00
Nadrieril
e5a2cd526a We don't use tyerr anymore
This however unearthed a bug, hence the FIXME and the workaround.
2020-05-17 17:38:23 +01:00
RoccoDev
b85c64c3ea
rustc: Add a warning count upon completion 2020-04-11 16:15:24 +02:00
Eduard-Mihai Burtescu
8deff18529 tests: remove ignore directives from tests that mention core/alloc/std spans. 2020-04-02 11:48:34 +03:00
Mazdak Farrokhzad
c858593ed0 non-exhastive diagnostic: add note re. scrutinee type 2020-03-27 06:49:07 +01:00
Aaron Hill
86b8dea5ec
Ignore tests on some platforms due to #53081 2020-03-23 02:04:43 -04:00
Aaron Hill
96e2d03d4b
Store idents for DefPathData into crate metadata
Previously, we threw away the `Span` associated with a definition's
identifier when we encoded crate metadata, causing us to lose location
and hygiene information.

We now store the identifier's `Span` in the crate metadata.
When we decode items from the metadata, we combine
the name and span back into an `Ident`.

This improves the output of several tests, which previously had messages
suppressed due to dummy spans.

This is a prerequisite for #68686, since throwing away a `Span` means
that we lose hygiene information.
2020-03-22 23:40:19 -04:00
Matthew Jasper
1ee5829575 Update tests for erasing regions in typeck 2020-03-17 09:07:56 +00:00
varkor
24a2929ed1 Normalise notes with the/is 2020-01-24 16:24:50 +00:00
Mazdak Farrokhzad
58eb03d20f check_match: simplify check_arm 2020-01-20 23:39:24 +01:00
Mazdak Farrokhzad
e3c2f8fc57 slice_patterns: organize some tests 2020-01-18 19:33:47 +01:00