about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--clippy_lints/src/matches.rs12
-rw-r--r--tests/ui/match_overlapping_arm.rs30
-rw-r--r--tests/ui/match_overlapping_arm.stderr32
3 files changed, 57 insertions, 17 deletions
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
@@ -24,39 +24,39 @@ LL |         FOO..=11 => println!("0 ... 11"),
    |         ^^^^^^^^
 
 error: some ranges overlap
-  --> $DIR/match_overlapping_arm.rs:26:9
+  --> $DIR/match_overlapping_arm.rs:55:9
    |
-LL |         0..=5 => println!("0 ... 5"),
+LL |         0..11 => println!("0 .. 11"),
    |         ^^^^^
    |
 note: overlaps with this
-  --> $DIR/match_overlapping_arm.rs:25:9
+  --> $DIR/match_overlapping_arm.rs:56:9
    |
-LL |         2 => println!("2"),
-   |         ^
+LL |         0..=11 => println!("0 ... 11"),
+   |         ^^^^^^
 
 error: some ranges overlap
-  --> $DIR/match_overlapping_arm.rs:32:9
+  --> $DIR/match_overlapping_arm.rs:80:9
    |
-LL |         0..=2 => println!("0 ... 2"),
-   |         ^^^^^
+LL |         0..=10 => println!("0 ... 10"),
+   |         ^^^^^^
    |
 note: overlaps with this
-  --> $DIR/match_overlapping_arm.rs:31:9
+  --> $DIR/match_overlapping_arm.rs:79:9
    |
-LL |         2 => println!("2"),
-   |         ^
+LL |         5..14 => println!("5 .. 14"),
+   |         ^^^^^
 
 error: some ranges overlap
-  --> $DIR/match_overlapping_arm.rs:55:9
+  --> $DIR/match_overlapping_arm.rs:85:9
    |
-LL |         0..11 => println!("0 .. 11"),
-   |         ^^^^^
+LL |         0..7 => println!("0 .. 7"),
+   |         ^^^^
    |
 note: overlaps with this
-  --> $DIR/match_overlapping_arm.rs:56:9
+  --> $DIR/match_overlapping_arm.rs:86:9
    |
-LL |         0..=11 => println!("0 ... 11"),
+LL |         0..=10 => println!("0 ... 10"),
    |         ^^^^^^
 
 error: aborting due to 5 previous errors