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