11//@ revisions: allowed disallowed
2- //@[allowed] check -pass
2+ //@ run -pass
33//@ edition: 2024
44
55#![ feature( if_let_guard) ]
66#![ cfg_attr( allowed, allow( irrefutable_let_patterns) ) ]
77#![ cfg_attr( disallowed, deny( irrefutable_let_patterns) ) ]
8+ #![ allow( unused) ]
89
910use std:: ops:: Range ;
1011
1112fn main ( ) {
1213 let opt = Some ( None ..Some ( 1 ) ) ;
1314
1415 if let first = & opt && let Some ( second) = first && let None = second. start { }
15- //[disallowed]~^ ERROR leading irrefutable pattern in let chain
1616
1717 // No lint as the irrefutable pattern is surrounded by other stuff
1818 if 4 * 2 == 0 && let first = & opt && let Some ( second) = first && let None = second. start { }
1919
2020 if let first = & opt && let ( a, b) = ( 1 , 2 ) { }
21- //[disallowed]~^ ERROR irrefutable `if let` patterns
2221
2322 if let first = & opt && let Some ( second) = first && let None = second. start && let v = 0 { }
24- //[disallowed]~^ ERROR leading irrefutable pattern in let chain
25- //[disallowed]~^^ ERROR trailing irrefutable pattern in let chain
2623
2724 if let Some ( ref first) = opt && let second = first && let _third = second { }
28- //[disallowed]~^ ERROR trailing irrefutable patterns in let chain
2925
3026 if let Range { start : local_start, end : _ } = ( None ..Some ( 1 ) ) && let None = local_start { }
31- //[disallowed]~^ ERROR leading irrefutable pattern in let chain
3227
3328 if let ( a, b, c) = ( Some ( 1 ) , Some ( 1 ) , Some ( 1 ) ) && let None = Some ( 1 ) { }
34- //[disallowed]~^ ERROR leading irrefutable pattern in let chain
3529
3630 if let first = & opt && let None = Some ( 1 ) { }
37- //[disallowed]~^ ERROR leading irrefutable pattern in let chain
3831
3932 if let Some ( ref first) = opt
4033 && let Range { start : local_start, end : _ } = first
@@ -43,7 +36,6 @@ fn main() {
4336
4437 match opt {
4538 Some ( ref first) if let second = first && let _third = second && let v = 4 + 4 => { } ,
46- //[disallowed]~^ ERROR irrefutable `if let` guard patterns
4739 _ => { }
4840 }
4941
@@ -58,23 +50,22 @@ fn main() {
5850 match opt {
5951 Some ( ref first) if let Range { start : Some ( _) , end : local_end } = first
6052 && let v = local_end && let w = v => { } ,
61- //[disallowed]~^ ERROR trailing irrefutable patterns in let chain
6253 _ => { }
6354 }
6455
6556 // No error, despite the prefix being irrefutable: moving out could change the behaviour,
6657 // due to possible side effects of the operation.
67- while let first = & opt && let Some ( second) = first && let None = second. start { }
58+ while let first = & opt && let Some ( second) = first && let None = second. start { break ; }
6859
69- while let first = & opt && let ( a, b) = ( 1 , 2 ) { }
70- //[disallowed]~^ ERROR irrefutable `while let` patterns
60+ while let first = & opt && let ( a, b) = ( 1 , 2 ) { break ; }
7161
72- while let Some ( ref first) = opt && let second = first && let _third = second { }
73- //[disallowed]~^ ERROR trailing irrefutable patterns in let chain
62+ while let Some ( ref first) = opt && let second = first && let _third = second { break ; }
7463
7564 while let Some ( ref first) = opt
7665 && let Range { start : local_start, end : _ } = first
77- && let None = local_start {
66+ && let None = local_start
67+ {
68+ break ;
7869 }
7970
8071 // No error. An extra nesting level would be required for the `else if`.
@@ -86,13 +77,11 @@ fn main() {
8677 if opt == Some ( None ..None ) {
8778 } else if opt. is_some ( )
8879 && let x = & opt
89- //[disallowed]~^ ERROR trailing irrefutable pattern in let chain
9080 { }
9181
9282 if opt == Some ( None ..None ) {
9383 } else {
9484 if let x = opt. clone ( ) . map ( |_| 1 )
95- //[disallowed]~^ ERROR leading irrefutable pattern in let chain
9685 && x == Some ( 1 )
9786 { }
9887 }
0 commit comments