about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWeiTheShinobi <weitheshinobi@gmail.com>2024-08-31 05:02:07 +0800
committerWeiTheShinobi <weitheshinobi@gmail.com>2024-08-31 05:25:59 +0800
commit04d70d04fcf9412d7006ee4646f56f8bf5f2149f (patch)
tree257523dd1c8685132a254d501bceac6b3dcd78e1
parentb86a202c92aec56daa3eee677bbc70493ac10394 (diff)
downloadrust-04d70d04fcf9412d7006ee4646f56f8bf5f2149f.tar.gz
rust-04d70d04fcf9412d7006ee4646f56f8bf5f2149f.zip
[`single_match`, `single_match_else`] fix suggestion when `match` irrefutable
-rw-r--r--clippy_lints/src/matches/single_match.rs7
-rw-r--r--tests/ui/single_match.fixed18
-rw-r--r--tests/ui/single_match.rs27
-rw-r--r--tests/ui/single_match.stderr40
-rw-r--r--tests/ui/single_match_else.fixed4
-rw-r--r--tests/ui/single_match_else.rs10
-rw-r--r--tests/ui/single_match_else.stderr14
7 files changed, 118 insertions, 2 deletions
diff --git a/clippy_lints/src/matches/single_match.rs b/clippy_lints/src/matches/single_match.rs
index b6930f7b9d1..4bd46bced38 100644
--- a/clippy_lints/src/matches/single_match.rs
+++ b/clippy_lints/src/matches/single_match.rs
@@ -91,6 +91,13 @@ fn report_single_pattern(cx: &LateContext<'_>, ex: &Expr<'_>, arm: &Arm<'_>, exp
         format!(" else {}", expr_block(cx, els, ctxt, "..", Some(expr.span), &mut app))
     });
 
+    if snippet(cx, ex.span, "..") == snippet(cx, arm.pat.span, "..") {
+        let msg = "this pattern is irrefutable, `match` is useless";
+        let sugg = expr_block(cx, arm.body, ctxt, "..", Some(expr.span), &mut app);
+        span_lint_and_sugg(cx, lint, expr.span, msg, "try", sugg, app);
+        return;
+    }
+
     let (pat, pat_ref_count) = peel_hir_pat_refs(arm.pat);
     let (msg, sugg) = if let PatKind::Path(_) | PatKind::Lit(_) = pat.kind
         && let (ty, ty_ref_count) = peel_middle_ty_refs(cx.typeck_results().expr_ty(ex))
diff --git a/tests/ui/single_match.fixed b/tests/ui/single_match.fixed
index 5249c440889..04129ec0f13 100644
--- a/tests/ui/single_match.fixed
+++ b/tests/ui/single_match.fixed
@@ -296,3 +296,21 @@ fn issue11365() {
 
     if let Some(A | B) = &Some(A) { println!() }
 }
+
+#[derive(Eq, PartialEq)]
+pub struct Data([u8; 4]);
+
+const DATA: Data = Data([1, 2, 3, 4]);
+const CONST_I32: i32 = 1;
+
+fn irrefutable_match() {
+    { println!() }
+
+    { println!() }
+
+    let i = 0;
+    {
+        let a = 1;
+        let b = 2;
+    }
+}
diff --git a/tests/ui/single_match.rs b/tests/ui/single_match.rs
index 882098a56e7..2d51cee3fd9 100644
--- a/tests/ui/single_match.rs
+++ b/tests/ui/single_match.rs
@@ -360,3 +360,30 @@ fn issue11365() {
         None | Some(_) => {},
     }
 }
+
+#[derive(Eq, PartialEq)]
+pub struct Data([u8; 4]);
+
+const DATA: Data = Data([1, 2, 3, 4]);
+const CONST_I32: i32 = 1;
+
+fn irrefutable_match() {
+    match DATA {
+        DATA => println!(),
+        _ => {},
+    }
+
+    match CONST_I32 {
+        CONST_I32 => println!(),
+        _ => {},
+    }
+
+    let i = 0;
+    match i {
+        i => {
+            let a = 1;
+            let b = 2;
+        },
+        _ => {},
+    }
+}
diff --git a/tests/ui/single_match.stderr b/tests/ui/single_match.stderr
index ceb2a193bf7..9578421d2ce 100644
--- a/tests/ui/single_match.stderr
+++ b/tests/ui/single_match.stderr
@@ -216,5 +216,43 @@ LL | |         None | Some(_) => {},
 LL | |     }
    | |_____^ help: try: `if let Some(A | B) = &Some(A) { println!() }`
 
-error: aborting due to 20 previous errors
+error: this pattern is irrefutable, `match` is useless
+  --> tests/ui/single_match.rs:371:5
+   |
+LL | /     match DATA {
+LL | |         DATA => println!(),
+LL | |         _ => {},
+LL | |     }
+   | |_____^ help: try: `{ println!() }`
+
+error: this pattern is irrefutable, `match` is useless
+  --> tests/ui/single_match.rs:376:5
+   |
+LL | /     match CONST_I32 {
+LL | |         CONST_I32 => println!(),
+LL | |         _ => {},
+LL | |     }
+   | |_____^ help: try: `{ println!() }`
+
+error: this pattern is irrefutable, `match` is useless
+  --> tests/ui/single_match.rs:382:5
+   |
+LL | /     match i {
+LL | |         i => {
+LL | |             let a = 1;
+LL | |             let b = 2;
+LL | |         },
+LL | |         _ => {},
+LL | |     }
+   | |_____^
+   |
+help: try
+   |
+LL ~     {
+LL +         let a = 1;
+LL +         let b = 2;
+LL +     }
+   |
+
+error: aborting due to 23 previous errors
 
diff --git a/tests/ui/single_match_else.fixed b/tests/ui/single_match_else.fixed
index 163be16ad8b..fb57411aaa4 100644
--- a/tests/ui/single_match_else.fixed
+++ b/tests/ui/single_match_else.fixed
@@ -171,3 +171,7 @@ fn issue_10808(bar: Option<i32>) {
         },
     }
 }
+
+fn irrefutable_match() -> Option<&'static ExprNode> {
+    { Some(&NODE) }
+}
diff --git a/tests/ui/single_match_else.rs b/tests/ui/single_match_else.rs
index 3f1fd2b3183..2d9e877ee0f 100644
--- a/tests/ui/single_match_else.rs
+++ b/tests/ui/single_match_else.rs
@@ -199,3 +199,13 @@ fn issue_10808(bar: Option<i32>) {
         },
     }
 }
+
+fn irrefutable_match() -> Option<&'static ExprNode> {
+    match ExprNode::Butterflies {
+        ExprNode::Butterflies => Some(&NODE),
+        _ => {
+            let x = 5;
+            None
+        },
+    }
+}
diff --git a/tests/ui/single_match_else.stderr b/tests/ui/single_match_else.stderr
index 61c348260d0..61209053fd0 100644
--- a/tests/ui/single_match_else.stderr
+++ b/tests/ui/single_match_else.stderr
@@ -197,5 +197,17 @@ LL +         println!("None");
 LL +     }
    |
 
-error: aborting due to 9 previous errors
+error: this pattern is irrefutable, `match` is useless
+  --> tests/ui/single_match_else.rs:204:5
+   |
+LL | /     match ExprNode::Butterflies {
+LL | |         ExprNode::Butterflies => Some(&NODE),
+LL | |         _ => {
+LL | |             let x = 5;
+LL | |             None
+LL | |         },
+LL | |     }
+   | |_____^ help: try: `{ Some(&NODE) }`
+
+error: aborting due to 10 previous errors