diff --git a/clippy_lints/src/shadow.rs b/clippy_lints/src/shadow.rs index 49d22377119f..83199ba0f707 100644 --- a/clippy_lints/src/shadow.rs +++ b/clippy_lints/src/shadow.rs @@ -263,7 +263,7 @@ fn is_self_shadow(cx: &LateContext<'_>, pat: &Pat<'_>, mut expr: &Expr<'_>, hir_ fn find_init<'tcx>(cx: &LateContext<'tcx>, hir_id: HirId) -> Option<(&'tcx Expr<'tcx>, Option)> { for (hir_id, node) in cx.tcx.hir().parent_iter(hir_id) { let init = match node { - Node::Arm(_) | Node::Pat(_) | Node::Param(_) => continue, + Node::Arm(_) | Node::Pat(_) | Node::PatField(_) | Node::Param(_) => continue, Node::Expr(expr) => match expr.kind { ExprKind::Match(e, _, _) | ExprKind::Let(&LetExpr { init: e, .. }) => Some((e, None)), // If we're a closure argument, then a parent call is also an associated item. diff --git a/tests/ui/shadow.rs b/tests/ui/shadow.rs index 30b96277f99f..31944f5ef1b1 100644 --- a/tests/ui/shadow.rs +++ b/tests/ui/shadow.rs @@ -133,4 +133,12 @@ fn shadow_closure() { .collect(); } +struct Issue13795 { + value: i32, +} + +fn issue13795(value: Issue13795) { + let Issue13795 { value, .. } = value; +} + fn main() {} diff --git a/tests/ui/shadow.stderr b/tests/ui/shadow.stderr index 5d2d70604506..c8c524b3a2f5 100644 --- a/tests/ui/shadow.stderr +++ b/tests/ui/shadow.stderr @@ -304,5 +304,17 @@ note: previous binding is here LL | .map(|i| i.map(|i| i - 10)) | ^ -error: aborting due to 25 previous errors +error: `value` is shadowed by itself in `value` + --> tests/ui/shadow.rs:141:22 + | +LL | let Issue13795 { value, .. } = value; + | ^^^^^ + | +note: previous binding is here + --> tests/ui/shadow.rs:140:15 + | +LL | fn issue13795(value: Issue13795) { + | ^^^^^ + +error: aborting due to 26 previous errors