Fix let_and_return
bad suggestion
Add a cast to the suggestion when the return expression has adjustments. These adjustments are lost when the suggestion is applied. This is similar to the problem in issue #4437. Closes #5729
This commit is contained in:
parent
dd07860b83
commit
e8d33d73dc
@ -99,7 +99,10 @@ fn check_block(&mut self, cx: &LateContext<'tcx>, block: &'tcx Block<'_>) {
|
|||||||
|err| {
|
|err| {
|
||||||
err.span_label(local.span, "unnecessary `let` binding");
|
err.span_label(local.span, "unnecessary `let` binding");
|
||||||
|
|
||||||
if let Some(snippet) = snippet_opt(cx, initexpr.span) {
|
if let Some(mut snippet) = snippet_opt(cx, initexpr.span) {
|
||||||
|
if !cx.typeck_results().expr_adjustments(&retexpr).is_empty() {
|
||||||
|
snippet.push_str(" as _");
|
||||||
|
}
|
||||||
err.multipart_suggestion(
|
err.multipart_suggestion(
|
||||||
"return the expression directly",
|
"return the expression directly",
|
||||||
vec![
|
vec![
|
||||||
|
@ -135,4 +135,25 @@ fn test() -> i32 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod issue_5729 {
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
trait Foo {}
|
||||||
|
|
||||||
|
trait FooStorage {
|
||||||
|
fn foo_cloned(&self) -> Arc<dyn Foo>;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct FooStorageImpl<T: Foo> {
|
||||||
|
foo: Arc<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Foo + 'static> FooStorage for FooStorageImpl<T> {
|
||||||
|
fn foo_cloned(&self) -> Arc<dyn Foo> {
|
||||||
|
let clone = Arc::clone(&self.foo);
|
||||||
|
clone
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -27,5 +27,19 @@ LL |
|
|||||||
LL | 5
|
LL | 5
|
||||||
|
|
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: returning the result of a `let` binding from a block
|
||||||
|
--> $DIR/let_and_return.rs:154:13
|
||||||
|
|
|
||||||
|
LL | let clone = Arc::clone(&self.foo);
|
||||||
|
| ---------------------------------- unnecessary `let` binding
|
||||||
|
LL | clone
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
help: return the expression directly
|
||||||
|
|
|
||||||
|
LL |
|
||||||
|
LL | Arc::clone(&self.foo) as _
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user