Skip to content

Commit 1c17c76

Browse files
committed
fix: unnested_or_patterns suggests wrongly in let
1 parent 18061e2 commit 1c17c76

File tree

4 files changed

+72
-4
lines changed

4 files changed

+72
-4
lines changed

clippy_lints/src/unnested_or_patterns.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -120,18 +120,24 @@ fn lint_unnested_or_patterns(cx: &EarlyContext<'_>, pat: &Pat) {
120120

121121
/// Remove all `(p)` patterns in `pat`.
122122
fn remove_all_parens(pat: &mut P<Pat>) {
123-
struct Visitor;
123+
#[derive(Default)]
124+
struct Visitor {
125+
/// If is not in the outer most pattern
126+
is_inner: bool,
127+
}
128+
124129
impl MutVisitor for Visitor {
125130
fn visit_pat(&mut self, pat: &mut P<Pat>) {
131+
let is_inner = mem::replace(&mut self.is_inner, true);
126132
walk_pat(self, pat);
127133
let inner = match &mut pat.kind {
128-
Paren(i) => mem::replace(&mut i.kind, Wild),
134+
Paren(i) if is_inner => mem::replace(&mut i.kind, Wild),
129135
_ => return,
130136
};
131137
pat.kind = inner;
132138
}
133139
}
134-
Visitor.visit_pat(pat);
140+
Visitor::default().visit_pat(pat);
135141
}
136142

137143
/// Insert parens where necessary according to Rust's precedence rules for patterns.

tests/ui/unnested_or_patterns.fixed

+13
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,16 @@ fn msrv_1_53() {
6464
if let [1 | 53] = [0] {}
6565
//~^ unnested_or_patterns
6666
}
67+
68+
mod issue9952 {
69+
fn or_in_local() {
70+
let (0 | 1 | _) = 0;
71+
//~^ unnested_or_patterns
72+
73+
if let (0 | 1 | _) = 0 {}
74+
//~^ unnested_or_patterns
75+
}
76+
77+
fn or_in_param((x | x | x): i32) {}
78+
//~^ unnested_or_patterns
79+
}

tests/ui/unnested_or_patterns.rs

+13
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,16 @@ fn msrv_1_53() {
6464
if let [1] | [53] = [0] {}
6565
//~^ unnested_or_patterns
6666
}
67+
68+
mod issue9952 {
69+
fn or_in_local() {
70+
let (0 | (1 | _)) = 0;
71+
//~^ unnested_or_patterns
72+
73+
if let (0 | (1 | _)) = 0 {}
74+
//~^ unnested_or_patterns
75+
}
76+
77+
fn or_in_param((x | (x | x)): i32) {}
78+
//~^ unnested_or_patterns
79+
}

tests/ui/unnested_or_patterns.stderr

+37-1
Original file line numberDiff line numberDiff line change
@@ -204,5 +204,41 @@ LL - if let [1] | [53] = [0] {}
204204
LL + if let [1 | 53] = [0] {}
205205
|
206206

207-
error: aborting due to 17 previous errors
207+
error: unnested or-patterns
208+
--> tests/ui/unnested_or_patterns.rs:70:13
209+
|
210+
LL | let (0 | (1 | _)) = 0;
211+
| ^^^^^^^^^^^^^
212+
|
213+
help: nest the patterns
214+
|
215+
LL - let (0 | (1 | _)) = 0;
216+
LL + let (0 | 1 | _) = 0;
217+
|
218+
219+
error: unnested or-patterns
220+
--> tests/ui/unnested_or_patterns.rs:73:16
221+
|
222+
LL | if let (0 | (1 | _)) = 0 {}
223+
| ^^^^^^^^^^^^^
224+
|
225+
help: nest the patterns
226+
|
227+
LL - if let (0 | (1 | _)) = 0 {}
228+
LL + if let (0 | 1 | _) = 0 {}
229+
|
230+
231+
error: unnested or-patterns
232+
--> tests/ui/unnested_or_patterns.rs:77:20
233+
|
234+
LL | fn or_in_param((x | (x | x)): i32) {}
235+
| ^^^^^^^^^^^^^
236+
|
237+
help: nest the patterns
238+
|
239+
LL - fn or_in_param((x | (x | x)): i32) {}
240+
LL + fn or_in_param((x | x | x): i32) {}
241+
|
242+
243+
error: aborting due to 20 previous errors
208244

0 commit comments

Comments
 (0)