Suggest borrowing if a trait implementation is found for &/&mut <type>
This commit is contained in:
parent
94ecdfd115
commit
48d07d1326
6 changed files with 154 additions and 17 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
13
src/test/ui/suggestions/issue-84973-2.rs
Normal file
13
src/test/ui/suggestions/issue-84973-2.rs
Normal 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]
|
||||
}
|
||||
15
src/test/ui/suggestions/issue-84973-2.stderr
Normal file
15
src/test/ui/suggestions/issue-84973-2.stderr
Normal 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`.
|
||||
33
src/test/ui/suggestions/issue-84973.rs
Normal file
33
src/test/ui/suggestions/issue-84973.rs
Normal 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,
|
||||
}
|
||||
}
|
||||
}
|
||||
15
src/test/ui/suggestions/issue-84973.stderr
Normal file
15
src/test/ui/suggestions/issue-84973.stderr
Normal 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`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue