@@ -23,7 +23,20 @@ pub(super) fn check<'tcx>(
2323 && pat. len ( ) == 2
2424 {
2525 let arg_span = arg. span ;
26- let ( new_pat_span, kind, ty, mutbl) = match * cx. typeck_results ( ) . expr_ty ( arg) . kind ( ) {
26+ let ( arg, arg_ty) = match arg. kind {
27+ // `for x in &expr` or `for x in &mut expr`
28+ ExprKind :: AddrOf ( BorrowKind :: Ref , _, expr) => ( expr, cx. typeck_results ( ) . expr_ty ( arg) ) ,
29+ // `for x in receiver.iter()` or `for x in receiver.iter_mut()`
30+ ExprKind :: MethodCall ( path, receiver, [ ] , ..)
31+ if path. ident . name == sym:: iter || path. ident . name == sym:: iter_mut =>
32+ {
33+ // Use `expr_ty_adjusted` because `.iter()` / `.iter_mut()` may introduce auto deferences
34+ ( receiver, cx. typeck_results ( ) . expr_ty_adjusted ( receiver) )
35+ } ,
36+ _ => ( arg, cx. typeck_results ( ) . expr_ty ( arg) ) ,
37+ } ;
38+
39+ let ( new_pat_span, kind, ty, mutbl) = match * arg_ty. kind ( ) {
2740 ty:: Ref ( _, ty, mutbl) => match ( & pat[ 0 ] . kind , & pat[ 1 ] . kind ) {
2841 ( key, _) if pat_is_wild ( cx, key, body) => ( pat[ 1 ] . span , "value" , ty, mutbl) ,
2942 ( _, value) if pat_is_wild ( cx, value, body) => ( pat[ 0 ] . span , "key" , ty, Mutability :: Not ) ,
@@ -35,10 +48,6 @@ pub(super) fn check<'tcx>(
3548 Mutability :: Not => "" ,
3649 Mutability :: Mut => "_mut" ,
3750 } ;
38- let arg = match arg. kind {
39- ExprKind :: AddrOf ( BorrowKind :: Ref , _, expr) => expr,
40- _ => arg,
41- } ;
4251
4352 if matches ! ( ty. opt_diag_name( cx) , Some ( sym:: HashMap | sym:: BTreeMap ) )
4453 && let Some ( arg_span) = walk_span_to_context ( arg_span, span. ctxt ( ) )
0 commit comments