File tree 2 files changed +43
-4
lines changed
2 files changed +43
-4
lines changed Original file line number Diff line number Diff line change @@ -380,11 +380,27 @@ trait UnusedDelimLint {
380
380
) ;
381
381
382
382
fn is_expr_delims_necessary ( inner : & ast:: Expr , followed_by_block : bool ) -> bool {
383
- followed_by_block
384
- && match inner. kind {
385
- ExprKind :: Ret ( _) | ExprKind :: Break ( ..) => true ,
386
- _ => parser:: contains_exterior_struct_lit ( & inner) ,
383
+ // Prevent false-positives in cases like `fn x() -> u8 { ({ 0 } + 1) }`
384
+ let lhs_needs_parens = {
385
+ let mut innermost = inner;
386
+ loop {
387
+ if let ExprKind :: Binary ( _, lhs, _rhs) = & innermost. kind {
388
+ innermost = lhs;
389
+ if !rustc_ast:: util:: classify:: expr_requires_semi_to_be_stmt ( innermost) {
390
+ break true ;
391
+ }
392
+ } else {
393
+ break false ;
394
+ }
387
395
}
396
+ } ;
397
+
398
+ lhs_needs_parens
399
+ || ( followed_by_block
400
+ && match inner. kind {
401
+ ExprKind :: Ret ( _) | ExprKind :: Break ( ..) => true ,
402
+ _ => parser:: contains_exterior_struct_lit ( & inner) ,
403
+ } )
388
404
}
389
405
390
406
fn emit_unused_delims_expr (
Original file line number Diff line number Diff line change
1
+ // check-pass
2
+ // Make sure unused parens lint doesn't emit a false positive.
3
+ // See https://github.com/rust-lang/rust/issues/71290 for details.
4
+ #![ deny( unused_parens) ]
5
+
6
+ fn x ( ) -> u8 {
7
+ ( { 0 } ) + 1
8
+ }
9
+
10
+ fn y ( ) -> u8 {
11
+ ( { 0 } + 1 )
12
+ }
13
+
14
+ pub fn foo ( a : bool , b : bool ) -> u8 {
15
+ ( if a { 1 } else { 0 } + if b { 1 } else { 0 } )
16
+ }
17
+
18
+ pub fn bar ( ) -> u8 {
19
+ // Make sure nested expressions are handled correctly as well
20
+ ( { 0 } + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 )
21
+ }
22
+
23
+ fn main ( ) { }
You can’t perform that action at this time.
0 commit comments