about summary refs log tree commit diff
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2018-05-20 01:55:05 +0100
committervarkor <github@varkor.com>2018-08-16 20:09:04 +0100
commit7476ba4c8aa5b23dde757778bdd153c1bbc869a4 (patch)
tree41468fd430ec15d5678850bc245e83e41781480e
parent121fa8d499b5d0db6d4b6c25458bd87ea38decc2 (diff)
downloadrust-7476ba4c8aa5b23dde757778bdd153c1bbc869a4.tar.gz
rust-7476ba4c8aa5b23dde757778bdd153c1bbc869a4.zip
Add semi-exhaustive tests for exhaustiveness
-rw-r--r--src/test/ui/exhaustive_integer_patterns.rs105
-rw-r--r--src/test/ui/exhaustive_integer_patterns.stderr39
2 files changed, 144 insertions, 0 deletions
diff --git a/src/test/ui/exhaustive_integer_patterns.rs b/src/test/ui/exhaustive_integer_patterns.rs
new file mode 100644
index 00000000000..39bac8919ff
--- /dev/null
+++ b/src/test/ui/exhaustive_integer_patterns.rs
@@ -0,0 +1,105 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(exhaustive_integer_patterns)]
+#![feature(exclusive_range_pattern)]
+#![deny(unreachable_patterns)]
+
+use std::{char, usize, u8, u16, u32, u64, u128, isize, i8, i16, i32, i64, i128};
+
+fn main() {
+    let x: u8 = 0;
+
+    // A single range covering the entire domain.
+    match x {
+        0 ..= 255 => {} // ok
+    }
+
+    // A combination of ranges and values.
+    // These are currently allowed to be overlapping.
+    match x {
+        0 ..= 32 => {}
+        33 => {}
+        34 .. 128 => {}
+        100 ..= 200 => {}
+        200 => {} //~ ERROR unreachable pattern
+        201 ..= 255 => {}
+    }
+
+    // An incomplete set of values.
+    match x { //~ ERROR non-exhaustive patterns: `128u8...255u8` not covered
+        0 .. 128 => {}
+    }
+
+    // A more incomplete set of values.
+    match x { //~ ERROR non-exhaustive patterns
+        0 ..= 10 => {}
+        20 ..= 30 => {}
+        35 => {}
+        70 .. 255 => {}
+    }
+
+    let x: i8 = 0;
+    match x { //~ ERROR non-exhaustive patterns
+        -7 => {}
+        -5..=120 => {}
+        -2..=20 => {} //~ ERROR unreachable pattern
+        125 => {}
+    }
+
+    // Let's test other types too!
+    match '\u{0}' {
+        '\u{0}' ..= char::MAX => {} // ok
+    }
+
+    match 0usize {
+        0 ..= usize::MAX => {} // ok
+    }
+
+    match 0u16 {
+        0 ..= u16::MAX => {} // ok
+    }
+
+    match 0u32 {
+        0 ..= u32::MAX => {} // ok
+    }
+
+    match 0u64 {
+        0 ..= u64::MAX => {} // ok
+    }
+
+    match 0u128 {
+        0 ..= u128::MAX => {} // ok
+    }
+
+    match 0isize {
+        isize::MIN ..= isize::MAX => {} // ok
+    }
+
+    match 0i8 {
+        -128..=127 => {} // ok
+    }
+
+    match 0i16 {
+        i16::MIN ..= i16::MAX => {} // ok
+    }
+
+    match 0i32 {
+        i32::MIN ..= i32::MAX => {} // ok
+    }
+
+    match 0i64 {
+        i64::MIN ..= i64::MAX => {} // ok
+    }
+
+    match 0i128 {
+        i128::MIN ..= i128::MAX => {} // ok
+    }
+}
diff --git a/src/test/ui/exhaustive_integer_patterns.stderr b/src/test/ui/exhaustive_integer_patterns.stderr
new file mode 100644
index 00000000000..5a0bdebde1f
--- /dev/null
+++ b/src/test/ui/exhaustive_integer_patterns.stderr
@@ -0,0 +1,39 @@
+error: unreachable pattern
+  --> $DIR/exhaustive_integer_patterns.rs:32:9
+   |
+LL |         200 => {} //~ ERROR unreachable pattern
+   |         ^^^
+   |
+note: lint level defined here
+  --> $DIR/exhaustive_integer_patterns.rs:13:9
+   |
+LL | #![deny(unreachable_patterns)]
+   |         ^^^^^^^^^^^^^^^^^^^^
+
+error[E0004]: non-exhaustive patterns: `128u8...255u8` not covered
+  --> $DIR/exhaustive_integer_patterns.rs:37:11
+   |
+LL |     match x { //~ ERROR non-exhaustive patterns: `128u8...255u8` not covered
+   |           ^ pattern `128u8...255u8` not covered
+
+error[E0004]: non-exhaustive patterns: `11u8...20u8`, `30u8...35u8`, `35u8...70u8` and 1 more not covered
+  --> $DIR/exhaustive_integer_patterns.rs:42:11
+   |
+LL |     match x { //~ ERROR non-exhaustive patterns
+   |           ^ patterns `11u8...20u8`, `30u8...35u8`, `35u8...70u8` and 1 more not covered
+
+error: unreachable pattern
+  --> $DIR/exhaustive_integer_patterns.rs:53:9
+   |
+LL |         -2..=20 => {} //~ ERROR unreachable pattern
+   |         ^^^^^^^
+
+error[E0004]: non-exhaustive patterns: `-128i8...-5i8`, `120i8...121i8` and `121i8...127i8` not covered
+  --> $DIR/exhaustive_integer_patterns.rs:50:11
+   |
+LL |     match x { //~ ERROR non-exhaustive patterns
+   |           ^ patterns `-128i8...-5i8`, `120i8...121i8` and `121i8...127i8` not covered
+
+error: aborting due to 5 previous errors
+
+For more information about this error, try `rustc --explain E0004`.