about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--clippy_lints/src/methods/clear_with_drain.rs2
-rw-r--r--tests/ui/clear_with_drain.fixed40
-rw-r--r--tests/ui/clear_with_drain.rs1
-rw-r--r--tests/ui/clear_with_drain.stderr28
4 files changed, 69 insertions, 2 deletions
diff --git a/clippy_lints/src/methods/clear_with_drain.rs b/clippy_lints/src/methods/clear_with_drain.rs
index ac6c0e57257..bf7e7d12405 100644
--- a/clippy_lints/src/methods/clear_with_drain.rs
+++ b/clippy_lints/src/methods/clear_with_drain.rs
@@ -10,8 +10,6 @@ use rustc_span::Span;
 
 use super::CLEAR_WITH_DRAIN;
 
-// TODO: Adjust the parameters as necessary
-// see clippy_lints/src/methods/mod.rs to add call to this check in `check_methods`
 pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, recv: &Expr<'_>, span: Span, arg: &Expr<'_>) {
     let ty = cx.typeck_results().expr_ty(recv);
     if is_type_diagnostic_item(cx, ty, sym::Vec) && let Some(range) = Range::hir(arg) && is_range_full(cx, recv, range)
diff --git a/tests/ui/clear_with_drain.fixed b/tests/ui/clear_with_drain.fixed
new file mode 100644
index 00000000000..62b0af08eea
--- /dev/null
+++ b/tests/ui/clear_with_drain.fixed
@@ -0,0 +1,40 @@
+// run-rustfix
+#![allow(unused)]
+#![warn(clippy::clear_with_drain)]
+
+fn range() {
+    let (mut u, mut v) = (vec![1, 2, 3], vec![1, 2, 3]);
+    let iter = u.drain(0..u.len()); // Yay
+    v.clear(); // Nay
+}
+
+fn range_from() {
+    let (mut u, mut v) = (vec![1, 2, 3], vec![1, 2, 3]);
+    let iter = u.drain(0..); // Yay
+    v.clear(); // Nay
+}
+
+fn range_full() {
+    let (mut u, mut v) = (vec![1, 2, 3], vec![1, 2, 3]);
+    let iter = u.drain(..); // Yay
+    v.clear(); // Nay
+}
+
+fn range_to() {
+    let (mut u, mut v) = (vec![1, 2, 3], vec![1, 2, 3]);
+    let iter = u.drain(..u.len()); // Yay
+    v.clear(); // Nay
+}
+
+fn partial_drains() {
+    let mut v = vec![1, 2, 3];
+    v.drain(1..); // Yay
+
+    let mut v = vec![1, 2, 3];
+    v.drain(..v.len() - 1); // Yay
+
+    let mut v = vec![1, 2, 3];
+    v.drain(1..v.len() - 1); // Yay
+}
+
+fn main() {}
diff --git a/tests/ui/clear_with_drain.rs b/tests/ui/clear_with_drain.rs
index 28119deaebb..721af7d2ea7 100644
--- a/tests/ui/clear_with_drain.rs
+++ b/tests/ui/clear_with_drain.rs
@@ -1,3 +1,4 @@
+// run-rustfix
 #![allow(unused)]
 #![warn(clippy::clear_with_drain)]
 
diff --git a/tests/ui/clear_with_drain.stderr b/tests/ui/clear_with_drain.stderr
new file mode 100644
index 00000000000..0d6d8263e10
--- /dev/null
+++ b/tests/ui/clear_with_drain.stderr
@@ -0,0 +1,28 @@
+error: `drain` used to clear a `Vec`
+  --> $DIR/clear_with_drain.rs:8:7
+   |
+LL |     v.drain(0..v.len()); // Nay
+   |       ^^^^^^^^^^^^^^^^^ help: try: `clear()`
+   |
+   = note: `-D clippy::clear-with-drain` implied by `-D warnings`
+
+error: `drain` used to clear a `Vec`
+  --> $DIR/clear_with_drain.rs:14:7
+   |
+LL |     v.drain(0..); // Nay
+   |       ^^^^^^^^^^ help: try: `clear()`
+
+error: `drain` used to clear a `Vec`
+  --> $DIR/clear_with_drain.rs:20:7
+   |
+LL |     v.drain(..); // Nay
+   |       ^^^^^^^^^ help: try: `clear()`
+
+error: `drain` used to clear a `Vec`
+  --> $DIR/clear_with_drain.rs:26:7
+   |
+LL |     v.drain(..v.len()); // Nay
+   |       ^^^^^^^^^^^^^^^^ help: try: `clear()`
+
+error: aborting due to 4 previous errors
+