diff options
| author | bors <bors@rust-lang.org> | 2022-09-21 05:53:36 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-09-21 05:53:36 +0000 |
| commit | 3956c9d3fe15bd55fdc25c094bf74fed88e8a5d2 (patch) | |
| tree | e911c03c5828366fb48111e15959023eb0111ba8 | |
| parent | 1f66a3e8d04756be3a72c5d8bd4414a5a20ef9f8 (diff) | |
| parent | a783d542073497b658d0e57960b612e2f6e0734a (diff) | |
| download | rust-3956c9d3fe15bd55fdc25c094bf74fed88e8a5d2.tar.gz rust-3956c9d3fe15bd55fdc25c094bf74fed88e8a5d2.zip | |
Auto merge of #9505 - mikerite:fix-9504-2, r=dswij
Fix ICE in `unnecessary_to_owned` Fixes #9504 Compiler generated call `into_future` nodes return empty substs which we need when checking it's predicates. Handle this by simply exitting when we encounter one. This change introduces false negatives in place of the ICEs. changelog: [`unnecessary_to_owned`]: fix ICE
| -rw-r--r-- | clippy_lints/src/methods/unnecessary_to_owned.rs | 6 | ||||
| -rw-r--r-- | tests/ui/unnecessary_to_owned.fixed | 9 | ||||
| -rw-r--r-- | tests/ui/unnecessary_to_owned.rs | 9 |
3 files changed, 23 insertions, 1 deletions
diff --git a/clippy_lints/src/methods/unnecessary_to_owned.rs b/clippy_lints/src/methods/unnecessary_to_owned.rs index b32e5d8d421..8e9ed33e009 100644 --- a/clippy_lints/src/methods/unnecessary_to_owned.rs +++ b/clippy_lints/src/methods/unnecessary_to_owned.rs @@ -8,7 +8,7 @@ use clippy_utils::visitors::find_all_ret_expressions; use clippy_utils::{fn_def_id, get_parent_expr, is_diag_item_method, is_diag_trait_item, return_ty}; use clippy_utils::{meets_msrv, msrvs}; use rustc_errors::Applicability; -use rustc_hir::{def_id::DefId, BorrowKind, Expr, ExprKind, ItemKind, Node}; +use rustc_hir::{def_id::DefId, BorrowKind, Expr, ExprKind, ItemKind, LangItem, Node}; use rustc_infer::infer::TyCtxtInferExt; use rustc_lint::LateContext; use rustc_middle::mir::Mutability; @@ -380,6 +380,10 @@ fn can_change_type<'a>(cx: &LateContext<'a>, mut expr: &'a Expr<'a>, mut ty: Ty< Node::Expr(parent_expr) => { if let Some((callee_def_id, call_substs, recv, call_args)) = get_callee_substs_and_args(cx, parent_expr) { + if cx.tcx.lang_items().require(LangItem::IntoFutureIntoFuture) == Ok(callee_def_id) { + return false; + } + let fn_sig = cx.tcx.fn_sig(callee_def_id).skip_binder(); if let Some(arg_index) = recv.into_iter().chain(call_args).position(|arg| arg.hir_id == expr.hir_id) && let Some(param_ty) = fn_sig.inputs().get(arg_index) diff --git a/tests/ui/unnecessary_to_owned.fixed b/tests/ui/unnecessary_to_owned.fixed index a920c63b199..f97583aa22f 100644 --- a/tests/ui/unnecessary_to_owned.fixed +++ b/tests/ui/unnecessary_to_owned.fixed @@ -417,3 +417,12 @@ mod issue_9351 { predicates_are_satisfied(id("abc".to_string())); } } + +mod issue_9504 { + #![allow(dead_code)] + + async fn foo<S: AsRef<str>>(_: S) {} + async fn bar() { + foo(std::path::PathBuf::new().to_string_lossy().to_string()).await; + } +} diff --git a/tests/ui/unnecessary_to_owned.rs b/tests/ui/unnecessary_to_owned.rs index 2128bdacdda..aa5394a5657 100644 --- a/tests/ui/unnecessary_to_owned.rs +++ b/tests/ui/unnecessary_to_owned.rs @@ -417,3 +417,12 @@ mod issue_9351 { predicates_are_satisfied(id("abc".to_string())); } } + +mod issue_9504 { + #![allow(dead_code)] + + async fn foo<S: AsRef<str>>(_: S) {} + async fn bar() { + foo(std::path::PathBuf::new().to_string_lossy().to_string()).await; + } +} |
