about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-03-27 11:41:48 +0000
committerbors <bors@rust-lang.org>2023-03-27 11:41:48 +0000
commit70db22648bb1a79d2f6978adf6dc40240de59d89 (patch)
treefb461671482457b200d06b3e4eefe874e07be22a /tests
parent5698f43f9482809c9a3c8a9356583b83d5acf580 (diff)
parentdf65d21f4c98a19573f1cd89d9ff01ee8812cf43 (diff)
downloadrust-70db22648bb1a79d2f6978adf6dc40240de59d89.tar.gz
rust-70db22648bb1a79d2f6978adf6dc40240de59d89.zip
Auto merge of #10528 - bluthej:clear-with-drain, r=llogiq
Clear with drain

changelog: [`clear_with_drain`]: Add new lint

Fixes #9339
Diffstat (limited to 'tests')
-rw-r--r--tests/ui/clear_with_drain.fixed86
-rw-r--r--tests/ui/clear_with_drain.rs86
-rw-r--r--tests/ui/clear_with_drain.stderr40
3 files changed, 212 insertions, 0 deletions
diff --git a/tests/ui/clear_with_drain.fixed b/tests/ui/clear_with_drain.fixed
new file mode 100644
index 00000000000..9c4dc010ca7
--- /dev/null
+++ b/tests/ui/clear_with_drain.fixed
@@ -0,0 +1,86 @@
+// run-rustfix
+#![allow(unused)]
+#![warn(clippy::clear_with_drain)]
+
+fn range() {
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(0..v.len()); // Yay
+
+    let mut v = vec![1, 2, 3];
+    let n = v.drain(0..v.len()).count(); // Yay
+
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(usize::MIN..v.len()); // Yay
+    let n = iter.count();
+
+    let mut v = vec![1, 2, 3];
+    v.clear(); // Nay
+
+    let mut v = vec![1, 2, 3];
+    v.clear(); // Nay
+}
+
+fn range_from() {
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(0..); // Yay
+
+    let mut v = vec![1, 2, 3];
+    let mut iter = v.drain(0..); // Yay
+    let next = iter.next();
+
+    let mut v = vec![1, 2, 3];
+    let next = v.drain(usize::MIN..).next(); // Yay
+
+    let mut v = vec![1, 2, 3];
+    v.clear(); // Nay
+
+    let mut v = vec![1, 2, 3];
+    v.clear(); // Nay
+}
+
+fn range_full() {
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(..); // Yay
+
+    let mut v = vec![1, 2, 3];
+    // Yay
+    for x in v.drain(..) {
+        let y = format!("x = {x}");
+    }
+
+    let mut v = vec![1, 2, 3];
+    v.clear(); // Nay
+}
+
+fn range_to() {
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(..v.len()); // Yay
+
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(..v.len()); // Yay
+    for x in iter {
+        let y = format!("x = {x}");
+    }
+
+    let mut v = vec![1, 2, 3];
+    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(1..).max(); // Yay
+
+    let mut v = vec![1, 2, 3];
+    v.drain(..v.len() - 1); // Yay
+    let mut v = vec![1, 2, 3];
+    v.drain(..v.len() - 1).min(); // Yay
+
+    let mut v = vec![1, 2, 3];
+    v.drain(1..v.len() - 1); // Yay
+    let mut v = vec![1, 2, 3];
+    let w: Vec<i8> = v.drain(1..v.len() - 1).collect(); // Yay
+}
+
+fn main() {}
diff --git a/tests/ui/clear_with_drain.rs b/tests/ui/clear_with_drain.rs
new file mode 100644
index 00000000000..f00dbab234c
--- /dev/null
+++ b/tests/ui/clear_with_drain.rs
@@ -0,0 +1,86 @@
+// run-rustfix
+#![allow(unused)]
+#![warn(clippy::clear_with_drain)]
+
+fn range() {
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(0..v.len()); // Yay
+
+    let mut v = vec![1, 2, 3];
+    let n = v.drain(0..v.len()).count(); // Yay
+
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(usize::MIN..v.len()); // Yay
+    let n = iter.count();
+
+    let mut v = vec![1, 2, 3];
+    v.drain(0..v.len()); // Nay
+
+    let mut v = vec![1, 2, 3];
+    v.drain(usize::MIN..v.len()); // Nay
+}
+
+fn range_from() {
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(0..); // Yay
+
+    let mut v = vec![1, 2, 3];
+    let mut iter = v.drain(0..); // Yay
+    let next = iter.next();
+
+    let mut v = vec![1, 2, 3];
+    let next = v.drain(usize::MIN..).next(); // Yay
+
+    let mut v = vec![1, 2, 3];
+    v.drain(0..); // Nay
+
+    let mut v = vec![1, 2, 3];
+    v.drain(usize::MIN..); // Nay
+}
+
+fn range_full() {
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(..); // Yay
+
+    let mut v = vec![1, 2, 3];
+    // Yay
+    for x in v.drain(..) {
+        let y = format!("x = {x}");
+    }
+
+    let mut v = vec![1, 2, 3];
+    v.drain(..); // Nay
+}
+
+fn range_to() {
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(..v.len()); // Yay
+
+    let mut v = vec![1, 2, 3];
+    let iter = v.drain(..v.len()); // Yay
+    for x in iter {
+        let y = format!("x = {x}");
+    }
+
+    let mut v = vec![1, 2, 3];
+    v.drain(..v.len()); // Nay
+}
+
+fn partial_drains() {
+    let mut v = vec![1, 2, 3];
+    v.drain(1..); // Yay
+    let mut v = vec![1, 2, 3];
+    v.drain(1..).max(); // Yay
+
+    let mut v = vec![1, 2, 3];
+    v.drain(..v.len() - 1); // Yay
+    let mut v = vec![1, 2, 3];
+    v.drain(..v.len() - 1).min(); // Yay
+
+    let mut v = vec![1, 2, 3];
+    v.drain(1..v.len() - 1); // Yay
+    let mut v = vec![1, 2, 3];
+    let w: Vec<i8> = v.drain(1..v.len() - 1).collect(); // Yay
+}
+
+fn main() {}
diff --git a/tests/ui/clear_with_drain.stderr b/tests/ui/clear_with_drain.stderr
new file mode 100644
index 00000000000..c88aa1a23cb
--- /dev/null
+++ b/tests/ui/clear_with_drain.stderr
@@ -0,0 +1,40 @@
+error: `drain` used to clear a `Vec`
+  --> $DIR/clear_with_drain.rs:17: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:20:7
+   |
+LL |     v.drain(usize::MIN..v.len()); // Nay
+   |       ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `clear()`
+
+error: `drain` used to clear a `Vec`
+  --> $DIR/clear_with_drain.rs:35:7
+   |
+LL |     v.drain(0..); // Nay
+   |       ^^^^^^^^^^ help: try: `clear()`
+
+error: `drain` used to clear a `Vec`
+  --> $DIR/clear_with_drain.rs:38:7
+   |
+LL |     v.drain(usize::MIN..); // Nay
+   |       ^^^^^^^^^^^^^^^^^^^ help: try: `clear()`
+
+error: `drain` used to clear a `Vec`
+  --> $DIR/clear_with_drain.rs:52:7
+   |
+LL |     v.drain(..); // Nay
+   |       ^^^^^^^^^ help: try: `clear()`
+
+error: `drain` used to clear a `Vec`
+  --> $DIR/clear_with_drain.rs:66:7
+   |
+LL |     v.drain(..v.len()); // Nay
+   |       ^^^^^^^^^^^^^^^^ help: try: `clear()`
+
+error: aborting due to 6 previous errors
+