diff options
| author | bors <bors@rust-lang.org> | 2019-09-11 18:46:18 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-09-11 18:46:18 +0000 |
| commit | f0b58fcf03391a91f74224fe38a696d5a5b789d9 (patch) | |
| tree | fcfed11712e1af5cad16ef353352914ccfef69d5 /src/test/ui/issues | |
| parent | fe6d05a8b32f5c66c427ca524dbcce5a7145f87e (diff) | |
| parent | 20a26055b7afa500e1b00c6e5a3d03a1208c1d00 (diff) | |
| download | rust-f0b58fcf03391a91f74224fe38a696d5a5b789d9.tar.gz rust-f0b58fcf03391a91f74224fe38a696d5a5b789d9.zip | |
Auto merge of #64271 - Centril:non-exhaustive-peel-refs, r=estebank
check_match: refactor + improve non-exhaustive diagnostics for default binding modes
Refactor `check_match` a bit with more code-reuse and improve the diagnostics for a non-exhaustive pattern match by peeling off any references from the scrutinee type so that the "defined here" label is added in more cases. For example:
```rust
error[E0004]: non-exhaustive patterns: `&mut &B` not covered
--> foo.rs:4:11
|
1 | enum E { A, B }
| ---------------
| | |
| | not covered
| `E` defined here
...
4 | match x {
| ^ pattern `&mut &B` not covered
|
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
```
Moreover, wrt. "defined here", we give irrefutable pattern matching (i.e. in `let`, `for`, and `fn` parameters) a more consistent treatment in line with `match`.
r? @estebank
Diffstat (limited to 'src/test/ui/issues')
| -rw-r--r-- | src/test/ui/issues/issue-15381.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-15381.stderr | 4 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-31561.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-31561.stderr | 6 |
4 files changed, 8 insertions, 6 deletions
diff --git a/src/test/ui/issues/issue-15381.rs b/src/test/ui/issues/issue-15381.rs index 4c8e1b41bee..5307153cb44 100644 --- a/src/test/ui/issues/issue-15381.rs +++ b/src/test/ui/issues/issue-15381.rs @@ -2,7 +2,7 @@ fn main() { let values: Vec<u8> = vec![1,2,3,4,5,6,7,8]; for &[x,y,z] in values.chunks(3).filter(|&xs| xs.len() == 3) { - //~^ ERROR refutable pattern in `for` loop binding: `&[]` not covered + //~^ ERROR refutable pattern in `for` loop binding: `&[]`, `&[_]`, `&[_, _]` and 1 more not println!("y={}", y); //~^ ERROR borrow of possibly-uninitialized variable: `y` } diff --git a/src/test/ui/issues/issue-15381.stderr b/src/test/ui/issues/issue-15381.stderr index e8106059052..47a0d514ad8 100644 --- a/src/test/ui/issues/issue-15381.stderr +++ b/src/test/ui/issues/issue-15381.stderr @@ -1,8 +1,8 @@ -error[E0005]: refutable pattern in `for` loop binding: `&[]` not covered +error[E0005]: refutable pattern in `for` loop binding: `&[]`, `&[_]`, `&[_, _]` and 1 more not covered --> $DIR/issue-15381.rs:4:9 | LL | for &[x,y,z] in values.chunks(3).filter(|&xs| xs.len() == 3) { - | ^^^^^^^^ pattern `&[]` not covered + | ^^^^^^^^ patterns `&[]`, `&[_]`, `&[_, _]` and 1 more not covered error[E0381]: borrow of possibly-uninitialized variable: `y` --> $DIR/issue-15381.rs:6:26 diff --git a/src/test/ui/issues/issue-31561.rs b/src/test/ui/issues/issue-31561.rs index 87b19fe5ea7..813b2409cc8 100644 --- a/src/test/ui/issues/issue-31561.rs +++ b/src/test/ui/issues/issue-31561.rs @@ -6,5 +6,5 @@ enum Thing { fn main() { let Thing::Foo(y) = Thing::Foo(1); - //~^ ERROR refutable pattern in local binding: `Bar` not covered + //~^ ERROR refutable pattern in local binding: `Bar` and `Baz` not covered } diff --git a/src/test/ui/issues/issue-31561.stderr b/src/test/ui/issues/issue-31561.stderr index 246137aeee0..9ec26b024bc 100644 --- a/src/test/ui/issues/issue-31561.stderr +++ b/src/test/ui/issues/issue-31561.stderr @@ -1,15 +1,17 @@ -error[E0005]: refutable pattern in local binding: `Bar` not covered +error[E0005]: refutable pattern in local binding: `Bar` and `Baz` not covered --> $DIR/issue-31561.rs:8:9 | LL | / enum Thing { LL | | Foo(u8), LL | | Bar, + | | --- not covered LL | | Baz + | | --- not covered LL | | } | |_- `Thing` defined here ... LL | let Thing::Foo(y) = Thing::Foo(1); - | ^^^^^^^^^^^^^ pattern `Bar` not covered + | ^^^^^^^^^^^^^ patterns `Bar` and `Baz` not covered error: aborting due to previous error |
