Explain exhaustive matching on {usize,isize} maximum values
This commit is contained in:
parent
0cd7ff7ddf
commit
dcbe85abad
4 changed files with 59 additions and 1 deletions
|
|
@ -468,6 +468,7 @@ fn check_exhaustive<'p, 'tcx>(
|
|||
// In the case of an empty match, replace the '`_` not covered' diagnostic with something more
|
||||
// informative.
|
||||
let mut err;
|
||||
let joined_patterns = joined_uncovered_patterns(&witnesses);
|
||||
if is_empty_match && !non_empty_enum {
|
||||
err = create_e0004(
|
||||
cx.tcx.sess,
|
||||
|
|
@ -475,7 +476,6 @@ fn check_exhaustive<'p, 'tcx>(
|
|||
format!("non-exhaustive patterns: type `{}` is non-empty", scrut_ty),
|
||||
);
|
||||
} else {
|
||||
let joined_patterns = joined_uncovered_patterns(&witnesses);
|
||||
err = create_e0004(
|
||||
cx.tcx.sess,
|
||||
sp,
|
||||
|
|
@ -490,6 +490,14 @@ fn check_exhaustive<'p, 'tcx>(
|
|||
possibly by adding wildcards or more match arms",
|
||||
);
|
||||
err.note(&format!("the matched value is of type `{}`", scrut_ty));
|
||||
if (scrut_ty == cx.tcx.types.usize || scrut_ty == cx.tcx.types.isize)
|
||||
&& joined_patterns == "`_`"
|
||||
{
|
||||
err.note("for `usize` and `isize`, no assumptions about the maximum value are permitted");
|
||||
err.note(
|
||||
"to exhaustively match on either pointer-size integer type, wildcards must be used",
|
||||
);
|
||||
}
|
||||
err.emit();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ LL | match 0usize {
|
|||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
= note: the matched value is of type `usize`
|
||||
= note: for `usize` and `isize`, no assumptions about the maximum value are permitted
|
||||
= note: to exhaustively match on either pointer-size integer type, wildcards must be used
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `_` not covered
|
||||
--> $DIR/feature-gate-precise_pointer_size_matching.rs:10:11
|
||||
|
|
@ -15,6 +17,8 @@ LL | match 0isize {
|
|||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
= note: the matched value is of type `isize`
|
||||
= note: for `usize` and `isize`, no assumptions about the maximum value are permitted
|
||||
= note: to exhaustively match on either pointer-size integer type, wildcards must be used
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
use std::{usize, isize};
|
||||
|
||||
fn main() {
|
||||
match 0usize {
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
//~| NOTE pattern `_` not covered
|
||||
//~| NOTE the matched value is of type `usize`
|
||||
//~| NOTE for `usize` and `isize`, no assumptions about the maximum value are permitted
|
||||
//~| NOTE to exhaustively match on either pointer-size integer type, wildcards must be used
|
||||
0 ..= usize::MAX => {}
|
||||
}
|
||||
|
||||
match 0isize {
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
//~| NOTE pattern `_` not covered
|
||||
//~| NOTE the matched value is of type `isize`
|
||||
//~| NOTE for `usize` and `isize`, no assumptions about the maximum value are permitted
|
||||
//~| NOTE to exhaustively match on either pointer-size integer type, wildcards must be used
|
||||
isize::MIN ..= isize::MAX => {}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
error[E0004]: non-exhaustive patterns: `_` not covered
|
||||
--> $DIR/non-exhaustive-pattern-pointer-size-int.rs:4:11
|
||||
|
|
||||
LL | match 0usize {
|
||||
| ^^^^^^ pattern `_` not covered
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
= note: the matched value is of type `usize`
|
||||
= note: for `usize` and `isize`, no assumptions about the maximum value are permitted
|
||||
= note: to exhaustively match on either pointer-size integer type, wildcards must be used
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `_` not covered
|
||||
--> $DIR/non-exhaustive-pattern-pointer-size-int.rs:13:11
|
||||
|
|
||||
LL | match 0isize {
|
||||
| ^^^^^^ pattern `_` not covered
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
= note: the matched value is of type `isize`
|
||||
= note: for `usize` and `isize`, no assumptions about the maximum value are permitted
|
||||
= note: to exhaustively match on either pointer-size integer type, wildcards must be used
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0004`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue