Skip to content

Commit

Permalink
Auto merge of rust-lang#11584 - koka831:fix/11335, r=blyxyas
Browse files Browse the repository at this point in the history
let_and_return: Wrap with parenthesis if necessary

- fixes rust-lang/rust-clippy#11335

changelog: [`let_and_return`]: Wrap suggestion with parenthesis if necessary

r? `@Centri3`
  • Loading branch information
bors committed Oct 26, 2023
2 parents 7ce6e0d + f4a8b12 commit 0da4dab
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 3 deletions.
4 changes: 4 additions & 0 deletions clippy_lints/src/returns.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then, span_lint_hir_and_then};
use clippy_utils::source::{snippet_opt, snippet_with_context};
use clippy_utils::sugg::has_enclosing_paren;
use clippy_utils::visitors::{for_each_expr_with_closures, Descend};
use clippy_utils::{fn_def_id, is_from_proc_macro, path_to_local_id, span_find_starting_semi};
use core::ops::ControlFlow;
Expand Down Expand Up @@ -213,6 +214,9 @@ impl<'tcx> LateLintPass<'tcx> for Return {

if let Some(mut snippet) = snippet_opt(cx, initexpr.span) {
if !cx.typeck_results().expr_adjustments(retexpr).is_empty() {
if !has_enclosing_paren(&snippet) {
snippet = format!("({snippet})");
}
snippet.push_str(" as _");
}
err.multipart_suggestion(
Expand Down
21 changes: 20 additions & 1 deletion tests/ui/let_and_return.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,26 @@ mod issue_5729 {
impl<T: Foo + 'static> FooStorage for FooStorageImpl<T> {
fn foo_cloned(&self) -> Arc<dyn Foo> {

Arc::clone(&self.foo) as _
(Arc::clone(&self.foo)) as _
//~^ ERROR: returning the result of a `let` binding from a block
}
}
}

mod issue_11335 {
pub enum E<T> {
A(T),
B(T),
}

impl<T> E<T> {
pub fn inner(&self) -> &T {


(match self {
E::A(x) => x,
E::B(x) => x,
}) as _
//~^ ERROR: returning the result of a `let` binding from a block
}
}
Expand Down
19 changes: 19 additions & 0 deletions tests/ui/let_and_return.rs
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,25 @@ mod issue_5729 {
}
}

mod issue_11335 {
pub enum E<T> {
A(T),
B(T),
}

impl<T> E<T> {
pub fn inner(&self) -> &T {
let result = match self {
E::A(x) => x,
E::B(x) => x,
};

result
//~^ ERROR: returning the result of a `let` binding from a block
}
}
}

// https://github.com/rust-lang/rust-clippy/issues/11167
macro_rules! fn_in_macro {
($b:block) => {
Expand Down
26 changes: 24 additions & 2 deletions tests/ui/let_and_return.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,30 @@ LL | clone
help: return the expression directly
|
LL ~
LL ~ Arc::clone(&self.foo) as _
LL ~ (Arc::clone(&self.foo)) as _
|

error: aborting due to 4 previous errors
error: returning the result of a `let` binding from a block
--> $DIR/let_and_return.rs:190:13
|
LL | / let result = match self {
LL | | E::A(x) => x,
LL | | E::B(x) => x,
LL | | };
| |______________- unnecessary `let` binding
LL |
LL | result
| ^^^^^^
|
help: return the expression directly
|
LL ~
LL |
LL ~ (match self {
LL + E::A(x) => x,
LL + E::B(x) => x,
LL + }) as _
|

error: aborting due to 5 previous errors

0 comments on commit 0da4dab

Please sign in to comment.