about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-07-02 02:37:52 +0900
committerYuki Okushi <huyuumi.dev@gmail.com>2020-07-05 02:10:57 +0900
commitdcbe85abad8ddd3a39fcafe70a884db4e71f0b03 (patch)
tree3a4ea5b4c65c9b08aa9ecfeed37dd7c0ebdf02b3 /src
parent0cd7ff7ddfb75a38dca81ad3e76b1e984129e939 (diff)
downloadrust-dcbe85abad8ddd3a39fcafe70a884db4e71f0b03.tar.gz
rust-dcbe85abad8ddd3a39fcafe70a884db4e71f0b03.zip
Explain exhaustive matching on {usize,isize} maximum values
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir_build/hair/pattern/check_match.rs10
-rw-r--r--src/test/ui/feature-gates/feature-gate-precise_pointer_size_matching.stderr4
-rw-r--r--src/test/ui/pattern/usefulness/non-exhaustive-pattern-pointer-size-int.rs21
-rw-r--r--src/test/ui/pattern/usefulness/non-exhaustive-pattern-pointer-size-int.stderr25
4 files changed, 59 insertions, 1 deletions
diff --git a/src/librustc_mir_build/hair/pattern/check_match.rs b/src/librustc_mir_build/hair/pattern/check_match.rs
index 6fc447a87f5..6a68c915889 100644
--- a/src/librustc_mir_build/hair/pattern/check_match.rs
+++ b/src/librustc_mir_build/hair/pattern/check_match.rs
@@ -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();
 }
 
diff --git a/src/test/ui/feature-gates/feature-gate-precise_pointer_size_matching.stderr b/src/test/ui/feature-gates/feature-gate-precise_pointer_size_matching.stderr
index 6c5d0091c5a..8aa1534b276 100644
--- a/src/test/ui/feature-gates/feature-gate-precise_pointer_size_matching.stderr
+++ b/src/test/ui/feature-gates/feature-gate-precise_pointer_size_matching.stderr
@@ -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
 
diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-pattern-pointer-size-int.rs b/src/test/ui/pattern/usefulness/non-exhaustive-pattern-pointer-size-int.rs
new file mode 100644
index 00000000000..aa6a3ffc522
--- /dev/null
+++ b/src/test/ui/pattern/usefulness/non-exhaustive-pattern-pointer-size-int.rs
@@ -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 => {}
+    }
+}
diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-pattern-pointer-size-int.stderr b/src/test/ui/pattern/usefulness/non-exhaustive-pattern-pointer-size-int.stderr
new file mode 100644
index 00000000000..cd47e74fa46
--- /dev/null
+++ b/src/test/ui/pattern/usefulness/non-exhaustive-pattern-pointer-size-int.stderr
@@ -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`.