is_from_for_desugar: add match for for _ in x
This will avoid `let_unit_value` in the examples in the ui-test. It might match too widely.
This commit is contained in:
parent
7cdaeae1b8
commit
cf8e95eb22
2 changed files with 38 additions and 0 deletions
|
@ -121,6 +121,22 @@ pub fn is_from_for_desugar(decl: &hir::Decl) -> bool {
|
|||
], {
|
||||
return true;
|
||||
}}
|
||||
|
||||
// This detects a variable binding in for loop to avoid `let_unit_value`
|
||||
// lint (see issue #1964).
|
||||
//
|
||||
// ```
|
||||
// for _ in vec![()] {
|
||||
// // anything
|
||||
// }
|
||||
// ```
|
||||
if_let_chain! {[
|
||||
let hir::DeclLocal(ref loc) = decl.node,
|
||||
let hir::LocalSource::ForLoopDesugar = loc.source,
|
||||
], {
|
||||
return true;
|
||||
}}
|
||||
|
||||
false
|
||||
}
|
||||
|
||||
|
|
|
@ -18,8 +18,30 @@ fn main() {
|
|||
let _a = ();
|
||||
}
|
||||
|
||||
consume_units_with_for_loop(); // should be fine as well
|
||||
|
||||
let_and_return!(()) // should be fine
|
||||
}
|
||||
|
||||
// Related to issue #1964
|
||||
fn consume_units_with_for_loop() {
|
||||
// `for_let_unit` lint should not be triggered by consuming them using for loop.
|
||||
let v = vec![(), (), ()];
|
||||
let mut count = 0;
|
||||
for _ in v {
|
||||
count += 1;
|
||||
}
|
||||
assert_eq!(count, 3);
|
||||
|
||||
// Same for consuming from some other Iterator<()>.
|
||||
let (tx, rx) = ::std::sync::mpsc::channel();
|
||||
tx.send(()).unwrap();
|
||||
count = 0;
|
||||
for _ in rx.iter() {
|
||||
count += 1;
|
||||
}
|
||||
assert_eq!(count, 1);
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct ContainsUnit(()); // should be fine
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue