Continue to emit unreachable pattern on cases caught by overlapping patterns

This commit is contained in:
Esteban Küber 2019-08-30 13:37:59 -07:00
parent 6832da85c2
commit 89b19ccfdc
6 changed files with 76 additions and 34 deletions

View file

@ -429,10 +429,6 @@ fn check_arms<'tcx>(
hir::MatchSource::ForLoopDesugar |
hir::MatchSource::Normal => {
if let box PatternKind::Range(..) = pat.kind {
// Covered by `overlapping_patterns` with more context
break;
}
let mut err = cx.tcx.struct_span_lint_hir(
lint::builtin::UNREACHABLE_PATTERNS,
hir_pat.hir_id,

View file

@ -32,6 +32,12 @@ LL | 1..10 => {},
LL | 8..=9 => {},
| ^^^^^ overlapping patterns
warning: unreachable pattern
--> $DIR/issue-43253.rs:35:9
|
LL | 8..=9 => {},
| ^^^^^
warning: unreachable pattern
--> $DIR/issue-43253.rs:41:9
|

View file

@ -41,7 +41,9 @@ fn main() {
match x { //~ ERROR non-exhaustive patterns
-7 => {}
-5..=120 => {}
-2..=20 => {} //~ ERROR multiple patterns covering the same range
-2..=20 => {}
//~^ ERROR unreachable pattern
//~| ERROR multiple patterns covering the same range
125 => {}
}

View file

@ -48,6 +48,12 @@ LL | -5..=120 => {}
LL | -2..=20 => {}
| ^^^^^^^ overlapping patterns
error: unreachable pattern
--> $DIR/exhaustive_integer_patterns.rs:44:9
|
LL | -2..=20 => {}
| ^^^^^^^
error[E0004]: non-exhaustive patterns: `std::i8::MIN..=-8i8`, `-6i8`, `121i8..=124i8` and 1 more not covered
--> $DIR/exhaustive_integer_patterns.rs:41:11
|
@ -57,7 +63,7 @@ LL | match x {
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
error[E0004]: non-exhaustive patterns: `std::i8::MIN` not covered
--> $DIR/exhaustive_integer_patterns.rs:82:11
--> $DIR/exhaustive_integer_patterns.rs:84:11
|
LL | match 0i8 {
| ^^^ pattern `std::i8::MIN` not covered
@ -65,7 +71,7 @@ LL | match 0i8 {
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
error[E0004]: non-exhaustive patterns: `0i16` not covered
--> $DIR/exhaustive_integer_patterns.rs:90:11
--> $DIR/exhaustive_integer_patterns.rs:92:11
|
LL | match 0i16 {
| ^^^^ pattern `0i16` not covered
@ -73,7 +79,7 @@ LL | match 0i16 {
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
error[E0004]: non-exhaustive patterns: `128u8..=std::u8::MAX` not covered
--> $DIR/exhaustive_integer_patterns.rs:108:11
--> $DIR/exhaustive_integer_patterns.rs:110:11
|
LL | match 0u8 {
| ^^^ pattern `128u8..=std::u8::MAX` not covered
@ -81,7 +87,7 @@ LL | match 0u8 {
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
error[E0004]: non-exhaustive patterns: `(0u8, Some(_))` and `(2u8..=std::u8::MAX, Some(_))` not covered
--> $DIR/exhaustive_integer_patterns.rs:120:11
--> $DIR/exhaustive_integer_patterns.rs:122:11
|
LL | match (0u8, Some(())) {
| ^^^^^^^^^^^^^^^ patterns `(0u8, Some(_))` and `(2u8..=std::u8::MAX, Some(_))` not covered
@ -89,7 +95,7 @@ LL | match (0u8, Some(())) {
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
error[E0004]: non-exhaustive patterns: `(126u8..=127u8, false)` not covered
--> $DIR/exhaustive_integer_patterns.rs:125:11
--> $DIR/exhaustive_integer_patterns.rs:127:11
|
LL | match (0u8, true) {
| ^^^^^^^^^^^ pattern `(126u8..=127u8, false)` not covered
@ -97,7 +103,7 @@ LL | match (0u8, true) {
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
error: multiple patterns covering the same range
--> $DIR/exhaustive_integer_patterns.rs:140:9
--> $DIR/exhaustive_integer_patterns.rs:142:9
|
LL | 0 .. 2 => {}
| ------ this range overlaps on `1u8`
@ -105,7 +111,7 @@ LL | 1 ..= 2 => {}
| ^^^^^^^ overlapping patterns
error[E0004]: non-exhaustive patterns: `std::u128::MAX` not covered
--> $DIR/exhaustive_integer_patterns.rs:145:11
--> $DIR/exhaustive_integer_patterns.rs:147:11
|
LL | match 0u128 {
| ^^^^^ pattern `std::u128::MAX` not covered
@ -113,7 +119,7 @@ LL | match 0u128 {
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
error[E0004]: non-exhaustive patterns: `5u128..=std::u128::MAX` not covered
--> $DIR/exhaustive_integer_patterns.rs:149:11
--> $DIR/exhaustive_integer_patterns.rs:151:11
|
LL | match 0u128 {
| ^^^^^ pattern `5u128..=std::u128::MAX` not covered
@ -121,13 +127,13 @@ LL | match 0u128 {
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
error[E0004]: non-exhaustive patterns: `0u128..=3u128` not covered
--> $DIR/exhaustive_integer_patterns.rs:153:11
--> $DIR/exhaustive_integer_patterns.rs:155:11
|
LL | match 0u128 {
| ^^^^^ pattern `0u128..=3u128` not covered
|
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
error: aborting due to 15 previous errors
error: aborting due to 16 previous errors
For more information about this error, try `rustc --explain E0004`.

View file

@ -3,25 +3,33 @@
fn main() {
match 5 {
1 ..= 10 => { }
5 ..= 6 => { } //~ ERROR multiple patterns covering the same range
5 ..= 6 => { }
//~^ ERROR unreachable pattern
//~| ERROR multiple patterns covering the same range
_ => {}
};
match 5 {
3 ..= 6 => { }
4 ..= 6 => { } //~ ERROR multiple patterns covering the same range
4 ..= 6 => { }
//~^ ERROR unreachable pattern
//~| ERROR multiple patterns covering the same range
_ => {}
};
match 5 {
4 ..= 6 => { }
4 ..= 6 => { } //~ ERROR multiple patterns covering the same range
4 ..= 6 => { }
//~^ ERROR unreachable pattern
//~| ERROR multiple patterns covering the same range
_ => {}
};
match 'c' {
'A' ..= 'z' => {}
'a' ..= 'z' => {} //~ ERROR multiple patterns covering the same range
'a' ..= 'z' => {}
//~^ ERROR unreachable pattern
//~| ERROR multiple patterns covering the same range
_ => {}
};

View file

@ -12,32 +12,62 @@ note: lint level defined here
LL | #![deny(unreachable_patterns, overlapping_patterns)]
| ^^^^^^^^^^^^^^^^^^^^
error: unreachable pattern
--> $DIR/match-range-fail-dominate.rs:6:7
|
LL | 5 ..= 6 => { }
| ^^^^^^^
|
note: lint level defined here
--> $DIR/match-range-fail-dominate.rs:1:9
|
LL | #![deny(unreachable_patterns, overlapping_patterns)]
| ^^^^^^^^^^^^^^^^^^^^
error: multiple patterns covering the same range
--> $DIR/match-range-fail-dominate.rs:12:7
--> $DIR/match-range-fail-dominate.rs:14:7
|
LL | 3 ..= 6 => { }
| ------- this range overlaps on `4i32..=6i32`
LL | 4 ..= 6 => { }
| ^^^^^^^ overlapping patterns
error: unreachable pattern
--> $DIR/match-range-fail-dominate.rs:14:7
|
LL | 4 ..= 6 => { }
| ^^^^^^^
error: multiple patterns covering the same range
--> $DIR/match-range-fail-dominate.rs:18:7
--> $DIR/match-range-fail-dominate.rs:22:7
|
LL | 4 ..= 6 => { }
| ------- this range overlaps on `4i32..=6i32`
LL | 4 ..= 6 => { }
| ^^^^^^^ overlapping patterns
error: unreachable pattern
--> $DIR/match-range-fail-dominate.rs:22:7
|
LL | 4 ..= 6 => { }
| ^^^^^^^
error: multiple patterns covering the same range
--> $DIR/match-range-fail-dominate.rs:24:7
--> $DIR/match-range-fail-dominate.rs:30:7
|
LL | 'A' ..= 'z' => {}
| ----------- this range overlaps on `'a'..='z'`
LL | 'a' ..= 'z' => {}
| ^^^^^^^^^^^ overlapping patterns
error: unreachable pattern
--> $DIR/match-range-fail-dominate.rs:30:7
|
LL | 'a' ..= 'z' => {}
| ^^^^^^^^^^^
warning: floating-point types cannot be used in patterns
--> $DIR/match-range-fail-dominate.rs:29:7
--> $DIR/match-range-fail-dominate.rs:37:7
|
LL | 0.01f64 ..= 6.5f64 => {}
| ^^^^^^^
@ -47,7 +77,7 @@ LL | 0.01f64 ..= 6.5f64 => {}
= note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620>
warning: floating-point types cannot be used in patterns
--> $DIR/match-range-fail-dominate.rs:29:19
--> $DIR/match-range-fail-dominate.rs:37:19
|
LL | 0.01f64 ..= 6.5f64 => {}
| ^^^^^^
@ -56,7 +86,7 @@ LL | 0.01f64 ..= 6.5f64 => {}
= note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620>
warning: floating-point types cannot be used in patterns
--> $DIR/match-range-fail-dominate.rs:36:7
--> $DIR/match-range-fail-dominate.rs:44:7
|
LL | 0.02f64 => {}
| ^^^^^^^
@ -65,19 +95,13 @@ LL | 0.02f64 => {}
= note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620>
error: unreachable pattern
--> $DIR/match-range-fail-dominate.rs:36:7
--> $DIR/match-range-fail-dominate.rs:44:7
|
LL | 0.02f64 => {}
| ^^^^^^^
|
note: lint level defined here
--> $DIR/match-range-fail-dominate.rs:1:9
|
LL | #![deny(unreachable_patterns, overlapping_patterns)]
| ^^^^^^^^^^^^^^^^^^^^
warning: floating-point types cannot be used in patterns
--> $DIR/match-range-fail-dominate.rs:29:7
--> $DIR/match-range-fail-dominate.rs:37:7
|
LL | 0.01f64 ..= 6.5f64 => {}
| ^^^^^^^
@ -85,5 +109,5 @@ LL | 0.01f64 ..= 6.5f64 => {}
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620>
error: aborting due to 5 previous errors
error: aborting due to 9 previous errors