Skip to content

Commit 59b245e

Browse files
committed
fix(rustc_lint): better detect when parens are necessary
Fixes #88519
1 parent c2a4088 commit 59b245e

File tree

2 files changed

+104
-7
lines changed

2 files changed

+104
-7
lines changed

Diff for: compiler/rustc_lint/src/unused.rs

+10-7
Original file line numberDiff line numberDiff line change
@@ -461,13 +461,16 @@ trait UnusedDelimLint {
461461
let lhs_needs_parens = {
462462
let mut innermost = inner;
463463
loop {
464-
if let ExprKind::Binary(_, lhs, _rhs) = &innermost.kind {
465-
innermost = lhs;
466-
if !classify::expr_requires_semi_to_be_stmt(innermost) {
467-
break true;
468-
}
469-
} else {
470-
break false;
464+
innermost = match &innermost.kind {
465+
ExprKind::Binary(_, lhs, _rhs) => lhs,
466+
ExprKind::Call(fn_, _params) => fn_,
467+
ExprKind::Cast(expr, _ty) => expr,
468+
ExprKind::Type(expr, _ty) => expr,
469+
ExprKind::Index(base, _subscript) => base,
470+
_ => break false,
471+
};
472+
if !classify::expr_requires_semi_to_be_stmt(innermost) {
473+
break true;
471474
}
472475
}
473476
};

Diff for: src/test/ui/lint/unused/issue-88519-unused-paren.rs

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// check-pass
2+
// Make sure unused parens lint doesn't emit a false positive.
3+
// See https://github.com/rust-lang/rust/issues/88519
4+
#![deny(unused_parens)]
5+
#![feature(type_ascription)]
6+
7+
// binary ops are tested in issue-71290-unused-paren-binop.rs
8+
9+
mod call {
10+
fn noop() -> u8 { 0 }
11+
fn outside() -> u8 {
12+
({ noop })()
13+
}
14+
fn inside() -> u8 {
15+
({ noop }())
16+
}
17+
fn outside_match() -> u8 {
18+
(match noop { x => x })()
19+
}
20+
fn inside_match() -> u8 {
21+
(match noop { x => x }())
22+
}
23+
fn outside_if() -> u8 {
24+
(if false { noop } else { noop })()
25+
}
26+
fn inside_if() -> u8 {
27+
(if false { noop } else { noop }())
28+
}
29+
}
30+
31+
mod casts {
32+
fn outside() -> u8 {
33+
({ 0 }) as u8
34+
}
35+
fn inside() -> u8 {
36+
({ 0 } as u8)
37+
}
38+
fn outside_match() -> u8 {
39+
(match 0 { x => x }) as u8
40+
}
41+
fn inside_match() -> u8 {
42+
(match 0 { x => x } as u8)
43+
}
44+
fn outside_if() -> u8 {
45+
(if false { 0 } else { 0 }) as u8
46+
}
47+
fn inside_if() -> u8 {
48+
(if false { 0 } else { 0 } as u8)
49+
}
50+
}
51+
52+
mod typeascription {
53+
fn outside() -> u8 {
54+
({ 0 }): u8
55+
}
56+
fn inside() -> u8 {
57+
({ 0 }: u8)
58+
}
59+
fn outside_match() -> u8 {
60+
(match 0 { x => x }): u8
61+
}
62+
fn inside_match() -> u8 {
63+
(match 0 { x => x }: u8)
64+
}
65+
fn outside_if() -> u8 {
66+
(if false { 0 } else { 0 }): u8
67+
}
68+
fn inside_if() -> u8 {
69+
(if false { 0 } else { 0 }: u8)
70+
}
71+
}
72+
73+
mod index {
74+
fn outside(x: &[u8]) -> u8 {
75+
({ x })[0]
76+
}
77+
fn inside(x: &[u8]) -> u8 {
78+
({ x }[0])
79+
}
80+
fn outside_match(x: &[u8]) -> u8 {
81+
(match x { x => x })[0]
82+
}
83+
fn inside_match(x: &[u8]) -> u8 {
84+
(match x { x => x }[0])
85+
}
86+
fn outside_if(x: &[u8]) -> u8 {
87+
(if false { x } else { x })[0]
88+
}
89+
fn inside_if(x: &[u8]) -> u8 {
90+
(if false { x } else { x }[0])
91+
}
92+
}
93+
94+
fn main() {}

0 commit comments

Comments
 (0)