rust/src/test/ui/exhaustive_integer_patterns.rs

106 lines
2.3 KiB
Rust
Raw Normal View History

// 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
}
}