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