Add semi-exhaustive tests for exhaustiveness
This commit is contained in:
parent
121fa8d499
commit
7476ba4c8a
105
src/test/ui/exhaustive_integer_patterns.rs
Normal file
105
src/test/ui/exhaustive_integer_patterns.rs
Normal file
@ -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
|
||||
}
|
||||
}
|
39
src/test/ui/exhaustive_integer_patterns.stderr
Normal file
39
src/test/ui/exhaustive_integer_patterns.stderr
Normal file
@ -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`.
|
Loading…
Reference in New Issue
Block a user