diff options
| author | Jason Newcomb <jsnewcomb@pm.me> | 2025-05-05 21:45:13 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-05 21:45:13 +0000 |
| commit | f62f26965817f2573c2649288faa489a03ed1665 (patch) | |
| tree | 280e04f8c6a6d4bf2b9ff9c045dbc53e64e2f370 | |
| parent | 003fc6ce1c5d4242dcf2f5be0df09be111fb991a (diff) | |
| parent | 7106e21227634768597a4283166f20ee7a9c037b (diff) | |
| download | rust-f62f26965817f2573c2649288faa489a03ed1665.tar.gz rust-f62f26965817f2573c2649288faa489a03ed1665.zip | |
Fix `manual_unwrap_or_default` FP on ref binding (#14731)
Closes rust-lang/rust-clippy#14716 changelog: [`manual_unwrap_or_default`] fix FP on ref binding
| -rw-r--r-- | clippy_lints/src/matches/manual_unwrap_or.rs | 3 | ||||
| -rw-r--r-- | tests/ui/manual_unwrap_or_default.fixed | 13 | ||||
| -rw-r--r-- | tests/ui/manual_unwrap_or_default.rs | 13 |
3 files changed, 28 insertions, 1 deletions
diff --git a/clippy_lints/src/matches/manual_unwrap_or.rs b/clippy_lints/src/matches/manual_unwrap_or.rs index b64ae0b24d8..3ac2c9fc2b3 100644 --- a/clippy_lints/src/matches/manual_unwrap_or.rs +++ b/clippy_lints/src/matches/manual_unwrap_or.rs @@ -1,5 +1,6 @@ use clippy_utils::consts::ConstEvalCtxt; use clippy_utils::source::{SpanRangeExt as _, indent_of, reindent_multiline}; +use rustc_ast::{BindingMode, ByRef}; use rustc_errors::Applicability; use rustc_hir::def::Res; use rustc_hir::{Arm, Expr, ExprKind, HirId, LangItem, Pat, PatExpr, PatExprKind, PatKind, QPath}; @@ -16,7 +17,7 @@ use super::{MANUAL_UNWRAP_OR, MANUAL_UNWRAP_OR_DEFAULT}; fn get_some(cx: &LateContext<'_>, pat: &Pat<'_>) -> Option<HirId> { if let PatKind::TupleStruct(QPath::Resolved(_, path), &[pat], _) = pat.kind - && let PatKind::Binding(_, pat_id, _, _) = pat.kind + && let PatKind::Binding(BindingMode(ByRef::No, _), pat_id, _, _) = pat.kind && let Some(def_id) = path.res.opt_def_id() // Since it comes from a pattern binding, we need to get the parent to actually match // against it. diff --git a/tests/ui/manual_unwrap_or_default.fixed b/tests/ui/manual_unwrap_or_default.fixed index 9dae9fcae07..41ca44ceef4 100644 --- a/tests/ui/manual_unwrap_or_default.fixed +++ b/tests/ui/manual_unwrap_or_default.fixed @@ -106,3 +106,16 @@ fn issue_12928() { fn allowed_manual_unwrap_or_zero() -> u32 { Some(42).unwrap_or_default() } + +mod issue14716 { + struct Foo { + name: Option<String>, + } + + fn bar(project: &Foo) { + let _name = match project.name { + Some(ref x) => x, + None => "", + }; + } +} diff --git a/tests/ui/manual_unwrap_or_default.rs b/tests/ui/manual_unwrap_or_default.rs index 539d7a8bbae..343fbc4879c 100644 --- a/tests/ui/manual_unwrap_or_default.rs +++ b/tests/ui/manual_unwrap_or_default.rs @@ -147,3 +147,16 @@ fn allowed_manual_unwrap_or_zero() -> u32 { 0 } } + +mod issue14716 { + struct Foo { + name: Option<String>, + } + + fn bar(project: &Foo) { + let _name = match project.name { + Some(ref x) => x, + None => "", + }; + } +} |
