Skip to content

Commit 5e9ccce

Browse files
committed
fix: map_entry FP on struct member
1 parent e6d9641 commit 5e9ccce

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

clippy_lints/src/entry.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ impl<'tcx> Visitor<'tcx> for InsertSearcher<'_, 'tcx> {
500500
self.visit_non_tail_expr(insert_expr.value);
501501
self.is_single_insert = is_single_insert;
502502
},
503-
_ if SpanlessEq::new(self.cx).eq_expr(self.map, expr) => {
503+
_ if is_map_or_parent_used(self.cx, self.map, expr) => {
504504
self.is_map_used = true;
505505
},
506506
_ => match expr.kind {
@@ -562,6 +562,11 @@ impl<'tcx> Visitor<'tcx> for InsertSearcher<'_, 'tcx> {
562562
}
563563
}
564564

565+
fn is_map_or_parent_used(cx: &LateContext<'_>, map: &Expr<'_>, expr: &Expr<'_>) -> bool {
566+
SpanlessEq::new(cx).eq_expr(map, expr)
567+
|| matches!(map.kind, ExprKind::Field(inner, _) | ExprKind::Index(inner, _, _) if is_map_or_parent_used(cx, inner, expr))
568+
}
569+
565570
struct InsertSearchResults<'tcx> {
566571
edits: Vec<Edit<'tcx>>,
567572
allow_insert_closure: bool,

tests/ui/entry.fixed

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,27 @@ fn issue12489(map: &mut HashMap<u64, u64>) -> Option<()> {
186186
Some(())
187187
}
188188

189+
mod issue13934 {
190+
use std::collections::HashMap;
191+
192+
struct Member {}
193+
194+
pub struct Foo {
195+
members: HashMap<u8, Member>,
196+
}
197+
198+
impl Foo {
199+
pub fn should_also_not_cause_lint(&mut self, input: u8) {
200+
if self.members.contains_key(&input) {
201+
todo!();
202+
} else {
203+
self.other();
204+
self.members.insert(input, Member {});
205+
}
206+
}
207+
208+
fn other(&self) {}
209+
}
210+
}
211+
189212
fn main() {}

tests/ui/entry.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,4 +190,27 @@ fn issue12489(map: &mut HashMap<u64, u64>) -> Option<()> {
190190
Some(())
191191
}
192192

193+
mod issue13934 {
194+
use std::collections::HashMap;
195+
196+
struct Member {}
197+
198+
pub struct Foo {
199+
members: HashMap<u8, Member>,
200+
}
201+
202+
impl Foo {
203+
pub fn should_also_not_cause_lint(&mut self, input: u8) {
204+
if self.members.contains_key(&input) {
205+
todo!();
206+
} else {
207+
self.other();
208+
self.members.insert(input, Member {});
209+
}
210+
}
211+
212+
fn other(&self) {}
213+
}
214+
}
215+
193216
fn main() {}

0 commit comments

Comments
 (0)