Ignore wildcards in function arguments and local bindings

This commit is contained in:
Samuel Tardieu 2023-09-02 23:06:16 +02:00
parent 822c7df545
commit 2f5c445c0b
4 changed files with 37 additions and 4 deletions

View File

@ -1,5 +1,5 @@
use clippy_utils::diagnostics::span_lint_and_sugg;
use hir::PatKind;
use hir::{Node, PatKind};
use rustc_errors::Applicability;
use rustc_hir as hir;
use rustc_lint::{LateContext, LateLintPass};
@ -37,6 +37,17 @@
impl<'tcx> LateLintPass<'tcx> for IgnoredUnitPatterns {
fn check_pat(&mut self, cx: &LateContext<'tcx>, pat: &'tcx hir::Pat<'tcx>) {
match cx.tcx.hir().get_parent(pat.hir_id) {
Node::Param(param) if matches!(cx.tcx.hir().get_parent(param.hir_id), Node::Item(_)) => {
// Ignore function parameters
return;
},
Node::Local(local) if local.ty.is_some() => {
// Ignore let bindings with explicit type
return;
},
_ => {},
}
if matches!(pat.kind, PatKind::Wild) && cx.typeck_results().pat_ty(pat).is_unit() {
span_lint_and_sugg(
cx,

View File

@ -1,5 +1,5 @@
#![warn(clippy::ignored_unit_patterns)]
#![allow(clippy::redundant_pattern_matching, clippy::single_match)]
#![allow(clippy::let_unit_value, clippy::redundant_pattern_matching, clippy::single_match)]
fn foo() -> Result<(), ()> {
unimplemented!()
@ -15,3 +15,11 @@ fn main() {
let _ = foo().map_err(|()| todo!());
//~^ ERROR: matching over `()` is more explicit
}
#[allow(unused)]
pub fn moo(_: ()) {
let () = foo().unwrap();
//~^ ERROR: matching over `()` is more explicit
let _: () = foo().unwrap();
let _: () = ();
}

View File

@ -1,5 +1,5 @@
#![warn(clippy::ignored_unit_patterns)]
#![allow(clippy::redundant_pattern_matching, clippy::single_match)]
#![allow(clippy::let_unit_value, clippy::redundant_pattern_matching, clippy::single_match)]
fn foo() -> Result<(), ()> {
unimplemented!()
@ -15,3 +15,11 @@ fn main() {
let _ = foo().map_err(|_| todo!());
//~^ ERROR: matching over `()` is more explicit
}
#[allow(unused)]
pub fn moo(_: ()) {
let _ = foo().unwrap();
//~^ ERROR: matching over `()` is more explicit
let _: () = foo().unwrap();
let _: () = ();
}

View File

@ -24,5 +24,11 @@ error: matching over `()` is more explicit
LL | let _ = foo().map_err(|_| todo!());
| ^ help: use `()` instead of `_`: `()`
error: aborting due to 4 previous errors
error: matching over `()` is more explicit
--> $DIR/ignored_unit_patterns.rs:21:9
|
LL | let _ = foo().unwrap();
| ^ help: use `()` instead of `_`: `()`
error: aborting due to 5 previous errors