Skip to content

Commit

Permalink
Fix FP with empty return for needless_return lint
Browse files Browse the repository at this point in the history
  • Loading branch information
ThibsG committed Jan 15, 2021
1 parent 2d1e129 commit 83f1abf
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 2 deletions.
11 changes: 10 additions & 1 deletion clippy_lints/src/returns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,16 @@ impl<'tcx> LateLintPass<'tcx> for Return {
_: HirId,
) {
match kind {
FnKind::Closure(_) => check_final_expr(cx, &body.value, Some(body.value.span), RetReplacement::Empty),
FnKind::Closure(_) => {
// when returning without value in closure, replace this `return`
// with an empty block to prevent invalid suggestion (see #6501)
let replacement = if let ExprKind::Ret(None) = &body.value.kind {
RetReplacement::Block
} else {
RetReplacement::Empty
};
check_final_expr(cx, &body.value, Some(body.value.span), replacement)
},
FnKind::ItemFn(..) | FnKind::Method(..) => {
if let ExprKind::Block(ref block, _) = body.value.kind {
check_block_return(cx, block);
Expand Down
13 changes: 13 additions & 0 deletions tests/ui/needless_return.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,19 @@ fn test_return_in_macro() {
needed_return!(0);
}

mod issue6501 {
fn foo(bar: Result<(), ()>) {
bar.unwrap_or_else(|_| {})
}

fn test_closure() {
let _ = || {

};
let _ = || {};
}
}

fn main() {
let _ = test_end_of_fn();
let _ = test_no_semicolon();
Expand Down
13 changes: 13 additions & 0 deletions tests/ui/needless_return.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,19 @@ fn test_return_in_macro() {
needed_return!(0);
}

mod issue6501 {
fn foo(bar: Result<(), ()>) {
bar.unwrap_or_else(|_| return)
}

fn test_closure() {
let _ = || {
return;
};
let _ = || return;
}
}

fn main() {
let _ = test_end_of_fn();
let _ = test_no_semicolon();
Expand Down
20 changes: 19 additions & 1 deletion tests/ui/needless_return.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -84,5 +84,23 @@ error: unneeded `return` statement
LL | return String::new();
| ^^^^^^^^^^^^^^^^^^^^^ help: remove `return`: `String::new()`

error: aborting due to 14 previous errors
error: unneeded `return` statement
--> $DIR/needless_return.rs:91:32
|
LL | bar.unwrap_or_else(|_| return)
| ^^^^^^ help: replace `return` with an empty block: `{}`

error: unneeded `return` statement
--> $DIR/needless_return.rs:96:13
|
LL | return;
| ^^^^^^^ help: remove `return`

error: unneeded `return` statement
--> $DIR/needless_return.rs:98:20
|
LL | let _ = || return;
| ^^^^^^ help: replace `return` with an empty block: `{}`

error: aborting due to 17 previous errors

0 comments on commit 83f1abf

Please sign in to comment.