156 lines
3.4 KiB
Rust
156 lines
3.4 KiB
Rust
//@no-rustfix
|
|
//@aux-build:proc_macros.rs
|
|
#![warn(clippy::iter_without_into_iter)]
|
|
extern crate proc_macros;
|
|
|
|
pub struct S1;
|
|
impl S1 {
|
|
pub fn iter(&self) -> std::slice::Iter<'_, u8> {
|
|
//~^ ERROR: `iter` method without an `IntoIterator` impl
|
|
[].iter()
|
|
}
|
|
pub fn iter_mut(&mut self) -> std::slice::IterMut<'_, u8> {
|
|
//~^ ERROR: `iter_mut` method without an `IntoIterator` impl
|
|
[].iter_mut()
|
|
}
|
|
}
|
|
|
|
pub struct S2;
|
|
impl S2 {
|
|
pub fn iter(&self) -> impl Iterator<Item = &u8> {
|
|
// RPITIT is not stable, so we can't generally suggest it here yet
|
|
[].iter()
|
|
}
|
|
}
|
|
|
|
pub struct S3<'a>(&'a mut [u8]);
|
|
impl<'a> S3<'a> {
|
|
pub fn iter(&self) -> std::slice::Iter<'_, u8> {
|
|
//~^ ERROR: `iter` method without an `IntoIterator` impl
|
|
self.0.iter()
|
|
}
|
|
pub fn iter_mut(&mut self) -> std::slice::IterMut<'_, u8> {
|
|
//~^ ERROR: `iter_mut` method without an `IntoIterator` impl
|
|
self.0.iter_mut()
|
|
}
|
|
}
|
|
|
|
// Incompatible signatures
|
|
pub struct S4;
|
|
impl S4 {
|
|
pub fn iter(self) -> std::slice::Iter<'static, u8> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
pub struct S5;
|
|
impl S5 {
|
|
pub async fn iter(&self) -> std::slice::Iter<'static, u8> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
pub struct S6;
|
|
impl S6 {
|
|
pub fn iter(&self, _additional_param: ()) -> std::slice::Iter<'static, u8> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
pub struct S7<T>(T);
|
|
impl<T> S7<T> {
|
|
pub fn iter<U>(&self) -> std::slice::Iter<'static, (T, U)> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
pub struct S8<T>(T);
|
|
impl<T> S8<T> {
|
|
pub fn iter(&self) -> std::slice::Iter<'static, T> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
// ===========================
|
|
pub struct S9<T>(T);
|
|
impl<T> S9<T> {
|
|
pub fn iter(&self) -> std::slice::Iter<'_, T> {
|
|
//~^ ERROR: `iter` method without an `IntoIterator` impl
|
|
todo!()
|
|
}
|
|
pub fn iter_mut(&mut self) -> std::slice::IterMut<'_, T> {
|
|
//~^ ERROR: `iter_mut` method without an `IntoIterator` impl
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
pub struct S10<T>(T);
|
|
impl<T> S10<T> {
|
|
pub fn iter(&self) -> std::slice::Iter<'_, T> {
|
|
// Don't lint, there's an existing (wrong) IntoIterator impl
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
impl<'a, T> IntoIterator for &'a S10<T> {
|
|
type Item = &'a String;
|
|
type IntoIter = std::slice::Iter<'a, String>;
|
|
fn into_iter(self) -> Self::IntoIter {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
pub struct S11<T>(T);
|
|
impl<T> S11<T> {
|
|
pub fn iter_mut(&self) -> std::slice::IterMut<'_, T> {
|
|
// Don't lint, there's an existing (wrong) IntoIterator impl
|
|
todo!()
|
|
}
|
|
}
|
|
impl<'a, T> IntoIterator for &'a mut S11<T> {
|
|
type Item = &'a mut String;
|
|
type IntoIter = std::slice::IterMut<'a, String>;
|
|
fn into_iter(self) -> Self::IntoIter {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
// Private type not exported: don't lint
|
|
struct S12;
|
|
impl S12 {
|
|
fn iter(&self) -> std::slice::Iter<'_, u8> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
pub struct Issue12037;
|
|
macro_rules! generate_impl {
|
|
() => {
|
|
impl Issue12037 {
|
|
fn iter(&self) -> std::slice::Iter<'_, u8> {
|
|
todo!()
|
|
}
|
|
}
|
|
};
|
|
}
|
|
generate_impl!();
|
|
|
|
proc_macros::external! {
|
|
pub struct ImplWithForeignSpan;
|
|
impl ImplWithForeignSpan {
|
|
fn iter(&self) -> std::slice::Iter<'_, u8> {
|
|
todo!()
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct Allowed;
|
|
impl Allowed {
|
|
#[allow(clippy::iter_without_into_iter)]
|
|
pub fn iter(&self) -> std::slice::Iter<'_, u8> {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
fn main() {}
|