@@ -925,14 +925,16 @@ fn check_for_loop_range<'a, 'tcx>(
925
925
cx : cx,
926
926
var : canonical_id,
927
927
indexed : HashMap :: new ( ) ,
928
+ indexed_directly : HashMap :: new ( ) ,
928
929
referenced : HashSet :: new ( ) ,
929
930
nonindex : false ,
930
931
} ;
931
932
walk_expr ( & mut visitor, body) ;
932
933
933
- // linting condition: we only indexed one variable
934
- if visitor. indexed . len ( ) == 1 {
935
- let ( indexed, indexed_extent) = visitor. indexed . into_iter ( ) . next ( ) . expect (
934
+ // linting condition: we only indexed one variable, and indexed it directly
935
+ // (`indexed_directly` is subset of `indexed`)
936
+ if visitor. indexed . len ( ) == 1 && visitor. indexed_directly . len ( ) == 1 {
937
+ let ( indexed, indexed_extent) = visitor. indexed_directly . into_iter ( ) . next ( ) . expect (
936
938
"already checked that we have exactly 1 element" ,
937
939
) ;
938
940
@@ -1481,6 +1483,9 @@ struct VarVisitor<'a, 'tcx: 'a> {
1481
1483
var : ast:: NodeId ,
1482
1484
/// indexed variables, the extend is `None` for global
1483
1485
indexed : HashMap < Name , Option < region:: Scope > > ,
1486
+ /// subset of `indexed` of vars that are indexed directly: `v[i]`
1487
+ /// this will not contain cases like `v[calc_index(i)]` or `v[(i + 4) % N]`
1488
+ indexed_directly : HashMap < Name , Option < region:: Scope > > ,
1484
1489
/// Any names that are used outside an index operation.
1485
1490
/// Used to detect things like `&mut vec` used together with `vec[i]`
1486
1491
referenced : HashSet < Name > ,
@@ -1499,7 +1504,8 @@ impl<'a, 'tcx> Visitor<'tcx> for VarVisitor<'a, 'tcx> {
1499
1504
let QPath :: Resolved ( None , ref seqvar) = * seqpath,
1500
1505
seqvar. segments. len( ) == 1 ,
1501
1506
] , {
1502
- let index_used = same_var( self . cx, idx, self . var) || {
1507
+ let index_used_directly = same_var( self . cx, idx, self . var) ;
1508
+ let index_used = index_used_directly || {
1503
1509
let mut used_visitor = LocalUsedVisitor {
1504
1510
cx: self . cx,
1505
1511
local: self . var,
@@ -1519,10 +1525,16 @@ impl<'a, 'tcx> Visitor<'tcx> for VarVisitor<'a, 'tcx> {
1519
1525
let parent_def_id = self . cx. tcx. hir. local_def_id( parent_id) ;
1520
1526
let extent = self . cx. tcx. region_scope_tree( parent_def_id) . var_scope( hir_id. local_id) ;
1521
1527
self . indexed. insert( seqvar. segments[ 0 ] . name, Some ( extent) ) ;
1528
+ if index_used_directly {
1529
+ self . indexed_directly. insert( seqvar. segments[ 0 ] . name, Some ( extent) ) ;
1530
+ }
1522
1531
return ; // no need to walk further *on the variable*
1523
1532
}
1524
1533
Def :: Static ( ..) | Def :: Const ( ..) => {
1525
1534
self . indexed. insert( seqvar. segments[ 0 ] . name, None ) ;
1535
+ if index_used_directly {
1536
+ self . indexed_directly. insert( seqvar. segments[ 0 ] . name, None ) ;
1537
+ }
1526
1538
return ; // no need to walk further *on the variable*
1527
1539
}
1528
1540
_ => ( ) ,
0 commit comments