#![warn(clippy::unused_peekable)] #![allow(clippy::no_effect)] use std::iter::Empty; use std::iter::Peekable; fn main() { invalid(); valid(); } #[allow(clippy::unused_unit)] fn invalid() { let peekable = std::iter::empty::().peekable(); // Only lint `new_local` let old_local = std::iter::empty::().peekable(); let new_local = old_local; // Behind mut ref let mut by_mut_ref_test = std::iter::empty::().peekable(); let by_mut_ref = &mut by_mut_ref_test; // Explicitly returns `Peekable` fn returns_peekable() -> Peekable> { std::iter::empty().peekable() } let peekable_from_fn = returns_peekable(); // Using a method not exclusive to `Peekable` let mut peekable_using_iterator_method = std::iter::empty::().peekable(); peekable_using_iterator_method.next(); // Passed by ref to another function fn takes_ref(_peek: &Peekable>) {} let passed_along_ref = std::iter::empty::().peekable(); takes_ref(&passed_along_ref); // `by_ref` without `peek` let mut by_ref_test = std::iter::empty::().peekable(); let _by_ref = by_ref_test.by_ref(); let mut peekable_in_for_loop = std::iter::empty::().peekable(); for x in peekable_in_for_loop {} } fn valid() { fn takes_peekable(_peek: Peekable>) {} // Passed to another function let passed_along = std::iter::empty::().peekable(); takes_peekable(passed_along); // Passed to another method struct PeekableConsumer; impl PeekableConsumer { fn consume(&self, _: Peekable>) {} fn consume_mut_ref(&self, _: &mut Peekable>) {} fn consume_assoc(_: Peekable>) {} fn consume_assoc_mut_ref(_: &mut Peekable>) {} } let peekable_consumer = PeekableConsumer; let peekable = std::iter::empty::().peekable(); peekable_consumer.consume(peekable); let mut peekable = std::iter::empty::().peekable(); peekable_consumer.consume_mut_ref(&mut peekable); let peekable = std::iter::empty::().peekable(); PeekableConsumer::consume_assoc(peekable); let mut peekable = std::iter::empty::().peekable(); PeekableConsumer::consume_assoc_mut_ref(&mut peekable); // `peek` called in another block let mut peekable_in_block = std::iter::empty::().peekable(); { peekable_in_block.peek(); } // Check the other `Peekable` methods :) { let mut peekable_with_peek_mut = std::iter::empty::().peekable(); peekable_with_peek_mut.peek_mut(); let mut peekable_with_next_if = std::iter::empty::().peekable(); peekable_with_next_if.next_if(|_| true); let mut peekable_with_next_if_eq = std::iter::empty::().peekable(); peekable_with_next_if_eq.next_if_eq(&3); } let mut peekable_in_closure = std::iter::empty::().peekable(); let call_peek = |p: &mut Peekable>| { p.peek(); }; call_peek(&mut peekable_in_closure); // From a macro macro_rules! make_me_a_peekable_please { () => { std::iter::empty::().peekable() }; } let _unsuspecting_macro_user = make_me_a_peekable_please!(); // Generic Iterator returned fn return_an_iter() -> impl Iterator { std::iter::empty::().peekable() } let _unsuspecting_user = return_an_iter(); // Call `peek` in a macro macro_rules! peek_iter { ($iter:ident) => { $iter.peek(); }; } let mut peek_in_macro = std::iter::empty::().peekable(); peek_iter!(peek_in_macro); // Behind mut ref let mut by_mut_ref_test = std::iter::empty::().peekable(); let by_mut_ref = &mut by_mut_ref_test; by_mut_ref.peek(); // Behind ref let mut by_ref_test = std::iter::empty::().peekable(); let by_ref = &by_ref_test; by_ref_test.peek(); // In struct struct PeekableWrapper { f: Peekable>, } let struct_test = std::iter::empty::().peekable(); PeekableWrapper { f: struct_test }; // `by_ref` before `peek` let mut by_ref_test = std::iter::empty::().peekable(); let peeked_val = by_ref_test.by_ref().peek(); // `peek` called in another block as the last expression let mut peekable_last_expr = std::iter::empty::().peekable(); { peekable_last_expr.peek(); } let mut peek_in_closure = std::iter::empty::().peekable(); let _ = || { let _ = peek_in_closure.peek(); }; trait PeekTrait {} impl PeekTrait for Peekable where I: Iterator {} let mut peekable = std::iter::empty::().peekable(); let _dyn = &mut peekable as &mut dyn PeekTrait; fn takes_dyn(_: &mut dyn PeekTrait) {} let mut peekable = std::iter::empty::().peekable(); takes_dyn(&mut peekable); }