#![deny(non_contiguous_range_endpoints)] macro_rules! m { ($s:expr, $t1:pat, $t2:pat) => { match $s { $t1 => {} $t2 => {} _ => {} } }; } fn main() { match 0u8 { 20..30 => {} //~ ERROR multiple ranges are one apart 31..=40 => {} _ => {} } match 0u8 { 20..30 => {} //~ ERROR multiple ranges are one apart 31 => {} _ => {} } m!(0u8, 20..30, 31..=40); //~ ERROR multiple ranges are one apart m!(0u8, 31..=40, 20..30); //~ ERROR multiple ranges are one apart m!(0u8, 20..30, 29..=40); //~ WARN multiple patterns overlap on their endpoints m!(0u8, 20..30, 30..=40); m!(0u8, 20..30, 31..=40); //~ ERROR multiple ranges are one apart m!(0u8, 20..30, 32..=40); m!(0u8, 20..30, 31..=32); //~ ERROR multiple ranges are one apart // Don't lint two singletons. m!(0u8, 30, 32); // Don't lint on the equivalent inclusive range m!(0u8, 20..=29, 31..=40); // Don't lint if the lower one is a singleton. m!(0u8, 30, 32..=40); // Catch the `lo..MAX` case. match 0u8 { 0..255 => {} //~ ERROR exclusive range missing `u8::MAX` _ => {} } // Except for `usize`, since `0..=usize::MAX` isn't exhaustive either. match 0usize { 0..usize::MAX => {} _ => {} } // Don't lint if the gap is caught by another range. match 0u8 { 0..10 => {} 11..20 => {} 10 => {} _ => {} } match 0u8 { 0..10 => {} 11..20 => {} 5..15 => {} _ => {} } match 0u8 { 0..255 => {} 255 => {} } // Test multiple at once match 0u8 { 0..10 => {} //~ ERROR multiple ranges are one apart 11..20 => {} 11..30 => {} _ => {} } match 0u8 { 0..10 => {} //~ ERROR multiple ranges are one apart 11..20 => {} //~ ERROR multiple ranges are one apart 21..30 => {} _ => {} } match 0u8 { 00..20 => {} //~ ERROR multiple ranges are one apart 10..20 => {} //~ ERROR multiple ranges are one apart 21..30 => {} 21..40 => {} _ => {} } // Test nested match (0u8, true) { (0..10, true) => {} //~ ERROR multiple ranges are one apart (11..20, true) => {} _ => {} } match (true, 0u8) { (true, 0..10) => {} //~ ERROR multiple ranges are one apart (true, 11..20) => {} _ => {} } // Asymmetry due to how exhaustiveness is computed. match (0u8, true) { (0..10, true) => {} //~ ERROR multiple ranges are one apart (11..20, false) => {} _ => {} } match (true, 0u8) { (true, 0..10) => {} (false, 11..20) => {} _ => {} } match Some(0u8) { Some(0..10) => {} //~ ERROR multiple ranges are one apart Some(11..20) => {} _ => {} } }