about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKartavya Vashishtha <sendtokartavya@gmail.com>2022-11-12 20:36:30 +0530
committerKartavya Vashishtha <sendtokartavya@gmail.com>2022-11-12 20:36:30 +0530
commit989986144c889051eb3014cc1fdc0891bbb483f5 (patch)
tree52fd50e8ba911304a37b8379096596116352de9f
parentcad0d3d6da87b6e34a973a6dd6b34cfedeab3ea6 (diff)
downloadrust-989986144c889051eb3014cc1fdc0891bbb483f5.tar.gz
rust-989986144c889051eb3014cc1fdc0891bbb483f5.zip
fix never_loop false positive
on unconditional break to internal labeled block

ref #9831
-rw-r--r--clippy_lints/src/loops/never_loop.rs3
-rw-r--r--tests/ui/never_loop.rs12
2 files changed, 14 insertions, 1 deletions
diff --git a/clippy_lints/src/loops/never_loop.rs b/clippy_lints/src/loops/never_loop.rs
index 16b00ad6637..abb18187ef1 100644
--- a/clippy_lints/src/loops/never_loop.rs
+++ b/clippy_lints/src/loops/never_loop.rs
@@ -169,7 +169,8 @@ fn never_loop_expr(expr: &Expr<'_>, main_loop_id: HirId) -> NeverLoopResult {
                 combine_seq(e, arms)
             }
         },
-        ExprKind::Block(b, _) => never_loop_block(b, main_loop_id),
+        ExprKind::Block(b, None) => never_loop_block(b, main_loop_id),
+        ExprKind::Block(b, Some(_label)) => absorb_break(never_loop_block(b, main_loop_id)),
         ExprKind::Continue(d) => {
             let id = d
                 .target_id
diff --git a/tests/ui/never_loop.rs b/tests/ui/never_loop.rs
index 3dbef19890e..86a5d03f765 100644
--- a/tests/ui/never_loop.rs
+++ b/tests/ui/never_loop.rs
@@ -229,6 +229,18 @@ pub fn test18() {
     };
 }
 
+// Issue #9831: unconditional break to internal labeled block
+pub fn test19() {
+    fn thing(iter: impl Iterator) {
+        for _ in iter {
+            'b: {
+                // error goes away if we just have the block's value be ().
+                break 'b;
+            }
+        }
+    }
+}
+
 fn main() {
     test1();
     test2();