diff --git a/clippy_lints/src/matches.rs b/clippy_lints/src/matches.rs index 5f62d2d1316..ba7b9bd0424 100644 --- a/clippy_lints/src/matches.rs +++ b/clippy_lints/src/matches.rs @@ -1592,7 +1592,17 @@ where } }, (&Kind::End(a, _), &Kind::Start(b, _)) if a != Bound::Included(b) => (), - _ => return Some((a.range(), b.range())), + _ => { + // skip if the range `a` is completely included into the range `b` + if let Ordering::Equal | Ordering::Less = a.cmp(&b) { + let kind_a = Kind::End(a.range().node.1, a.range()); + let kind_b = Kind::End(b.range().node.1, b.range()); + if let Ordering::Equal | Ordering::Greater = kind_a.cmp(&kind_b) { + return None; + } + } + return Some((a.range(), b.range())); + }, } } diff --git a/tests/ui/match_overlapping_arm.rs b/tests/ui/match_overlapping_arm.rs index 97789bb766f..44c51e8112a 100644 --- a/tests/ui/match_overlapping_arm.rs +++ b/tests/ui/match_overlapping_arm.rs @@ -57,6 +57,36 @@ fn overlapping() { _ => (), } + match 42 { + 5..7 => println!("5 .. 7"), + 0..10 => println!("0 .. 10"), + _ => (), + } + + match 42 { + 5..10 => println!("5 .. 10"), + 0..=10 => println!("0 ... 10"), + _ => (), + } + + match 42 { + 0..14 => println!("0 .. 14"), + 5..10 => println!("5 .. 10"), + _ => (), + } + + match 42 { + 5..14 => println!("5 .. 14"), + 0..=10 => println!("0 ... 10"), + _ => (), + } + + match 42 { + 0..7 => println!("0 .. 7"), + 0..=10 => println!("0 ... 10"), + _ => (), + } + /* // FIXME(JohnTitor): uncomment this once rustfmt knows half-open patterns match 42 { diff --git a/tests/ui/match_overlapping_arm.stderr b/tests/ui/match_overlapping_arm.stderr index eb20d5405a9..f25a66d634e 100644 --- a/tests/ui/match_overlapping_arm.stderr +++ b/tests/ui/match_overlapping_arm.stderr @@ -23,30 +23,6 @@ note: overlaps with this LL | FOO..=11 => println!("0 ... 11"), | ^^^^^^^^ -error: some ranges overlap - --> $DIR/match_overlapping_arm.rs:26:9 - | -LL | 0..=5 => println!("0 ... 5"), - | ^^^^^ - | -note: overlaps with this - --> $DIR/match_overlapping_arm.rs:25:9 - | -LL | 2 => println!("2"), - | ^ - -error: some ranges overlap - --> $DIR/match_overlapping_arm.rs:32:9 - | -LL | 0..=2 => println!("0 ... 2"), - | ^^^^^ - | -note: overlaps with this - --> $DIR/match_overlapping_arm.rs:31:9 - | -LL | 2 => println!("2"), - | ^ - error: some ranges overlap --> $DIR/match_overlapping_arm.rs:55:9 | @@ -59,5 +35,29 @@ note: overlaps with this LL | 0..=11 => println!("0 ... 11"), | ^^^^^^ +error: some ranges overlap + --> $DIR/match_overlapping_arm.rs:80:9 + | +LL | 0..=10 => println!("0 ... 10"), + | ^^^^^^ + | +note: overlaps with this + --> $DIR/match_overlapping_arm.rs:79:9 + | +LL | 5..14 => println!("5 .. 14"), + | ^^^^^ + +error: some ranges overlap + --> $DIR/match_overlapping_arm.rs:85:9 + | +LL | 0..7 => println!("0 .. 7"), + | ^^^^ + | +note: overlaps with this + --> $DIR/match_overlapping_arm.rs:86:9 + | +LL | 0..=10 => println!("0 ... 10"), + | ^^^^^^ + error: aborting due to 5 previous errors