From 7476ba4c8aa5b23dde757778bdd153c1bbc869a4 Mon Sep 17 00:00:00 2001 From: varkor Date: Sun, 20 May 2018 01:55:05 +0100 Subject: [PATCH] Add semi-exhaustive tests for exhaustiveness --- src/test/ui/exhaustive_integer_patterns.rs | 105 ++++++++++++++++++ .../ui/exhaustive_integer_patterns.stderr | 39 +++++++ 2 files changed, 144 insertions(+) create mode 100644 src/test/ui/exhaustive_integer_patterns.rs create mode 100644 src/test/ui/exhaustive_integer_patterns.stderr 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 or the MIT license +// , 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`.