1
Fork 0

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:
Joonas Koivunen 2017-08-18 17:07:39 +03:00
parent 7cdaeae1b8
commit cf8e95eb22
2 changed files with 38 additions and 0 deletions

View file

@ -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
}

View file

@ -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