2019-01-22 15:16:54 +01:00
|
|
|
// run-rustfix
|
2020-03-10 22:35:07 +01:00
|
|
|
// edition:2018
|
2019-01-22 15:16:54 +01:00
|
|
|
|
2018-07-28 17:34:52 +02:00
|
|
|
#![warn(clippy::use_self)]
|
2017-07-28 13:28:07 +02:00
|
|
|
#![allow(dead_code)]
|
2021-01-30 18:06:34 +01:00
|
|
|
#![allow(clippy::should_implement_trait, clippy::upper_case_acronyms)]
|
2017-07-28 13:28:07 +02:00
|
|
|
|
|
|
|
fn main() {}
|
|
|
|
|
|
|
|
mod use_self {
|
|
|
|
struct Foo {}
|
|
|
|
|
|
|
|
impl Foo {
|
|
|
|
fn new() -> Foo {
|
|
|
|
Foo {}
|
|
|
|
}
|
|
|
|
fn test() -> Foo {
|
|
|
|
Foo::new()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for Foo {
|
|
|
|
fn default() -> Foo {
|
|
|
|
Foo::new()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
mod better {
|
|
|
|
struct Foo {}
|
|
|
|
|
|
|
|
impl Foo {
|
|
|
|
fn new() -> Self {
|
|
|
|
Self {}
|
|
|
|
}
|
|
|
|
fn test() -> Self {
|
|
|
|
Self::new()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for Foo {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self::new()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-08-22 00:18:37 +02:00
|
|
|
|
|
|
|
mod lifetimes {
|
2018-12-09 23:26:16 +01:00
|
|
|
struct Foo<'a> {
|
|
|
|
foo_str: &'a str,
|
|
|
|
}
|
2017-08-22 00:18:37 +02:00
|
|
|
|
|
|
|
impl<'a> Foo<'a> {
|
2018-12-09 23:26:16 +01:00
|
|
|
// Cannot use `Self` as return type, because the function is actually `fn foo<'b>(s: &'b str) ->
|
|
|
|
// Foo<'b>`
|
2017-08-22 00:18:37 +02:00
|
|
|
fn foo(s: &str) -> Foo {
|
|
|
|
Foo { foo_str: s }
|
|
|
|
}
|
|
|
|
// cannot replace with `Self`, because that's `Foo<'a>`
|
|
|
|
fn bar() -> Foo<'static> {
|
2018-12-09 23:26:16 +01:00
|
|
|
Foo { foo_str: "foo" }
|
2017-08-22 00:18:37 +02:00
|
|
|
}
|
|
|
|
|
2018-12-28 13:41:33 +01:00
|
|
|
// FIXME: the lint does not handle lifetimed struct
|
2018-12-27 09:54:19 +01:00
|
|
|
// `Self` should be applicable here
|
2017-08-22 00:18:37 +02:00
|
|
|
fn clone(&self) -> Foo<'a> {
|
2018-12-09 23:26:16 +01:00
|
|
|
Foo { foo_str: self.foo_str }
|
2017-08-22 00:18:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-07-14 12:18:50 +02:00
|
|
|
|
|
|
|
mod issue2894 {
|
|
|
|
trait IntoBytes {
|
2020-12-20 17:19:49 +01:00
|
|
|
#[allow(clippy::wrong_self_convention)]
|
2018-07-14 12:18:50 +02:00
|
|
|
fn into_bytes(&self) -> Vec<u8>;
|
|
|
|
}
|
|
|
|
|
|
|
|
// This should not be linted
|
|
|
|
impl IntoBytes for u8 {
|
|
|
|
fn into_bytes(&self) -> Vec<u8> {
|
|
|
|
vec![*self]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-10-25 05:28:54 +02:00
|
|
|
|
|
|
|
mod existential {
|
|
|
|
struct Foo;
|
|
|
|
|
|
|
|
impl Foo {
|
2018-12-09 23:26:16 +01:00
|
|
|
fn bad(foos: &[Self]) -> impl Iterator<Item = &Foo> {
|
2018-10-25 05:28:54 +02:00
|
|
|
foos.iter()
|
|
|
|
}
|
|
|
|
|
2018-12-09 23:26:16 +01:00
|
|
|
fn good(foos: &[Self]) -> impl Iterator<Item = &Self> {
|
2018-10-25 05:28:54 +02:00
|
|
|
foos.iter()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-10 09:46:21 +01:00
|
|
|
|
2018-12-27 17:27:42 +01:00
|
|
|
mod tuple_structs {
|
|
|
|
pub struct TS(i32);
|
|
|
|
|
|
|
|
impl TS {
|
|
|
|
pub fn ts() -> Self {
|
|
|
|
TS(0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-04 11:31:28 +01:00
|
|
|
mod macros {
|
|
|
|
macro_rules! use_self_expand {
|
|
|
|
() => {
|
|
|
|
fn new() -> Foo {
|
|
|
|
Foo {}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Foo {}
|
|
|
|
|
|
|
|
impl Foo {
|
|
|
|
use_self_expand!(); // Should lint in local macros
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-06 15:05:04 +01:00
|
|
|
mod nesting {
|
|
|
|
struct Foo {}
|
|
|
|
impl Foo {
|
|
|
|
fn foo() {
|
2019-04-01 07:19:05 +02:00
|
|
|
#[allow(unused_imports)]
|
2019-01-06 15:05:04 +01:00
|
|
|
use self::Foo; // Can't use Self here
|
|
|
|
struct Bar {
|
|
|
|
foo: Foo, // Foo != Self
|
|
|
|
}
|
2019-01-07 14:11:53 +01:00
|
|
|
|
|
|
|
impl Bar {
|
|
|
|
fn bar() -> Bar {
|
2019-01-07 14:38:01 +01:00
|
|
|
Bar { foo: Foo {} }
|
2019-01-07 14:11:53 +01:00
|
|
|
}
|
|
|
|
}
|
2019-03-11 15:24:49 +01:00
|
|
|
|
|
|
|
// Can't use Self here
|
|
|
|
fn baz() -> Foo {
|
|
|
|
Foo {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Should lint here
|
|
|
|
fn baz() -> Foo {
|
|
|
|
Foo {}
|
2019-01-06 15:05:04 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
enum Enum {
|
|
|
|
A,
|
2019-07-31 02:24:28 +02:00
|
|
|
B(u64),
|
2019-08-01 07:09:57 +02:00
|
|
|
C { field: bool },
|
2019-01-06 15:05:04 +01:00
|
|
|
}
|
|
|
|
impl Enum {
|
|
|
|
fn method() {
|
2019-01-22 15:16:54 +01:00
|
|
|
#[allow(unused_imports)]
|
2019-01-07 14:11:53 +01:00
|
|
|
use self::Enum::*; // Issue 3425
|
2019-01-06 15:05:04 +01:00
|
|
|
static STATIC: Enum = Enum::A; // Can't use Self as type
|
|
|
|
}
|
2019-07-31 02:24:28 +02:00
|
|
|
|
|
|
|
fn method2() {
|
|
|
|
let _ = Enum::B(42);
|
|
|
|
let _ = Enum::C { field: true };
|
|
|
|
let _ = Enum::A;
|
|
|
|
}
|
2019-01-06 15:05:04 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-10 09:46:21 +01:00
|
|
|
mod issue3410 {
|
|
|
|
|
|
|
|
struct A;
|
|
|
|
struct B;
|
|
|
|
|
2018-11-13 05:15:33 +01:00
|
|
|
trait Trait<T> {
|
2018-11-10 09:46:21 +01:00
|
|
|
fn a(v: T);
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Trait<Vec<A>> for Vec<B> {
|
|
|
|
fn a(_: Vec<A>) {}
|
|
|
|
}
|
|
|
|
}
|
2019-01-21 13:06:32 +01:00
|
|
|
|
2019-01-22 15:16:54 +01:00
|
|
|
#[allow(clippy::no_effect, path_statements)]
|
2019-01-21 13:06:32 +01:00
|
|
|
mod rustfix {
|
|
|
|
mod nested {
|
|
|
|
pub struct A {}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl nested::A {
|
|
|
|
const A: bool = true;
|
|
|
|
|
|
|
|
fn fun_1() {}
|
|
|
|
|
|
|
|
fn fun_2() {
|
|
|
|
nested::A::fun_1();
|
|
|
|
nested::A::A;
|
|
|
|
|
|
|
|
nested::A {};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-09-12 08:47:11 +02:00
|
|
|
|
|
|
|
mod issue3567 {
|
|
|
|
struct TestStruct {}
|
|
|
|
impl TestStruct {
|
|
|
|
fn from_something() -> Self {
|
|
|
|
Self {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
trait Test {
|
|
|
|
fn test() -> TestStruct;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Test for TestStruct {
|
|
|
|
fn test() -> TestStruct {
|
|
|
|
TestStruct::from_something()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-11-06 06:13:43 +01:00
|
|
|
|
2019-11-07 04:59:13 +01:00
|
|
|
mod paths_created_by_lowering {
|
|
|
|
use std::ops::Range;
|
|
|
|
|
2019-11-06 06:13:43 +01:00
|
|
|
struct S {}
|
|
|
|
|
|
|
|
impl S {
|
|
|
|
const A: usize = 0;
|
|
|
|
const B: usize = 1;
|
|
|
|
|
2019-11-07 04:59:13 +01:00
|
|
|
async fn g() -> S {
|
|
|
|
S {}
|
|
|
|
}
|
|
|
|
|
2019-11-06 06:13:43 +01:00
|
|
|
fn f<'a>(&self, p: &'a [u8]) -> &'a [u8] {
|
|
|
|
&p[S::A..S::B]
|
|
|
|
}
|
|
|
|
}
|
2019-11-07 04:59:13 +01:00
|
|
|
|
|
|
|
trait T {
|
|
|
|
fn f<'a>(&self, p: &'a [u8]) -> &'a [u8];
|
|
|
|
}
|
|
|
|
|
|
|
|
impl T for Range<u8> {
|
|
|
|
fn f<'a>(&self, p: &'a [u8]) -> &'a [u8] {
|
|
|
|
&p[0..1]
|
|
|
|
}
|
|
|
|
}
|
2019-11-06 06:13:43 +01:00
|
|
|
}
|