about summary refs log tree commit diff
diff options
context:
space:
mode:
authorflip1995 <hello@philkrones.com>2020-04-25 20:51:23 +0200
committerflip1995 <hello@philkrones.com>2020-04-25 20:51:23 +0200
commita1826222cf5f0298353cc9f9893e86babdaac770 (patch)
treeba914623626f55233148c1de10142fd643d6b741
parenteadd9d24dcd7c84c96dcd17234b8aadf9a113bd3 (diff)
downloadrust-a1826222cf5f0298353cc9f9893e86babdaac770.tar.gz
rust-a1826222cf5f0298353cc9f9893e86babdaac770.zip
Add tests for #1654
-rw-r--r--tests/ui/while_let_on_iterator.fixed24
-rw-r--r--tests/ui/while_let_on_iterator.rs24
-rw-r--r--tests/ui/while_let_on_iterator.stderr8
3 files changed, 41 insertions, 15 deletions
diff --git a/tests/ui/while_let_on_iterator.fixed b/tests/ui/while_let_on_iterator.fixed
index 447b36048ee..f5fcabf63fd 100644
--- a/tests/ui/while_let_on_iterator.fixed
+++ b/tests/ui/while_let_on_iterator.fixed
@@ -119,10 +119,7 @@ fn issue2965() {
     let mut values = HashSet::new();
     values.insert(1);
 
-    for _ in values.iter() {
-        // FIXME(flip1995): Linting this with the following line uncommented is a FP, see #1654
-        // values.remove(&1);
-    }
+    while let Some(..) = values.iter().next() {}
 }
 
 fn issue3670() {
@@ -134,6 +131,24 @@ fn issue3670() {
     }
 }
 
+fn issue1654() {
+    // should not lint if the iterator is generated on every iteration
+    use std::collections::HashSet;
+    let mut values = HashSet::new();
+    values.insert(1);
+
+    while let Some(..) = values.iter().next() {
+        values.remove(&1);
+    }
+
+    while let Some(..) = values.iter().map(|x| x + 1).next() {}
+
+    let chars = "Hello, World!".char_indices();
+    while let Some((i, ch)) = chars.clone().next() {
+        println!("{}: {}", i, ch);
+    }
+}
+
 fn main() {
     base();
     refutable();
@@ -141,4 +156,5 @@ fn main() {
     issue1121();
     issue2965();
     issue3670();
+    issue1654();
 }
diff --git a/tests/ui/while_let_on_iterator.rs b/tests/ui/while_let_on_iterator.rs
index 56a245aa8c7..04dce8a0289 100644
--- a/tests/ui/while_let_on_iterator.rs
+++ b/tests/ui/while_let_on_iterator.rs
@@ -119,10 +119,7 @@ fn issue2965() {
     let mut values = HashSet::new();
     values.insert(1);
 
-    while let Some(..) = values.iter().next() {
-        // FIXME(flip1995): Linting this with the following line uncommented is a FP, see #1654
-        // values.remove(&1);
-    }
+    while let Some(..) = values.iter().next() {}
 }
 
 fn issue3670() {
@@ -134,6 +131,24 @@ fn issue3670() {
     }
 }
 
+fn issue1654() {
+    // should not lint if the iterator is generated on every iteration
+    use std::collections::HashSet;
+    let mut values = HashSet::new();
+    values.insert(1);
+
+    while let Some(..) = values.iter().next() {
+        values.remove(&1);
+    }
+
+    while let Some(..) = values.iter().map(|x| x + 1).next() {}
+
+    let chars = "Hello, World!".char_indices();
+    while let Some((i, ch)) = chars.clone().next() {
+        println!("{}: {}", i, ch);
+    }
+}
+
 fn main() {
     base();
     refutable();
@@ -141,4 +156,5 @@ fn main() {
     issue1121();
     issue2965();
     issue3670();
+    issue1654();
 }
diff --git a/tests/ui/while_let_on_iterator.stderr b/tests/ui/while_let_on_iterator.stderr
index 94caedb43a5..6de138d7227 100644
--- a/tests/ui/while_let_on_iterator.stderr
+++ b/tests/ui/while_let_on_iterator.stderr
@@ -24,11 +24,5 @@ error: this loop could be written as a `for` loop
 LL |         while let Some(_) = y.next() {
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for _ in y`
 
-error: this loop could be written as a `for` loop
-  --> $DIR/while_let_on_iterator.rs:122:5
-   |
-LL |     while let Some(..) = values.iter().next() {
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for _ in values.iter()`
-
-error: aborting due to 5 previous errors
+error: aborting due to 4 previous errors