about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-11-13 15:44:14 +0000
committerbors <bors@rust-lang.org>2022-11-13 15:44:14 +0000
commita5995279fb896c87b94cef1f34fb4a17d87eaae7 (patch)
tree0776586ed3d656f041a068f8716e2c33bb07f4f0
parent493b78885abfcc8daadf0603c34d63258f412c97 (diff)
parent989986144c889051eb3014cc1fdc0891bbb483f5 (diff)
downloadrust-a5995279fb896c87b94cef1f34fb4a17d87eaae7.tar.gz
rust-a5995279fb896c87b94cef1f34fb4a17d87eaae7.zip
Auto merge of #9837 - DesmondWillowbrook:never_loop, r=dswij
fix never_loop false positive

fixes #9831

changelog: [`never_loop`]: fixed false positive on unconditional break in internal labeled block
-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();