Skip to content

needless_range_loop produces code with different behaviour #6930

@ChrisJefferson

Description

@ChrisJefferson

needless_range_loop suggests changing:

pub fn foo_a(out: &mut Vec<usize>, inx: &[usize], base: usize) {
    for i in 1 .. base {
        out[i] = *inx.get(i).unwrap_or(&0);
    }
}

to

pub fn foo_b(out: &mut Vec<usize>, inx: &[usize], base: usize) {
    for (i, item) in out.iter_mut().enumerate().take(base).skip(1) {
        *item = *inx.get(i).unwrap_or(&0);
    }
}

However, these are only equivalent is out has at least base elements. If not, then this changes behaviour (the first version panics with out of bounds, the second silently truncates the loop).

See this example at https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6f00aec168a98758df574f0734a2233e (edit: this link was previously broken, thanks)

(I noticed this will discussing needless_range_loop in #6075 )

Metadata

Metadata

Assignees

Labels

A-documentationArea: Adding or improving documentationL-suggestionLint: Improving, adding or fixing lint suggestionsgood first issueThese issues are a good way to get started with Clippy

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions