Add new ui tests for map_clone lint on types implementing Copy

This commit is contained in:
Guillaume Gomez 2024-01-11 17:03:30 +01:00
parent 82841aada4
commit 74db4b7f6d
3 changed files with 97 additions and 7 deletions

View file

@ -69,15 +69,48 @@ fn main() {
//~^ ERROR: you are explicitly cloning with `.map()` //~^ ERROR: you are explicitly cloning with `.map()`
let y = x.cloned(); let y = x.cloned();
//~^ ERROR: you are explicitly cloning with `.map()` //~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `cloned` method
let y = x.cloned(); let y = x.cloned();
//~^ ERROR: you are explicitly cloning with `.map()` //~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `cloned` method
let x: Option<u32> = Some(0);
let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint.
let y = x.copied();
//~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `copied` method
let y = x.copied();
//~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `copied` method
// Should not suggest `copied` or `cloned` here since `T` is not a reference.
let x: Option<u32> = Some(0);
let y = x.map(|x| u32::clone(&x));
let y = x.map(|x| Clone::clone(&x));
// Testing with `Result` now. // Testing with `Result` now.
let x: Result<String, ()> = Ok(String::new()); let x: Result<String, ()> = Ok(String::new());
let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint. let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint.
let y = x.cloned(); let y = x.cloned();
//~^ ERROR: you are explicitly cloning with `.map()` //~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `cloned` method
let y = x.cloned(); let y = x.cloned();
//~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `cloned` method
let x: Result<u32, ()> = Ok(0);
let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint.
let y = x.copied();
//~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `copied` method
let y = x.copied();
//~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `copied` method
// Should not suggest `copied` or `cloned` here since `T` is not a reference.
let x: Result<u32, ()> = Ok(0);
let y = x.map(|x| u32::clone(&x));
let y = x.map(|x| Clone::clone(&x));
// We ensure that no warning is emitted here because `useless_asref` is taking over. // We ensure that no warning is emitted here because `useless_asref` is taking over.
let x = Some(String::new()); let x = Some(String::new());

View file

@ -69,15 +69,48 @@ fn main() {
//~^ ERROR: you are explicitly cloning with `.map()` //~^ ERROR: you are explicitly cloning with `.map()`
let y = x.map(Clone::clone); let y = x.map(Clone::clone);
//~^ ERROR: you are explicitly cloning with `.map()` //~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `cloned` method
let y = x.map(String::clone); let y = x.map(String::clone);
//~^ ERROR: you are explicitly cloning with `.map()` //~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `cloned` method
let x: Option<u32> = Some(0);
let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint.
let y = x.map(|x| u32::clone(x));
//~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `copied` method
let y = x.map(|x| Clone::clone(x));
//~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `copied` method
// Should not suggest `copied` or `cloned` here since `T` is not a reference.
let x: Option<u32> = Some(0);
let y = x.map(|x| u32::clone(&x));
let y = x.map(|x| Clone::clone(&x));
// Testing with `Result` now. // Testing with `Result` now.
let x: Result<String, ()> = Ok(String::new()); let x: Result<String, ()> = Ok(String::new());
let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint. let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint.
let y = x.map(|x| String::clone(x)); let y = x.map(|x| String::clone(x));
//~^ ERROR: you are explicitly cloning with `.map()` //~^ ERROR: you are explicitly cloning with `.map()`
let y = x.map(|x| String::clone(x)); //~| HELP: consider calling the dedicated `cloned` method
let y = x.map(|x| Clone::clone(x));
//~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `cloned` method
let x: Result<u32, ()> = Ok(0);
let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint.
let y = x.map(|x| u32::clone(x));
//~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `copied` method
let y = x.map(|x| Clone::clone(x));
//~^ ERROR: you are explicitly cloning with `.map()`
//~| HELP: consider calling the dedicated `copied` method
// Should not suggest `copied` or `cloned` here since `T` is not a reference.
let x: Result<u32, ()> = Ok(0);
let y = x.map(|x| u32::clone(&x));
let y = x.map(|x| Clone::clone(&x));
// We ensure that no warning is emitted here because `useless_asref` is taking over. // We ensure that no warning is emitted here because `useless_asref` is taking over.
let x = Some(String::new()); let x = Some(String::new());

View file

@ -50,22 +50,46 @@ LL | let y = x.map(Clone::clone);
| ^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `x.cloned()` | ^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `x.cloned()`
error: you are explicitly cloning with `.map()` error: you are explicitly cloning with `.map()`
--> $DIR/map_clone.rs:72:13 --> $DIR/map_clone.rs:73:13
| |
LL | let y = x.map(String::clone); LL | let y = x.map(String::clone);
| ^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `x.cloned()` | ^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `x.cloned()`
error: you are explicitly cloning with `.map()` error: you are explicitly cloning with `.map()`
--> $DIR/map_clone.rs:78:13 --> $DIR/map_clone.rs:79:13
|
LL | let y = x.map(|x| u32::clone(x));
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `copied` method: `x.copied()`
error: you are explicitly cloning with `.map()`
--> $DIR/map_clone.rs:82:13
|
LL | let y = x.map(|x| Clone::clone(x));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `copied` method: `x.copied()`
error: you are explicitly cloning with `.map()`
--> $DIR/map_clone.rs:94:13
| |
LL | let y = x.map(|x| String::clone(x)); LL | let y = x.map(|x| String::clone(x));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `x.cloned()` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `x.cloned()`
error: you are explicitly cloning with `.map()` error: you are explicitly cloning with `.map()`
--> $DIR/map_clone.rs:80:13 --> $DIR/map_clone.rs:97:13
| |
LL | let y = x.map(|x| String::clone(x)); LL | let y = x.map(|x| Clone::clone(x));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `x.cloned()` | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `x.cloned()`
error: aborting due to 11 previous errors error: you are explicitly cloning with `.map()`
--> $DIR/map_clone.rs:103:13
|
LL | let y = x.map(|x| u32::clone(x));
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `copied` method: `x.copied()`
error: you are explicitly cloning with `.map()`
--> $DIR/map_clone.rs:106:13
|
LL | let y = x.map(|x| Clone::clone(x));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `copied` method: `x.copied()`
error: aborting due to 15 previous errors