Skip to content

Commit 48430c2

Browse files
authored
iter_kv_map: recognize references on maps as well (#14596)
Fix #14595 changelog: [`iter_kv_map`]: recognize references on maps as well
2 parents 077475f + ebd5962 commit 48430c2

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

clippy_lints/src/methods/iter_kv_map.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub(super) fn check<'tcx>(
3737
(PatKind::Binding(ann, _, key, _), value) if pat_is_wild(cx, value, m_arg) => ("key", ann, key),
3838
_ => return,
3939
}
40-
&& let ty = cx.typeck_results().expr_ty(recv)
40+
&& let ty = cx.typeck_results().expr_ty_adjusted(recv).peel_refs()
4141
&& (is_type_diagnostic_item(cx, ty, sym::HashMap) || is_type_diagnostic_item(cx, ty, sym::BTreeMap))
4242
{
4343
let mut applicability = rustc_errors::Applicability::MachineApplicable;

tests/ui/iter_kv_map.fixed

+15
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,18 @@ fn msrv_1_54() {
166166
let _ = map.values().map(|v| v + 2).collect::<Vec<_>>();
167167
//~^ iter_kv_map
168168
}
169+
170+
fn issue14595() {
171+
pub struct Foo(BTreeMap<String, i32>);
172+
173+
impl AsRef<BTreeMap<String, i32>> for Foo {
174+
fn as_ref(&self) -> &BTreeMap<String, i32> {
175+
&self.0
176+
}
177+
}
178+
179+
let map = Foo(BTreeMap::default());
180+
181+
let _ = map.as_ref().values().copied().collect::<Vec<_>>();
182+
//~^ iter_kv_map
183+
}

tests/ui/iter_kv_map.rs

+15
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,18 @@ fn msrv_1_54() {
170170
let _ = map.iter().map(|(_, v)| v + 2).collect::<Vec<_>>();
171171
//~^ iter_kv_map
172172
}
173+
174+
fn issue14595() {
175+
pub struct Foo(BTreeMap<String, i32>);
176+
177+
impl AsRef<BTreeMap<String, i32>> for Foo {
178+
fn as_ref(&self) -> &BTreeMap<String, i32> {
179+
&self.0
180+
}
181+
}
182+
183+
let map = Foo(BTreeMap::default());
184+
185+
let _ = map.as_ref().iter().map(|(_, v)| v).copied().collect::<Vec<_>>();
186+
//~^ iter_kv_map
187+
}

tests/ui/iter_kv_map.stderr

+7-1
Original file line numberDiff line numberDiff line change
@@ -263,5 +263,11 @@ error: iterating on a map's values
263263
LL | let _ = map.iter().map(|(_, v)| v + 2).collect::<Vec<_>>();
264264
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `map.values().map(|v| v + 2)`
265265

266-
error: aborting due to 38 previous errors
266+
error: iterating on a map's values
267+
--> tests/ui/iter_kv_map.rs:185:13
268+
|
269+
LL | let _ = map.as_ref().iter().map(|(_, v)| v).copied().collect::<Vec<_>>();
270+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `map.as_ref().values()`
271+
272+
error: aborting due to 39 previous errors
267273

0 commit comments

Comments
 (0)