Skip to content

Commit 20f3f43

Browse files
committed
Fixes #109436: add parentheses properly
1 parent 1db9c06 commit 20f3f43

File tree

3 files changed

+56
-7
lines changed

3 files changed

+56
-7
lines changed

compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs

+28-7
Original file line numberDiff line numberDiff line change
@@ -1358,6 +1358,34 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
13581358
Applicability::MaybeIncorrect,
13591359
);
13601360
} else {
1361+
let is_mut = mut_ref_self_ty_satisfies_pred || ref_inner_ty_mut;
1362+
let sugg_prefix = format!("&{}", if is_mut { "mut " } else { "" });
1363+
let sugg_msg = &format!(
1364+
"consider{} borrowing here",
1365+
if is_mut { " mutably" } else { "" }
1366+
);
1367+
1368+
// Issue #109436, we need to add parentheses properly for method calls
1369+
// for example, `foo.into()` should be `(&foo).into()`
1370+
if let Ok(snippet) = self
1371+
.tcx
1372+
.sess
1373+
.source_map()
1374+
.span_to_snippet(self.tcx.sess.source_map().next_point(span))
1375+
{
1376+
if snippet == "." {
1377+
err.multipart_suggestion_verbose(
1378+
sugg_msg,
1379+
vec![
1380+
(span.shrink_to_lo(), format!("({}", sugg_prefix)),
1381+
(span.shrink_to_hi(), ")".to_string()),
1382+
],
1383+
Applicability::MaybeIncorrect,
1384+
);
1385+
return true;
1386+
}
1387+
}
1388+
13611389
// Issue #104961, we need to add parentheses properly for compond expressions
13621390
// for example, `x.starts_with("hi".to_string() + "you")`
13631391
// should be `x.starts_with(&("hi".to_string() + "you"))`
@@ -1374,14 +1402,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
13741402
_ => false,
13751403
};
13761404

1377-
let is_mut = mut_ref_self_ty_satisfies_pred || ref_inner_ty_mut;
13781405
let span = if needs_parens { span } else { span.shrink_to_lo() };
1379-
let sugg_prefix = format!("&{}", if is_mut { "mut " } else { "" });
1380-
let sugg_msg = &format!(
1381-
"consider{} borrowing here",
1382-
if is_mut { " mutably" } else { "" }
1383-
);
1384-
13851406
let suggestions = if !needs_parens {
13861407
vec![(span.shrink_to_lo(), format!("{}", sugg_prefix))]
13871408
} else {

tests/ui/suggestions/issue-109436.rs

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
struct Foo;
2+
struct Bar;
3+
4+
impl From<&Foo> for Bar {
5+
fn from(foo: &Foo) -> Bar {
6+
Bar
7+
}
8+
}
9+
10+
fn main() {
11+
let foo = Foo;
12+
let b: Bar = foo.into(); //~ ERROR E0277
13+
}
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
error[E0277]: the trait bound `Foo: Into<_>` is not satisfied
2+
--> $DIR/issue-109436.rs:12:22
3+
|
4+
LL | let b: Bar = foo.into();
5+
| ^^^^ the trait `~const Into<_>` is not implemented for `Foo`
6+
|
7+
= note: required for `Foo` to implement `Into<Bar>`
8+
help: consider borrowing here
9+
|
10+
LL | let b: Bar = (&foo).into();
11+
| ++ +
12+
13+
error: aborting due to previous error
14+
15+
For more information about this error, try `rustc --explain E0277`.

0 commit comments

Comments
 (0)