#![warn(clippy::new_ret_no_self)] #![allow(dead_code, clippy::trivially_copy_pass_by_ref)] fn main(){} trait R { type Item; } trait Q { type Item; type Item2; } struct S; impl R for S { type Item = Self; } impl S { // should not trigger the lint pub fn new() -> impl R { S } } struct S2; impl R for S2 { type Item = Self; } impl S2 { // should not trigger the lint pub fn new(_: String) -> impl R { S2 } } struct S3; impl R for S3 { type Item = u32; } impl S3 { // should trigger the lint pub fn new(_: String) -> impl R { S3 } } struct S4; impl Q for S4 { type Item = u32; type Item2 = Self; } impl S4 { // should not trigger the lint pub fn new(_: String) -> impl Q { S4 } } struct T; impl T { // should not trigger lint pub fn new() -> Self { unimplemented!(); } } struct U; impl U { // should trigger lint pub fn new() -> u32 { unimplemented!(); } } struct V; impl V { // should trigger lint pub fn new(_: String) -> u32 { unimplemented!(); } } struct TupleReturnerOk; impl TupleReturnerOk { // should not trigger lint pub fn new() -> (Self, u32) { unimplemented!(); } } struct TupleReturnerOk2; impl TupleReturnerOk2 { // should not trigger lint (it doesn't matter which element in the tuple is Self) pub fn new() -> (u32, Self) { unimplemented!(); } } struct TupleReturnerOk3; impl TupleReturnerOk3 { // should not trigger lint (tuple can contain multiple Self) pub fn new() -> (Self, Self) { unimplemented!(); } } struct TupleReturnerBad; impl TupleReturnerBad { // should trigger lint pub fn new() -> (u32, u32) { unimplemented!(); } } struct MutPointerReturnerOk; impl MutPointerReturnerOk { // should not trigger lint pub fn new() -> *mut Self { unimplemented!(); } } struct MutPointerReturnerOk2; impl MutPointerReturnerOk2 { // should not trigger lint pub fn new() -> *const Self { unimplemented!(); } } struct MutPointerReturnerBad; impl MutPointerReturnerBad { // should trigger lint pub fn new() -> *mut V { unimplemented!(); } }