about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2023-02-14 09:12:51 +0100
committerSamuel Tardieu <sam@rfc1149.net>2023-02-14 09:23:04 +0100
commite9dffa391085f4b3c84f90e8ab82bdd568d1f17e (patch)
tree26aea6ceeff5dfd6e7e6f0bc43db5ea8a532b82c
parent1fec2927c5cf02de85c08a63dbc8909077661d1b (diff)
downloadrust-e9dffa391085f4b3c84f90e8ab82bdd568d1f17e.tar.gz
rust-e9dffa391085f4b3c84f90e8ab82bdd568d1f17e.zip
Fix a bug in never_loop when anonymous blocks are nested in named blocks
The following code

```
loop {
    'a: {
        { }
        break 'a;
    }
}
```

was detected as a never-looping loop.
-rw-r--r--clippy_lints/src/loops/never_loop.rs4
-rw-r--r--tests/ui/never_loop.rs9
2 files changed, 12 insertions, 1 deletions
diff --git a/clippy_lints/src/loops/never_loop.rs b/clippy_lints/src/loops/never_loop.rs
index 9d16949c81f..3cb5b1ffc7b 100644
--- a/clippy_lints/src/loops/never_loop.rs
+++ b/clippy_lints/src/loops/never_loop.rs
@@ -163,7 +163,9 @@ fn never_loop_expr(expr: &Expr<'_>, ignore_ids: &mut Vec<HirId>, main_loop_id: H
                 ignore_ids.push(b.hir_id);
             }
             let ret = never_loop_block(b, ignore_ids, main_loop_id);
-            ignore_ids.pop();
+            if l.is_some() {
+                ignore_ids.pop();
+            }
             ret
         },
         ExprKind::Continue(d) => {
diff --git a/tests/ui/never_loop.rs b/tests/ui/never_loop.rs
index 28e8f459d44..a177d5e06aa 100644
--- a/tests/ui/never_loop.rs
+++ b/tests/ui/never_loop.rs
@@ -250,6 +250,15 @@ pub fn test20() {
     }
 }
 
+pub fn test21() {
+    loop {
+        'a: {
+            { }
+            break 'a;
+        }
+    }
+}
+
 fn main() {
     test1();
     test2();