@@ -168,6 +168,7 @@ enum IndexEntry<'hir> {
168168 /// if the `assert!` asserts the right length.
169169 AssertWithIndex {
170170 highest_index : usize ,
171+ is_first_highest : bool ,
171172 asserted_len : usize ,
172173 assert_span : Span ,
173174 slice : & ' hir Expr < ' hir > ,
@@ -177,6 +178,7 @@ enum IndexEntry<'hir> {
177178 /// Indexing without an `assert!`
178179 IndexWithoutAssert {
179180 highest_index : usize ,
181+ is_first_highest : bool ,
180182 indexes : Vec < Span > ,
181183 slice : & ' hir Expr < ' hir > ,
182184 } ,
@@ -247,6 +249,7 @@ fn check_index<'hir>(cx: &LateContext<'_>, expr: &'hir Expr<'hir>, map: &mut Uni
247249 if slice. span . lo ( ) > assert_span. lo ( ) {
248250 * entry = IndexEntry :: AssertWithIndex {
249251 highest_index : index,
252+ is_first_highest : true ,
250253 asserted_len : * asserted_len,
251254 assert_span : * assert_span,
252255 slice,
@@ -256,18 +259,28 @@ fn check_index<'hir>(cx: &LateContext<'_>, expr: &'hir Expr<'hir>, map: &mut Uni
256259 }
257260 } ,
258261 IndexEntry :: IndexWithoutAssert {
259- highest_index, indexes, ..
262+ highest_index,
263+ indexes,
264+ is_first_highest,
265+ ..
260266 }
261267 | IndexEntry :: AssertWithIndex {
262- highest_index, indexes, ..
268+ highest_index,
269+ indexes,
270+ is_first_highest,
271+ ..
263272 } => {
264273 indexes. push ( expr. span ) ;
274+ if * is_first_highest {
275+ ( * is_first_highest) = * highest_index >= index;
276+ }
265277 * highest_index = ( * highest_index) . max ( index) ;
266278 } ,
267279 }
268280 } else {
269281 indexes. push ( IndexEntry :: IndexWithoutAssert {
270282 highest_index : index,
283+ is_first_highest : true ,
271284 indexes : vec ! [ expr. span] ,
272285 slice,
273286 } ) ;
@@ -286,6 +299,7 @@ fn check_assert<'hir>(cx: &LateContext<'_>, expr: &'hir Expr<'hir>, map: &mut Un
286299 if let Some ( entry) = entry {
287300 if let IndexEntry :: IndexWithoutAssert {
288301 highest_index,
302+ is_first_highest,
289303 indexes,
290304 slice,
291305 } = entry
@@ -294,6 +308,7 @@ fn check_assert<'hir>(cx: &LateContext<'_>, expr: &'hir Expr<'hir>, map: &mut Un
294308 * entry = IndexEntry :: AssertWithIndex {
295309 highest_index : * highest_index,
296310 indexes : mem:: take ( indexes) ,
311+ is_first_highest : * is_first_highest,
297312 slice,
298313 assert_span : expr. span ,
299314 comparison,
@@ -328,12 +343,13 @@ fn report_indexes(cx: &LateContext<'_>, map: &UnindexMap<u64, Vec<IndexEntry<'_>
328343 match * entry {
329344 IndexEntry :: AssertWithIndex {
330345 highest_index,
346+ is_first_highest,
331347 asserted_len,
332348 ref indexes,
333349 comparison,
334350 assert_span,
335351 slice,
336- } if indexes. len ( ) > 1 => {
352+ } if indexes. len ( ) > 1 && !is_first_highest => {
337353 // if we have found an `assert!`, let's also check that it's actually right
338354 // and if it covers the highest index and if not, suggest the correct length
339355 let sugg = match comparison {
@@ -381,8 +397,9 @@ fn report_indexes(cx: &LateContext<'_>, map: &UnindexMap<u64, Vec<IndexEntry<'_>
381397 IndexEntry :: IndexWithoutAssert {
382398 ref indexes,
383399 highest_index,
400+ is_first_highest,
384401 slice,
385- } if indexes. len ( ) > 1 => {
402+ } if indexes. len ( ) > 1 && !is_first_highest => {
386403 // if there was no `assert!` but more than one index, suggest
387404 // adding an `assert!` that covers the highest index
388405 report_lint (
0 commit comments