rust-clippy/tests/ui/unused_peekable.rs

183 lines
5.5 KiB
Rust
Raw Normal View History

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