Make exhaustiveness error message more consistent for slice patterns
This improves error messages by indicating when slices above a certain lengths have not been matched. Previously, we would only report examples of such lengths, but of course never all of them.
This commit is contained in:
parent
b66973043e
commit
65bc67e8d9
8 changed files with 26 additions and 18 deletions
|
|
@ -841,9 +841,17 @@ impl<'tcx> Constructor<'tcx> {
|
|||
|
||||
ty::Ref(..) => PatKind::Deref { subpattern: subpatterns.nth(0).unwrap() },
|
||||
|
||||
ty::Slice(_) | ty::Array(..) => {
|
||||
PatKind::Slice { prefix: subpatterns.collect(), slice: None, suffix: vec![] }
|
||||
}
|
||||
ty::Slice(_) | ty::Array(..) => match self {
|
||||
FixedLenSlice(_) => {
|
||||
PatKind::Slice { prefix: subpatterns.collect(), slice: None, suffix: vec![] }
|
||||
}
|
||||
VarLenSlice(_) => {
|
||||
let prefix = subpatterns.collect();
|
||||
let wild = Pat { ty, span: DUMMY_SP, kind: Box::new(PatKind::Wild) };
|
||||
PatKind::Slice { prefix, slice: Some(wild), suffix: vec![] }
|
||||
}
|
||||
_ => bug!("bad slice pattern {:?} {:?}", self, ty),
|
||||
},
|
||||
|
||||
_ => match *self {
|
||||
ConstantValue(value, _) => PatKind::Constant { value },
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
error[E0005]: refutable pattern in function argument: `&[]`, `&[_]` and `&[_, _, _]` not covered
|
||||
error[E0005]: refutable pattern in function argument: `&[]`, `&[_]` and `&[_, _, _, ..]` not covered
|
||||
--> $DIR/const_let_refutable.rs:3:16
|
||||
|
|
||||
LL | const fn slice([a, b]: &[i32]) -> i32 {
|
||||
| ^^^^^^ patterns `&[]`, `&[_]` and `&[_, _, _]` not covered
|
||||
| ^^^^^^ patterns `&[]`, `&[_]` and `&[_, _, _, ..]` not covered
|
||||
|
||||
error[E0723]: can only call other `const fn` within a `const fn`, but `const <&i32 as std::ops::Add>::add` is not stable as `const fn`
|
||||
--> $DIR/const_let_refutable.rs:4:5
|
||||
|
|
|
|||
|
|
@ -6,11 +6,11 @@ LL | match buf {
|
|||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `&[]` not covered
|
||||
error[E0004]: non-exhaustive patterns: `&[..]` not covered
|
||||
--> $DIR/match-byte-array-patterns-2.rs:10:11
|
||||
|
|
||||
LL | match buf {
|
||||
| ^^^ pattern `&[]` not covered
|
||||
| ^^^ pattern `&[..]` not covered
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ fn main() {
|
|||
}
|
||||
let vec = vec![0.5f32];
|
||||
let vec: &[f32] = &vec;
|
||||
match *vec { //~ ERROR non-exhaustive patterns: `[_, _, _, _]` not covered
|
||||
match *vec { //~ ERROR non-exhaustive patterns: `[_, _, _, _, ..]` not covered
|
||||
[0.1, 0.2, 0.3] => (),
|
||||
[0.1, 0.2] => (),
|
||||
[0.1] => (),
|
||||
|
|
|
|||
|
|
@ -66,11 +66,11 @@ LL | match *vec {
|
|||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `[_, _, _, _]` not covered
|
||||
error[E0004]: non-exhaustive patterns: `[_, _, _, _, ..]` not covered
|
||||
--> $DIR/non-exhaustive-match.rs:47:11
|
||||
|
|
||||
LL | match *vec {
|
||||
| ^^^^ pattern `[_, _, _, _]` not covered
|
||||
| ^^^^ pattern `[_, _, _, _, ..]` not covered
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
|
|
|
|||
|
|
@ -48,11 +48,11 @@ fn main() {
|
|||
[true, .., true] => {}
|
||||
}
|
||||
match s {
|
||||
//~^ ERROR `&[_]` not covered
|
||||
//~^ ERROR `&[_, ..]` not covered
|
||||
[] => {}
|
||||
}
|
||||
match s {
|
||||
//~^ ERROR `&[_, _]` not covered
|
||||
//~^ ERROR `&[_, _, ..]` not covered
|
||||
[] => {}
|
||||
[_] => {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,19 +30,19 @@ LL | match s3 {
|
|||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `&[_]` not covered
|
||||
error[E0004]: non-exhaustive patterns: `&[_, ..]` not covered
|
||||
--> $DIR/slice-patterns.rs:50:11
|
||||
|
|
||||
LL | match s {
|
||||
| ^ pattern `&[_]` not covered
|
||||
| ^ pattern `&[_, ..]` not covered
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `&[_, _]` not covered
|
||||
error[E0004]: non-exhaustive patterns: `&[_, _, ..]` not covered
|
||||
--> $DIR/slice-patterns.rs:54:11
|
||||
|
|
||||
LL | match s {
|
||||
| ^ pattern `&[_, _]` not covered
|
||||
| ^ pattern `&[_, _, ..]` not covered
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
|
|
|
|||
|
|
@ -30,11 +30,11 @@ LL | let _ = match x {};
|
|||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `&[_]` not covered
|
||||
error[E0004]: non-exhaustive patterns: `&[_, ..]` not covered
|
||||
--> $DIR/uninhabited-matches-feature-gated.rs:21:19
|
||||
|
|
||||
LL | let _ = match x {
|
||||
| ^ pattern `&[_]` not covered
|
||||
| ^ pattern `&[_, ..]` not covered
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue