1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
#![feature(never_type)]
#![feature(exhaustive_patterns)]
#![deny(unreachable_patterns)]
//~^ NOTE lint level is defined here
#[rustfmt::skip]
fn main() {
match (0u8,) {
(1 | 2,) => {}
//~^ NOTE matches all the relevant values
(2,) => {}
//~^ ERROR unreachable pattern
//~| NOTE no value can reach this
_ => {}
}
match (0u8,) {
(1,) => {}
//~^ NOTE matches some of the same values
(2,) => {}
//~^ NOTE matches some of the same values
(1 | 2,) => {}
//~^ ERROR unreachable pattern
//~| NOTE no value can reach this
//~| NOTE multiple earlier patterns match some of the same values
//~| NOTE collectively making this unreachable
_ => {}
}
match 0u8 {
1 => {}
//~^ NOTE matches some of the same values
2 => {}
//~^ NOTE matches some of the same values
3 => {}
//~^ NOTE matches some of the same values
4 => {}
//~^ NOTE matches some of the same values
5 => {}
6 => {}
1 ..= 6 => {}
//~^ ERROR unreachable pattern
//~| NOTE no value can reach this
//~| NOTE multiple earlier patterns match some of the same values
//~| NOTE ...and 2 other patterns
_ => {}
}
let res: Result<(),!> = Ok(());
match res {
Ok(_) => {}
Err(_) => {}
//~^ ERROR unreachable pattern
//~| NOTE matches no values because `!` is uninhabited
//~| NOTE to learn more about uninhabited types, see
}
#[derive(Copy, Clone)]
enum Void1 {}
#[derive(Copy, Clone)]
enum Void2 {}
// Only an empty type matched _by value_ can make an arm unreachable. We must get the right one.
let res1: Result<(), Void1> = Ok(());
let res2: Result<(), Void2> = Ok(());
match (&res1, res2) {
(Err(_), Err(_)) => {}
//~^ ERROR unreachable pattern
//~| NOTE matches no values because `Void2` is uninhabited
//~| NOTE to learn more about uninhabited types, see
_ => {}
}
match (res1, &res2) {
(Err(_), Err(_)) => {}
//~^ ERROR unreachable pattern
//~| NOTE matches no values because `Void1` is uninhabited
//~| NOTE to learn more about uninhabited types, see
_ => {}
}
if let (0
//~^ NOTE matches all the relevant values
| 0, _) = (0, 0) {}
//~^ ERROR unreachable pattern
//~| NOTE no value can reach this
match (true, true) {
(_, true) if false => {} // Guarded patterns don't cover others
(true, _) => {}
//~^ NOTE matches some of the same values
(false, _) => {}
//~^ NOTE matches some of the same values
(_, true) => {}
//~^ ERROR unreachable pattern
//~| NOTE no value can reach this
//~| NOTE multiple earlier patterns match some of the same values
//~| NOTE collectively making this unreachable
}
match (true, true) {
(true, _) => {}
//~^ NOTE matches all the relevant values
(false, _) => {}
#[allow(unreachable_patterns)]
(_, true) => {} // Doesn't cover below because it's already unreachable.
(true, true) => {}
//~^ ERROR unreachable pattern
//~| NOTE no value can reach this
}
// Despite skipping some irrelevant cases, we still report a set of rows that covers the
// unreachable one.
match (true, true, 0) {
(true, _, _) => {}
(_, true, 0..10) => {}
//~^ NOTE matches all the relevant values
(_, true, 10..) => {}
(_, true, 3) => {}
//~^ ERROR unreachable pattern
//~| NOTE no value can reach this
_ => {}
}
}
|