Change:
<!-- Thank you for filing a bug report! Please provide a short summary of the bug, along with any information you feel relevant to replicating the bug. If you cannot produce a minimal reproduction case (something that would work in isolation), please provide the steps or even link to a repository that causes the problematic output to occur. --Given the following code: The current output is: <!-- The following is not always necessary. --Ideally the output should look like: <!-- If the problem is not self-explanatory, please provide a rationale for the change. --<!-- If dramatically different output is caused by small changes, consider also adding them here. If you're using the stable version of the compiler, you should also check if the bug also exists in the beta or nightly versions. The output might also be different depending on the Edition. --<!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOTEND --
claim
The code here: Seems we can only get more context from , with only we can not know whether the current code snippet is an ident or a more complicated expression. The current is . An completed solution should make sure we get something like in ? A hack I'm thinking is checking whether contains spaces, if so we suggest it like:
I guess we have more similar issues for other suggestions come from .
This is an similar case, but we handle it well: Output is: The codepath is different, we take care parenthesis here, with :

Discussion:
use rustc_hir::def::DefKind; use rustc_hir::def_id::DefId; use rustc_hir::intravisit::Visitor; <ins> use rustc_hir::is_range_literal; </ins> use rustc_hir::lang_items::LangItem; use rustc_hir::{AsyncGeneratorKind, GeneratorKind, Node}; use rustc_hir::{Expr, HirId};

Applicability::MaybeIncorrect, ); } else { <ins> // Issue #104961, we need to add parentheses properly for compond expressions // for example, `x.starts_with("hi".to_string() + "you")` // should be `x.starts_with(&("hi".to_string() + "you"))` let Some(body_id) = self.tcx.hir().maybe_body_owned_by(obligation.cause.body_id) else { return false; }; let body = self.tcx.hir().body(body_id); let mut expr_finder = FindExprBySpan::new(span); expr_finder.visit_expr(body.value); let Some(expr) = expr_finder.result else { return false; }; let needs_parens = match expr.kind { // parenthesize if needed (Issue #46756) hir::ExprKind::Cast(_, _) | hir::ExprKind::Binary(_, _, _) => true, // parenthesize borrows of range literals (Issue #54505) _ if is_range_literal(expr) => true, _ => false, }; </ins> let is_mut = mut_ref_self_ty_satisfies_pred || ref_inner_ty_mut; <del> err.span_suggestion_verbose( span.shrink_to_lo(), &format!( "consider{} borrowing here", if is_mut { " mutably" } else { "" } ), format!("&{}", if is_mut { "mut " } else { "" }), </del> <ins> let span = if needs_parens { span } else { span.shrink_to_lo() }; let sugg_prefix = format!("&{}", if is_mut { "mut " } else { "" }); let sugg_msg = &format!( "consider{} borrowing here", if is_mut { " mutably" } else { "" } ); let suggestions = if !needs_parens { vec![(span.shrink_to_lo(), format!("{}", sugg_prefix))] } else { vec![ (span.shrink_to_lo(), format!("{}(", sugg_prefix)), (span.shrink_to_hi(), ")".to_string()), ] }; err.multipart_suggestion_verbose( sugg_msg, suggestions, </ins> Applicability::MaybeIncorrect, ); }

<ins> // run-rustfix fn foo(x: &str) -> bool { x.starts_with(&("hi".to_string() + " you")) //~^ ERROR expected a `FnMut<(char,)>` closure, found `String` } fn foo2(x: &str) -> bool { x.starts_with(&"hi".to_string()) //~^ ERROR expected a `FnMut<(char,)>` closure, found `String` } fn main() { foo("hi you"); foo2("hi"); } </ins>

<ins> // run-rustfix fn foo(x: &str) -> bool { x.starts_with("hi".to_string() + " you") //~^ ERROR expected a `FnMut<(char,)>` closure, found `String` } fn foo2(x: &str) -> bool { x.starts_with("hi".to_string()) //~^ ERROR expected a `FnMut<(char,)>` closure, found `String` } fn main() { foo("hi you"); foo2("hi"); } </ins>

<ins> error[E0277]: expected a `FnMut<(char,)>` closure, found `String` --> $DIR/issue-104961.rs:4:19 | LL |     x.starts_with("hi".to_string() + " you") |       ----------- ^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Pattern<'_>` is not implemented for `String` |       | |       required by a bound introduced by this call | = note: the trait bound `String: Pattern<'_>` is not satisfied = note: required for `String` to implement `Pattern<'_>` note: required by a bound in `core::str::<impl str>::starts_with` --> $SRC_DIR/core/src/str/mod.rs:LL:COL help: consider borrowing here | LL |     x.starts_with(&("hi".to_string() + " you")) |                   ++                         + error[E0277]: expected a `FnMut<(char,)>` closure, found `String` --> $DIR/issue-104961.rs:9:19 | LL |     x.starts_with("hi".to_string()) |       ----------- ^^^^^^^^^^^^^^^^ the trait `Pattern<'_>` is not implemented for `String` |       | |       required by a bound introduced by this call | = note: the trait bound `String: Pattern<'_>` is not satisfied = note: required for `String` to implement `Pattern<'_>` note: required by a bound in `core::str::<impl str>::starts_with` --> $SRC_DIR/core/src/str/mod.rs:LL:COL help: consider borrowing here | LL |     x.starts_with(&"hi".to_string()) |                   + error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0277`. </ins>