#![warn(clippy::wrong_self_convention)] #![allow(dead_code)] fn main() {} #[derive(Clone, Copy)] struct Foo; impl Foo { fn as_i32(self) {} fn as_u32(&self) {} fn into_i32(self) {} fn is_i32(self) {} fn is_u32(&self) {} fn to_i32(self) {} fn from_i32(self) {} pub fn as_i64(self) {} pub fn into_i64(self) {} pub fn is_i64(self) {} pub fn to_i64(self) {} pub fn from_i64(self) {} // check whether the lint can be allowed at the function level #[allow(clippy::wrong_self_convention)] pub fn from_cake(self) {} fn as_x>(_: F) {} fn as_y>(_: F) {} } struct Bar; impl Bar { fn as_i32(self) {} fn as_u32(&self) {} fn into_i32(&self) {} fn into_u32(self) {} fn is_i32(self) {} fn is_u32(&self) {} fn to_i32(self) {} fn to_u32(&self) {} fn from_i32(self) {} pub fn as_i64(self) {} pub fn into_i64(&self) {} pub fn is_i64(self) {} pub fn to_i64(self) {} pub fn from_i64(self) {} // test for false positives fn as_(self) {} fn into_(&self) {} fn is_(self) {} fn to_(self) {} fn from_(self) {} fn to_mut(&mut self) {} } // Allow Box, Rc, Arc for methods that take conventionally take Self by value #[allow(clippy::boxed_local)] mod issue4293 { use std::rc::Rc; use std::sync::Arc; struct T; impl T { fn into_s1(self: Box) {} fn into_s2(self: Rc) {} fn into_s3(self: Arc) {} fn into_t1(self: Box) {} fn into_t2(self: Rc) {} fn into_t3(self: Arc) {} } } // False positive for async (see #4037) mod issue4037 { pub struct Foo; pub struct Bar; impl Foo { pub async fn into_bar(self) -> Bar { Bar } } } // Lint also in trait definition (see #6307) mod issue6307 { trait T: Sized { fn as_i32(self) {} fn as_u32(&self) {} fn into_i32(self) {} fn into_i32_ref(&self) {} fn into_u32(self) {} fn is_i32(self) {} fn is_u32(&self) {} fn to_i32(self) {} fn to_u32(&self) {} fn from_i32(self) {} // check whether the lint can be allowed at the function level #[allow(clippy::wrong_self_convention)] fn from_cake(self) {} // test for false positives fn as_(self) {} fn into_(&self) {} fn is_(self) {} fn to_(self) {} fn from_(self) {} fn to_mut(&mut self) {} } trait U { fn as_i32(self); fn as_u32(&self); fn into_i32(self); fn into_i32_ref(&self); fn into_u32(self); fn is_i32(self); fn is_u32(&self); fn to_i32(self); fn to_u32(&self); fn from_i32(self); // check whether the lint can be allowed at the function level #[allow(clippy::wrong_self_convention)] fn from_cake(self); // test for false positives fn as_(self); fn into_(&self); fn is_(self); fn to_(self); fn from_(self); fn to_mut(&mut self); } trait C: Copy { fn as_i32(self); fn as_u32(&self); fn into_i32(self); fn into_i32_ref(&self); fn into_u32(self); fn is_i32(self); fn is_u32(&self); fn to_i32(self); fn to_u32(&self); fn from_i32(self); // check whether the lint can be allowed at the function level #[allow(clippy::wrong_self_convention)] fn from_cake(self); // test for false positives fn as_(self); fn into_(&self); fn is_(self); fn to_(self); fn from_(self); fn to_mut(&mut self); } } mod issue6727 { #[derive(Clone, Copy)] struct FooCopy; impl FooCopy { fn to_u64(self) -> u64 { 1 } // trigger lint fn to_u64_v2(&self) -> u64 { 1 } } struct FooNoCopy; impl FooNoCopy { // trigger lint fn to_u64(self) -> u64 { 2 } fn to_u64_v2(&self) -> u64 { 2 } } } pub mod issue8142 { struct S; impl S { // Should not lint: "no self at all" is allowed. fn is_forty_two(x: u32) -> bool { x == 42 } // Should not lint: &self is allowed. fn is_test_code(&self) -> bool { true } } }