From 667223c35d9be21e91a9ffbe626213767c066dda Mon Sep 17 00:00:00 2001 From: Shotaro Yamada Date: Tue, 10 Sep 2019 11:56:34 +0900 Subject: [PATCH] Add run-rustfix --- clippy_lints/src/redundant_clone.rs | 10 +- tests/ui/redundant_clone.fixed | 132 ++++++++++++++++++++++++ tests/ui/redundant_clone.rs | 56 +++++----- tests/ui/redundant_clone.stderr | 152 ++++++++++++++-------------- 4 files changed, 247 insertions(+), 103 deletions(-) create mode 100644 tests/ui/redundant_clone.fixed diff --git a/clippy_lints/src/redundant_clone.rs b/clippy_lints/src/redundant_clone.rs index ad8ed568656..965f6bac62a 100644 --- a/clippy_lints/src/redundant_clone.rs +++ b/clippy_lints/src/redundant_clone.rs @@ -208,13 +208,21 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RedundantClone { let sugg_span = span.with_lo( span.lo() + BytePos(u32::try_from(dot).unwrap()) ); + let mut app = Applicability::MaybeIncorrect; + let mut call_snip = &snip[dot + 1..]; + if call_snip.ends_with("()") { + call_snip = call_snip[..call_snip.len()-2].trim(); + if call_snip.as_bytes().iter().all(|b| b.is_ascii_alphabetic() || *b == b'_') { + app = Applicability::MachineApplicable; + } + } span_lint_hir_and_then(cx, REDUNDANT_CLONE, node, sugg_span, "redundant clone", |db| { db.span_suggestion( sugg_span, "remove this", String::new(), - Applicability::MaybeIncorrect, + app, ); db.span_note( span.with_hi(span.lo() + BytePos(u32::try_from(dot).unwrap())), diff --git a/tests/ui/redundant_clone.fixed b/tests/ui/redundant_clone.fixed new file mode 100644 index 00000000000..614a9bf4d90 --- /dev/null +++ b/tests/ui/redundant_clone.fixed @@ -0,0 +1,132 @@ +// run-rustfix +// rustfix-only-machine-applicable +use std::ffi::OsString; +use std::path::Path; + +fn main() { + let _s = ["lorem", "ipsum"].join(" "); + + let s = String::from("foo"); + let _s = s; + + let s = String::from("foo"); + let _s = s; + + let s = String::from("foo"); + let _s = s; + + let _s = Path::new("/a/b/").join("c"); + + let _s = Path::new("/a/b/").join("c"); + + let _s = OsString::new(); + + let _s = OsString::new(); + + // Check that lint level works + #[allow(clippy::redundant_clone)] + let _s = String::new().to_string(); + + let tup = (String::from("foo"),); + let _t = tup.0; + + let tup_ref = &(String::from("foo"),); + let _s = tup_ref.0.clone(); // this `.clone()` cannot be removed + + { + let x = String::new(); + let y = &x; + + let _x = x.clone(); // ok; `x` is borrowed by `y` + + let _ = y.len(); + } + + let x = (String::new(),); + let _ = Some(String::new()).unwrap_or_else(|| x.0.clone()); // ok; closure borrows `x` + + with_branch(Alpha, true); + cannot_move_from_type_with_drop(); + borrower_propagation(); +} + +#[derive(Clone)] +struct Alpha; +fn with_branch(a: Alpha, b: bool) -> (Alpha, Alpha) { + if b { + (a.clone(), a) + } else { + (Alpha, a) + } +} + +struct TypeWithDrop { + x: String, +} + +impl Drop for TypeWithDrop { + fn drop(&mut self) {} +} + +fn cannot_move_from_type_with_drop() -> String { + let s = TypeWithDrop { x: String::new() }; + s.x.clone() // removing this `clone()` summons E0509 +} + +fn borrower_propagation() { + let s = String::new(); + let t = String::new(); + + { + fn b() -> bool { + unimplemented!() + } + let _u = if b() { &s } else { &t }; + + // ok; `s` and `t` are possibly borrowed + let _s = s.clone(); + let _t = t.clone(); + } + + { + let _u = || s.len(); + let _v = [&t; 32]; + let _s = s.clone(); // ok + let _t = t.clone(); // ok + } + + { + let _u = { + let u = Some(&s); + let _ = s.clone(); // ok + u + }; + let _s = s.clone(); // ok + } + + { + use std::convert::identity as id; + let _u = id(id(&s)); + let _s = s.clone(); // ok, `u` borrows `s` + } + + let _s = s; + let _t = t; + + #[derive(Clone)] + struct Foo { + x: usize, + } + + { + let f = Foo { x: 123 }; + let _x = Some(f.x); + let _f = f; + } + + { + let f = Foo { x: 123 }; + let _x = &f.x; + let _f = f.clone(); // ok + } +} diff --git a/tests/ui/redundant_clone.rs b/tests/ui/redundant_clone.rs index 4e38a5c924c..48687c82c2f 100644 --- a/tests/ui/redundant_clone.rs +++ b/tests/ui/redundant_clone.rs @@ -1,34 +1,34 @@ -#![warn(clippy::redundant_clone)] - +// run-rustfix +// rustfix-only-machine-applicable use std::ffi::OsString; use std::path::Path; fn main() { - let _ = ["lorem", "ipsum"].join(" ").to_string(); + let _s = ["lorem", "ipsum"].join(" ").to_string(); let s = String::from("foo"); - let _ = s.clone(); + let _s = s.clone(); let s = String::from("foo"); - let _ = s.to_string(); + let _s = s.to_string(); let s = String::from("foo"); - let _ = s.to_owned(); + let _s = s.to_owned(); - let _ = Path::new("/a/b/").join("c").to_owned(); + let _s = Path::new("/a/b/").join("c").to_owned(); - let _ = Path::new("/a/b/").join("c").to_path_buf(); + let _s = Path::new("/a/b/").join("c").to_path_buf(); - let _ = OsString::new().to_owned(); + let _s = OsString::new().to_owned(); - let _ = OsString::new().to_os_string(); + let _s = OsString::new().to_os_string(); // Check that lint level works #[allow(clippy::redundant_clone)] - let _ = String::new().to_string(); + let _s = String::new().to_string(); let tup = (String::from("foo"),); - let _ = tup.0.clone(); + let _t = tup.0.clone(); let tup_ref = &(String::from("foo"),); let _s = tup_ref.0.clone(); // this `.clone()` cannot be removed @@ -37,13 +37,17 @@ fn main() { let x = String::new(); let y = &x; - let _ = x.clone(); // ok; `x` is borrowed by `y` + let _x = x.clone(); // ok; `x` is borrowed by `y` let _ = y.len(); } let x = (String::new(),); let _ = Some(String::new()).unwrap_or_else(|| x.0.clone()); // ok; closure borrows `x` + + with_branch(Alpha, true); + cannot_move_from_type_with_drop(); + borrower_propagation(); } #[derive(Clone)] @@ -77,37 +81,37 @@ fn borrower_propagation() { fn b() -> bool { unimplemented!() } - let u = if b() { &s } else { &t }; + let _u = if b() { &s } else { &t }; // ok; `s` and `t` are possibly borrowed - let _ = s.clone(); - let _ = t.clone(); + let _s = s.clone(); + let _t = t.clone(); } { - let u = || s.len(); - let v = [&t; 32]; - let _ = s.clone(); // ok - let _ = t.clone(); // ok + let _u = || s.len(); + let _v = [&t; 32]; + let _s = s.clone(); // ok + let _t = t.clone(); // ok } { - let u = { + let _u = { let u = Some(&s); let _ = s.clone(); // ok u }; - let _ = s.clone(); // ok + let _s = s.clone(); // ok } { use std::convert::identity as id; - let u = id(id(&s)); - let _ = s.clone(); // ok, `u` borrows `s` + let _u = id(id(&s)); + let _s = s.clone(); // ok, `u` borrows `s` } - let _ = s.clone(); - let _ = t.clone(); + let _s = s.clone(); + let _t = t.clone(); #[derive(Clone)] struct Foo { diff --git a/tests/ui/redundant_clone.stderr b/tests/ui/redundant_clone.stderr index d1bc7e44fda..feafbd78b4e 100644 --- a/tests/ui/redundant_clone.stderr +++ b/tests/ui/redundant_clone.stderr @@ -1,156 +1,156 @@ error: redundant clone - --> $DIR/redundant_clone.rs:7:41 + --> $DIR/redundant_clone.rs:7:42 | -LL | let _ = ["lorem", "ipsum"].join(" ").to_string(); - | ^^^^^^^^^^^^ help: remove this +LL | let _s = ["lorem", "ipsum"].join(" ").to_string(); + | ^^^^^^^^^^^^ help: remove this | = note: `-D clippy::redundant-clone` implied by `-D warnings` note: this value is dropped without further use - --> $DIR/redundant_clone.rs:7:13 + --> $DIR/redundant_clone.rs:7:14 | -LL | let _ = ["lorem", "ipsum"].join(" ").to_string(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | let _s = ["lorem", "ipsum"].join(" ").to_string(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: redundant clone + --> $DIR/redundant_clone.rs:10:15 + | +LL | let _s = s.clone(); + | ^^^^^^^^ help: remove this + | +note: this value is dropped without further use --> $DIR/redundant_clone.rs:10:14 | -LL | let _ = s.clone(); - | ^^^^^^^^ help: remove this - | -note: this value is dropped without further use - --> $DIR/redundant_clone.rs:10:13 - | -LL | let _ = s.clone(); - | ^ +LL | let _s = s.clone(); + | ^ error: redundant clone + --> $DIR/redundant_clone.rs:13:15 + | +LL | let _s = s.to_string(); + | ^^^^^^^^^^^^ help: remove this + | +note: this value is dropped without further use --> $DIR/redundant_clone.rs:13:14 | -LL | let _ = s.to_string(); - | ^^^^^^^^^^^^ help: remove this - | -note: this value is dropped without further use - --> $DIR/redundant_clone.rs:13:13 - | -LL | let _ = s.to_string(); - | ^ +LL | let _s = s.to_string(); + | ^ error: redundant clone + --> $DIR/redundant_clone.rs:16:15 + | +LL | let _s = s.to_owned(); + | ^^^^^^^^^^^ help: remove this + | +note: this value is dropped without further use --> $DIR/redundant_clone.rs:16:14 | -LL | let _ = s.to_owned(); - | ^^^^^^^^^^^ help: remove this - | -note: this value is dropped without further use - --> $DIR/redundant_clone.rs:16:13 - | -LL | let _ = s.to_owned(); - | ^ +LL | let _s = s.to_owned(); + | ^ error: redundant clone - --> $DIR/redundant_clone.rs:18:41 + --> $DIR/redundant_clone.rs:18:42 | -LL | let _ = Path::new("/a/b/").join("c").to_owned(); - | ^^^^^^^^^^^ help: remove this +LL | let _s = Path::new("/a/b/").join("c").to_owned(); + | ^^^^^^^^^^^ help: remove this | note: this value is dropped without further use - --> $DIR/redundant_clone.rs:18:13 + --> $DIR/redundant_clone.rs:18:14 | -LL | let _ = Path::new("/a/b/").join("c").to_owned(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | let _s = Path::new("/a/b/").join("c").to_owned(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: redundant clone - --> $DIR/redundant_clone.rs:20:41 + --> $DIR/redundant_clone.rs:20:42 | -LL | let _ = Path::new("/a/b/").join("c").to_path_buf(); - | ^^^^^^^^^^^^^^ help: remove this +LL | let _s = Path::new("/a/b/").join("c").to_path_buf(); + | ^^^^^^^^^^^^^^ help: remove this | note: this value is dropped without further use - --> $DIR/redundant_clone.rs:20:13 + --> $DIR/redundant_clone.rs:20:14 | -LL | let _ = Path::new("/a/b/").join("c").to_path_buf(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | let _s = Path::new("/a/b/").join("c").to_path_buf(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: redundant clone - --> $DIR/redundant_clone.rs:22:28 + --> $DIR/redundant_clone.rs:22:29 | -LL | let _ = OsString::new().to_owned(); - | ^^^^^^^^^^^ help: remove this +LL | let _s = OsString::new().to_owned(); + | ^^^^^^^^^^^ help: remove this | note: this value is dropped without further use - --> $DIR/redundant_clone.rs:22:13 + --> $DIR/redundant_clone.rs:22:14 | -LL | let _ = OsString::new().to_owned(); - | ^^^^^^^^^^^^^^^ +LL | let _s = OsString::new().to_owned(); + | ^^^^^^^^^^^^^^^ error: redundant clone - --> $DIR/redundant_clone.rs:24:28 + --> $DIR/redundant_clone.rs:24:29 | -LL | let _ = OsString::new().to_os_string(); - | ^^^^^^^^^^^^^^^ help: remove this +LL | let _s = OsString::new().to_os_string(); + | ^^^^^^^^^^^^^^^ help: remove this | note: this value is dropped without further use - --> $DIR/redundant_clone.rs:24:13 + --> $DIR/redundant_clone.rs:24:14 | -LL | let _ = OsString::new().to_os_string(); - | ^^^^^^^^^^^^^^^ +LL | let _s = OsString::new().to_os_string(); + | ^^^^^^^^^^^^^^^ error: redundant clone - --> $DIR/redundant_clone.rs:31:18 + --> $DIR/redundant_clone.rs:31:19 | -LL | let _ = tup.0.clone(); - | ^^^^^^^^ help: remove this +LL | let _t = tup.0.clone(); + | ^^^^^^^^ help: remove this | note: this value is dropped without further use - --> $DIR/redundant_clone.rs:31:13 + --> $DIR/redundant_clone.rs:31:14 | -LL | let _ = tup.0.clone(); - | ^^^^^ +LL | let _t = tup.0.clone(); + | ^^^^^ error: redundant clone - --> $DIR/redundant_clone.rs:53:22 + --> $DIR/redundant_clone.rs:57:22 | LL | (a.clone(), a.clone()) | ^^^^^^^^ help: remove this | note: this value is dropped without further use - --> $DIR/redundant_clone.rs:53:21 + --> $DIR/redundant_clone.rs:57:21 | LL | (a.clone(), a.clone()) | ^ error: redundant clone - --> $DIR/redundant_clone.rs:109:14 + --> $DIR/redundant_clone.rs:113:15 | -LL | let _ = s.clone(); - | ^^^^^^^^ help: remove this +LL | let _s = s.clone(); + | ^^^^^^^^ help: remove this | note: this value is dropped without further use - --> $DIR/redundant_clone.rs:109:13 + --> $DIR/redundant_clone.rs:113:14 | -LL | let _ = s.clone(); - | ^ +LL | let _s = s.clone(); + | ^ error: redundant clone - --> $DIR/redundant_clone.rs:110:14 + --> $DIR/redundant_clone.rs:114:15 | -LL | let _ = t.clone(); - | ^^^^^^^^ help: remove this +LL | let _t = t.clone(); + | ^^^^^^^^ help: remove this | note: this value is dropped without further use - --> $DIR/redundant_clone.rs:110:13 + --> $DIR/redundant_clone.rs:114:14 | -LL | let _ = t.clone(); - | ^ +LL | let _t = t.clone(); + | ^ error: redundant clone - --> $DIR/redundant_clone.rs:120:19 + --> $DIR/redundant_clone.rs:124:19 | LL | let _f = f.clone(); | ^^^^^^^^ help: remove this | note: this value is dropped without further use - --> $DIR/redundant_clone.rs:120:18 + --> $DIR/redundant_clone.rs:124:18 | LL | let _f = f.clone(); | ^