-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
rustup https://github.com/rust-lang/rust/pull/71215/ #5520
Merged
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
f9c1acb
rustup https://github.com/rust-lang/rust/pull/71215/
matthiaskrgr fe25dbe
Fix while_let_on_iterator suggestion and make it MachineApplicable
flip1995 44511d5
Update while_let_on_iterator tests
flip1995 dda1c8d
Update issue_2356.stderr reference file
flip1995 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
// run-rustfix | ||
|
||
#![warn(clippy::while_let_on_iterator)] | ||
#![allow(clippy::never_loop, unreachable_code, unused_mut)] | ||
|
||
fn base() { | ||
let mut iter = 1..20; | ||
for x in iter { | ||
println!("{}", x); | ||
} | ||
|
||
let mut iter = 1..20; | ||
for x in iter { | ||
println!("{}", x); | ||
} | ||
|
||
let mut iter = 1..20; | ||
for _ in iter {} | ||
|
||
let mut iter = 1..20; | ||
while let None = iter.next() {} // this is fine (if nonsensical) | ||
|
||
let mut iter = 1..20; | ||
if let Some(x) = iter.next() { | ||
// also fine | ||
println!("{}", x) | ||
} | ||
|
||
// the following shouldn't warn because it can't be written with a for loop | ||
let mut iter = 1u32..20; | ||
while let Some(_) = iter.next() { | ||
println!("next: {:?}", iter.next()) | ||
} | ||
|
||
// neither can this | ||
let mut iter = 1u32..20; | ||
while let Some(_) = iter.next() { | ||
println!("next: {:?}", iter.next()); | ||
} | ||
|
||
// or this | ||
let mut iter = 1u32..20; | ||
while let Some(_) = iter.next() { | ||
break; | ||
} | ||
println!("Remaining iter {:?}", iter); | ||
|
||
// or this | ||
let mut iter = 1u32..20; | ||
while let Some(_) = iter.next() { | ||
iter = 1..20; | ||
} | ||
} | ||
|
||
// Issue #1188 | ||
fn refutable() { | ||
let a = [42, 1337]; | ||
let mut b = a.iter(); | ||
|
||
// consume all the 42s | ||
while let Some(&42) = b.next() {} | ||
|
||
let a = [(1, 2, 3)]; | ||
let mut b = a.iter(); | ||
|
||
while let Some(&(1, 2, 3)) = b.next() {} | ||
|
||
let a = [Some(42)]; | ||
let mut b = a.iter(); | ||
|
||
while let Some(&None) = b.next() {} | ||
|
||
/* This gives “refutable pattern in `for` loop binding: `&_` not covered” | ||
for &42 in b {} | ||
for &(1, 2, 3) in b {} | ||
for &Option::None in b.next() {} | ||
// */ | ||
} | ||
|
||
fn nested_loops() { | ||
let a = [42, 1337]; | ||
let mut y = a.iter(); | ||
loop { | ||
// x is reused, so don't lint here | ||
while let Some(_) = y.next() {} | ||
} | ||
|
||
let mut y = a.iter(); | ||
for _ in 0..2 { | ||
while let Some(_) = y.next() { | ||
// y is reused, don't lint | ||
} | ||
} | ||
|
||
loop { | ||
let mut y = a.iter(); | ||
for _ in y { | ||
// use a for loop here | ||
} | ||
} | ||
} | ||
|
||
fn issue1121() { | ||
use std::collections::HashSet; | ||
let mut values = HashSet::new(); | ||
values.insert(1); | ||
|
||
while let Some(&value) = values.iter().next() { | ||
values.remove(&value); | ||
} | ||
} | ||
|
||
fn issue2965() { | ||
// This should not cause an ICE and suggest: | ||
// | ||
// for _ in values.iter() {} | ||
// | ||
use std::collections::HashSet; | ||
let mut values = HashSet::new(); | ||
values.insert(1); | ||
|
||
for _ in values.iter() { | ||
// FIXME(flip1995): Linting this with the following line uncommented is a FP, see #1654 | ||
// values.remove(&1); | ||
} | ||
} | ||
|
||
fn issue3670() { | ||
let array = [Some(0), None, Some(1)]; | ||
let mut iter = array.iter(); | ||
|
||
while let Some(elem) = iter.next() { | ||
let _ = elem.or_else(|| *iter.next()?); | ||
} | ||
} | ||
|
||
fn main() { | ||
base(); | ||
refutable(); | ||
nested_loops(); | ||
issue1121(); | ||
issue2965(); | ||
issue3670(); | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This comment is not 100% correct, but by fixing #1654 the issue with the mutable borrow inside the loop is also fixed, since this is only possible, if the iterator is recreated on every iteration.
I'm working on a fix of #1654, but that is not for this PR.