|  | #![feature(try_blocks)] | 
|  | #![allow( | 
|  | clippy::eq_op, | 
|  | clippy::single_match, | 
|  | unused_assignments, | 
|  | unused_variables, | 
|  | clippy::while_immutable_condition | 
|  | )] | 
|  | //@no-rustfix | 
|  | fn test1() { | 
|  | let mut x = 0; | 
|  | loop { | 
|  | //~^ never_loop | 
|  |  | 
|  | // clippy::never_loop | 
|  | x += 1; | 
|  | if x == 1 { | 
|  | return; | 
|  | } | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | fn test2() { | 
|  | let mut x = 0; | 
|  | loop { | 
|  | x += 1; | 
|  | if x == 1 { | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | fn test3() { | 
|  | let mut x = 0; | 
|  | loop { | 
|  | //~^ never_loop | 
|  |  | 
|  | // never loops | 
|  | x += 1; | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | fn test4() { | 
|  | let mut x = 1; | 
|  | loop { | 
|  | x += 1; | 
|  | match x { | 
|  | 5 => return, | 
|  | _ => (), | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | fn test5() { | 
|  | let i = 0; | 
|  | loop { | 
|  | //~^ never_loop | 
|  |  | 
|  | // never loops | 
|  | while i == 0 { | 
|  | //~^ never_loop | 
|  |  | 
|  | // never loops | 
|  | break; | 
|  | } | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | fn test6() { | 
|  | let mut x = 0; | 
|  | 'outer: loop { | 
|  | x += 1; | 
|  | loop { | 
|  | //~^ never_loop | 
|  |  | 
|  | // never loops | 
|  | if x == 5 { | 
|  | break; | 
|  | } | 
|  | continue 'outer; | 
|  | } | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | fn test7() { | 
|  | let mut x = 0; | 
|  | loop { | 
|  | x += 1; | 
|  | match x { | 
|  | 1 => continue, | 
|  | _ => (), | 
|  | } | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | fn test8() { | 
|  | let mut x = 0; | 
|  | loop { | 
|  | x += 1; | 
|  | match x { | 
|  | 5 => return, | 
|  | _ => continue, | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | fn test9() { | 
|  | let x = Some(1); | 
|  | while let Some(y) = x { | 
|  | //~^ never_loop | 
|  |  | 
|  | // never loops | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | fn test10() { | 
|  | for x in 0..10 { | 
|  | //~^ never_loop | 
|  |  | 
|  | // never loops | 
|  | match x { | 
|  | 1 => break, | 
|  | _ => return, | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | fn test11<F: FnMut() -> i32>(mut f: F) { | 
|  | loop { | 
|  | return match f() { | 
|  | 1 => continue, | 
|  | _ => (), | 
|  | }; | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test12(a: bool, b: bool) { | 
|  | 'label: loop { | 
|  | loop { | 
|  | if a { | 
|  | continue 'label; | 
|  | } | 
|  | if b { | 
|  | break; | 
|  | } | 
|  | } | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test13() { | 
|  | let mut a = true; | 
|  | loop { | 
|  | // infinite loop | 
|  | while a { | 
|  | if true { | 
|  | a = false; | 
|  | continue; | 
|  | } | 
|  | return; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test14() { | 
|  | let mut a = true; | 
|  | 'outer: while a { | 
|  | //~^ never_loop | 
|  |  | 
|  | // never loops | 
|  | while a { | 
|  | if a { | 
|  | a = false; | 
|  | continue; | 
|  | } | 
|  | } | 
|  | break 'outer; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Issue #1991: the outer loop should not warn. | 
|  | pub fn test15() { | 
|  | 'label: loop { | 
|  | while false { | 
|  | //~^ never_loop | 
|  |  | 
|  | break 'label; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // Issue #4058: `continue` in `break` expression | 
|  | pub fn test16() { | 
|  | let mut n = 1; | 
|  | loop { | 
|  | break if n != 5 { | 
|  | n += 1; | 
|  | continue; | 
|  | }; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Issue #9001: `continue` in struct expression fields | 
|  | pub fn test17() { | 
|  | struct Foo { | 
|  | f: (), | 
|  | } | 
|  |  | 
|  | let mut n = 0; | 
|  | let _ = loop { | 
|  | break Foo { | 
|  | f: if n < 5 { | 
|  | n += 1; | 
|  | continue; | 
|  | }, | 
|  | }; | 
|  | }; | 
|  | } | 
|  |  | 
|  | // Issue #9356: `continue` in else branch of let..else | 
|  | pub fn test18() { | 
|  | let x = Some(0); | 
|  | let y = 0; | 
|  | // might loop | 
|  | let _ = loop { | 
|  | let Some(x) = x else { | 
|  | if y > 0 { | 
|  | continue; | 
|  | } else { | 
|  | return; | 
|  | } | 
|  | }; | 
|  |  | 
|  | break x; | 
|  | }; | 
|  | // never loops | 
|  | let _ = loop { | 
|  | //~^ never_loop | 
|  |  | 
|  | let Some(x) = x else { | 
|  | return; | 
|  | }; | 
|  |  | 
|  | break x; | 
|  | }; | 
|  | } | 
|  |  | 
|  | // Issue #9831: unconditional break to internal labeled block | 
|  | pub fn test19() { | 
|  | fn thing(iter: impl Iterator) { | 
|  | for _ in iter { | 
|  | 'b: { | 
|  | break 'b; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test20() { | 
|  | 'a: loop { | 
|  | //~^ never_loop | 
|  |  | 
|  | 'b: { | 
|  | break 'b 'c: { | 
|  | break 'a; | 
|  | //~^ diverging_sub_expression | 
|  | }; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test21() { | 
|  | loop { | 
|  | 'a: { | 
|  | {} | 
|  | break 'a; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // Issue 10304: code after break from block was not considered | 
|  | // unreachable code and was considered for further analysis of | 
|  | // whether the loop would ever be executed or not. | 
|  | pub fn test22() { | 
|  | for _ in 0..10 { | 
|  | 'block: { | 
|  | break 'block; | 
|  | return; | 
|  | } | 
|  | println!("looped"); | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test23() { | 
|  | for _ in 0..10 { | 
|  | 'block: { | 
|  | for _ in 0..20 { | 
|  | //~^ never_loop | 
|  |  | 
|  | break 'block; | 
|  | } | 
|  | } | 
|  | println!("looped"); | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test24() { | 
|  | 'a: for _ in 0..10 { | 
|  | 'b: { | 
|  | let x = Some(1); | 
|  | match x { | 
|  | None => break 'a, | 
|  | Some(_) => break 'b, | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // Do not lint, we can evaluate `true` to always succeed thus can short-circuit before the `return` | 
|  | pub fn test25() { | 
|  | loop { | 
|  | 'label: { | 
|  | if const { true } { | 
|  | break 'label; | 
|  | } | 
|  | return; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test26() { | 
|  | loop { | 
|  | 'label: { | 
|  | if 1 == 1 { | 
|  | break 'label; | 
|  | } | 
|  | return; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test27() { | 
|  | loop { | 
|  | 'label: { | 
|  | let x = true; | 
|  | if x { | 
|  | break 'label; | 
|  | } | 
|  | return; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // issue 11004 | 
|  | pub fn test29() { | 
|  | loop { | 
|  | 'label: { | 
|  | if true { | 
|  | break 'label; | 
|  | } | 
|  | return; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test30() { | 
|  | 'a: loop { | 
|  | 'b: { | 
|  | for j in 0..2 { | 
|  | if j == 1 { | 
|  | break 'b; | 
|  | } | 
|  | } | 
|  | break 'a; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test31(b: bool) { | 
|  | 'a: loop { | 
|  | 'b: { | 
|  | 'c: loop { | 
|  | //~^ never_loop | 
|  |  | 
|  | if b { break 'c } else { break 'b } | 
|  | } | 
|  | continue 'a; | 
|  | } | 
|  | break 'a; | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn test32() { | 
|  | loop { | 
|  | //~^ never_loop | 
|  |  | 
|  | panic!("oh no"); | 
|  | } | 
|  | loop { | 
|  | //~^ never_loop | 
|  |  | 
|  | unimplemented!("not yet"); | 
|  | } | 
|  | loop { | 
|  | // no error | 
|  | todo!("maybe later"); | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn issue12205() -> Option<()> { | 
|  | loop { | 
|  | let _: Option<_> = try { | 
|  | None?; | 
|  | return Some(()); | 
|  | }; | 
|  | } | 
|  | } | 
|  |  | 
|  | fn stmt_after_return() { | 
|  | for v in 0..10 { | 
|  | //~^ never_loop | 
|  | break; | 
|  | println!("{v}"); | 
|  | } | 
|  | } | 
|  |  | 
|  | fn loop_label() { | 
|  | 'outer: for v in 0..10 { | 
|  | //~^ never_loop | 
|  | loop { | 
|  | //~^ never_loop | 
|  | break 'outer; | 
|  | } | 
|  | return; | 
|  | } | 
|  |  | 
|  | for v in 0..10 { | 
|  | //~^ never_loop | 
|  | 'inner: loop { | 
|  | //~^ never_loop | 
|  | break 'inner; | 
|  | } | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | test1(); | 
|  | test2(); | 
|  | test3(); | 
|  | test4(); | 
|  | test5(); | 
|  | test6(); | 
|  | test7(); | 
|  | test8(); | 
|  | test9(); | 
|  | test10(); | 
|  | test11(|| 0); | 
|  | test12(true, false); | 
|  | test13(); | 
|  | test14(); | 
|  | } | 
|  |  | 
|  | fn issue15059() { | 
|  | 'a: for _ in 0..1 { | 
|  | //~^ never_loop | 
|  | break 'a; | 
|  | } | 
|  |  | 
|  | let mut b = 1; | 
|  | 'a: for i in 0..1 { | 
|  | //~^ never_loop | 
|  | match i { | 
|  | 0 => { | 
|  | b *= 2; | 
|  | break 'a; | 
|  | }, | 
|  | x => { | 
|  | b += x; | 
|  | break 'a; | 
|  | }, | 
|  | } | 
|  | } | 
|  |  | 
|  | #[allow(clippy::unused_unit)] | 
|  | for v in 0..10 { | 
|  | //~^ never_loop | 
|  | break; | 
|  | println!("{v}"); | 
|  | // This is comment and should be kept | 
|  | println!("This is a comment"); | 
|  | () | 
|  | } | 
|  | } |