Suggest borrowing if a trait implementation is found for &/&mut <type>

This commit is contained in:
Fabian Wolff 2021-05-16 16:20:35 +02:00
parent 94ecdfd115
commit 48d07d1326
6 changed files with 154 additions and 17 deletions

View file

@ -21,10 +21,10 @@ LL | fn foo<X: Trait>(_: X) {}
| ----- required by this bound in `foo`
...
LL | foo(s);
| ^ the trait `Trait` is not implemented for `S`
|
= help: the following implementations were found:
<&'a mut S as Trait>
| ^
| |
| expected an implementor of trait `Trait`
| help: consider borrowing mutably here: `&mut s`
error: aborting due to 2 previous errors

View file

@ -0,0 +1,13 @@
// A slight variation of issue-84973.rs. Here, a mutable borrow is
// required (and the obligation kind is different).
trait Tr {}
impl Tr for &mut i32 {}
fn foo<T: Tr>(i: T) {}
fn main() {
let a: i32 = 32;
foo(a);
//~^ ERROR: the trait bound `i32: Tr` is not satisfied [E0277]
}

View file

@ -0,0 +1,15 @@
error[E0277]: the trait bound `i32: Tr` is not satisfied
--> $DIR/issue-84973-2.rs:11:9
|
LL | fn foo<T: Tr>(i: T) {}
| -- required by this bound in `foo`
...
LL | foo(a);
| ^
| |
| expected an implementor of trait `Tr`
| help: consider borrowing mutably here: `&mut a`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.

View file

@ -0,0 +1,33 @@
// Checks whether borrowing is suggested when a trait bound is not satisfied
// for found type `T`, but is for `&/&mut T`.
fn main() {
let f = Fancy{};
let o = Other::new(f);
//~^ ERROR: the trait bound `Fancy: SomeTrait` is not satisfied [E0277]
}
struct Fancy {}
impl <'a> SomeTrait for &'a Fancy {
}
trait SomeTrait {}
struct Other<'a, G> {
a: &'a str,
g: G,
}
// Broadly copied from https://docs.rs/petgraph/0.5.1/src/petgraph/dot.rs.html#70
impl<'a, G> Other<'a, G>
where
G: SomeTrait,
{
pub fn new(g: G) -> Self {
Other {
a: "hi",
g: g,
}
}
}

View file

@ -0,0 +1,15 @@
error[E0277]: the trait bound `Fancy: SomeTrait` is not satisfied
--> $DIR/issue-84973.rs:6:24
|
LL | let o = Other::new(f);
| ^
| |
| expected an implementor of trait `SomeTrait`
| help: consider borrowing here: `&f`
...
LL | pub fn new(g: G) -> Self {
| ------------------------ required by `Other::<'a, G>::new`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.