]> git.lizzy.rs Git - rust.git/blob - src/test/ui/lint/issue-54538-unused-parens-lint.rs
Auto merge of #68820 - WaffleLapkin:remove_finished_from_map_while, r=LukasKalbertodt
[rust.git] / src / test / ui / lint / issue-54538-unused-parens-lint.rs
1 #![feature(box_patterns, stmt_expr_attributes)]
2
3 #![feature(or_patterns)]
4
5 #![allow(ellipsis_inclusive_range_patterns)]
6 #![allow(unreachable_patterns)]
7 #![allow(unused_variables)]
8 #![deny(unused_parens)]
9
10 fn lint_on_top_level() {
11     let (a) = 0; //~ ERROR unnecessary parentheses around pattern
12     for (a) in 0..1 {} //~ ERROR unnecessary parentheses around pattern
13     if let (a) = 0 {} //~ ERROR unnecessary parentheses around pattern
14     while let (a) = 0 {} //~ ERROR unnecessary parentheses around pattern
15     fn foo((a): u8) {} //~ ERROR unnecessary parentheses around pattern
16     let _ = |(a): u8| 0; //~ ERROR unnecessary parentheses around pattern
17 }
18
19 fn _no_lint_attr() {
20     let _x = #[allow(dead_code)] (1 + 2);
21 }
22
23 // Don't lint in these cases (#64106).
24 fn or_patterns_no_lint() {
25     match Box::new(0) {
26         box (0 | 1) => {} // Should not lint as `box 0 | 1` binds as `(box 0) | 1`.
27         _ => {}
28     }
29
30     match 0 {
31         x @ (0 | 1) => {} // Should not lint as `x @ 0 | 1` binds as `(x @ 0) | 1`.
32         _ => {}
33     }
34
35     if let &(0 | 1) = &0 {} // Should also not lint.
36     if let &mut (0 | 1) = &mut 0 {} // Same.
37
38     fn foo((Ok(a) | Err(a)): Result<u8, u8>) {} // Doesn't parse if we remove parens for now.
39
40     let _ = |(Ok(a) | Err(a)): Result<u8, u8>| 1; // `|Ok(a) | Err(a)| 1` parses as bit-or.
41 }
42
43 fn or_patterns_will_lint() {
44     if let (0 | 1) = 0 {} //~ ERROR unnecessary parentheses around pattern
45     if let ((0 | 1),) = (0,) {} //~ ERROR unnecessary parentheses around pattern
46     if let [(0 | 1)] = [0] {} //~ ERROR unnecessary parentheses around pattern
47     if let 0 | (1 | 2) = 0 {} //~ ERROR unnecessary parentheses around pattern
48     struct TS(u8);
49     if let TS((0 | 1)) = TS(0) {} //~ ERROR unnecessary parentheses around pattern
50     struct NS { f: u8 }
51     if let NS { f: (0 | 1) } = (NS { f: 0 }) {} //~ ERROR unnecessary parentheses around pattern
52 }
53
54 // Don't lint on `&(mut x)` because `&mut x` means something else (#55342).
55 fn deref_mut_binding_no_lint() {
56     let &(mut x) = &0;
57 }
58
59 fn main() {
60     match 1 {
61         (_) => {} //~ ERROR unnecessary parentheses around pattern
62         (y) => {} //~ ERROR unnecessary parentheses around pattern
63         (ref r) => {} //~ ERROR unnecessary parentheses around pattern
64         (e @ 1...2) => {} //~ ERROR unnecessary parentheses around pattern
65         (1...2) => {} // Non ambiguous range pattern should not warn
66         e @ (3...4) => {} // Non ambiguous range pattern should not warn
67     }
68
69     match &1 {
70         (e @ &(1...2)) => {} //~ ERROR unnecessary parentheses around pattern
71         &(_) => {} //~ ERROR unnecessary parentheses around pattern
72         e @ &(1...2) => {} // Ambiguous range pattern should not warn
73         &(1...2) => {} // Ambiguous range pattern should not warn
74     }
75
76     match &1 {
77         e @ &(1...2) | e @ &(3...4) => {} // Complex ambiguous pattern should not warn
78         &_ => {}
79     }
80
81     match 1 {
82         (_) => {} //~ ERROR unnecessary parentheses around pattern
83         (y) => {} //~ ERROR unnecessary parentheses around pattern
84         (ref r) => {} //~ ERROR unnecessary parentheses around pattern
85         (e @ 1..=2) => {} //~ ERROR unnecessary parentheses around pattern
86         (1..=2) => {} // Non ambiguous range pattern should not warn
87         e @ (3..=4) => {} // Non ambiguous range pattern should not warn
88     }
89
90     match &1 {
91         (e @ &(1..=2)) => {} //~ ERROR unnecessary parentheses around pattern
92         &(_) => {} //~ ERROR unnecessary parentheses around pattern
93         e @ &(1..=2) => {} // Ambiguous range pattern should not warn
94         &(1..=2) => {} // Ambiguous range pattern should not warn
95     }
96
97     match &1 {
98         e @ &(1..=2) | e @ &(3..=4) => {} // Complex ambiguous pattern should not warn
99         &_ => {}
100     }
101 }