Rollup merge of #107203 - chenyukang:yukang/fix-106496-remove-deref, r=compiler-errors
Suggest remove deref for type mismatch Fixes #106496
This commit is contained in:
commit
66d6a0b5da
7 changed files with 144 additions and 5 deletions
|
@ -1233,6 +1233,22 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
sugg_sp = receiver.span;
|
sugg_sp = receiver.span;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let hir::ExprKind::Unary(hir::UnOp::Deref, ref inner) = expr.kind
|
||||||
|
&& let Some(1) = self.deref_steps(expected, checked_ty) {
|
||||||
|
// We have `*&T`, check if what was expected was `&T`.
|
||||||
|
// If so, we may want to suggest removing a `*`.
|
||||||
|
sugg_sp = sugg_sp.with_hi(inner.span.lo());
|
||||||
|
return Some((
|
||||||
|
sugg_sp,
|
||||||
|
"consider removing deref here".to_string(),
|
||||||
|
"".to_string(),
|
||||||
|
Applicability::MachineApplicable,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
if let Ok(src) = sm.span_to_snippet(sugg_sp) {
|
if let Ok(src) = sm.span_to_snippet(sugg_sp) {
|
||||||
let needs_parens = match expr.kind {
|
let needs_parens = match expr.kind {
|
||||||
// parenthesize if needed (Issue #46756)
|
// parenthesize if needed (Issue #46756)
|
||||||
|
|
20
tests/ui/generic-associated-types/issue-88360.fixed
Normal file
20
tests/ui/generic-associated-types/issue-88360.fixed
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// run-rustfix
|
||||||
|
|
||||||
|
trait GatTrait {
|
||||||
|
type Gat<'a> where Self: 'a;
|
||||||
|
|
||||||
|
fn test(&self) -> Self::Gat<'_>;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait SuperTrait<T>
|
||||||
|
where
|
||||||
|
Self: 'static,
|
||||||
|
for<'a> Self: GatTrait<Gat<'a> = &'a T>,
|
||||||
|
{
|
||||||
|
fn copy(&self) -> Self::Gat<'_> where T: Copy {
|
||||||
|
self.test()
|
||||||
|
//~^ mismatched types
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -1,3 +1,5 @@
|
||||||
|
// run-rustfix
|
||||||
|
|
||||||
trait GatTrait {
|
trait GatTrait {
|
||||||
type Gat<'a> where Self: 'a;
|
type Gat<'a> where Self: 'a;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/issue-88360.rs:13:9
|
--> $DIR/issue-88360.rs:15:9
|
||||||
|
|
|
|
||||||
LL | trait SuperTrait<T>
|
LL | trait SuperTrait<T>
|
||||||
| - this type parameter
|
| - this type parameter
|
||||||
|
@ -7,13 +7,15 @@ LL | trait SuperTrait<T>
|
||||||
LL | fn copy(&self) -> Self::Gat<'_> where T: Copy {
|
LL | fn copy(&self) -> Self::Gat<'_> where T: Copy {
|
||||||
| ------------- expected `&T` because of return type
|
| ------------- expected `&T` because of return type
|
||||||
LL | *self.test()
|
LL | *self.test()
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^ expected `&T`, found type parameter `T`
|
||||||
| |
|
|
||||||
| expected `&T`, found type parameter `T`
|
|
||||||
| help: consider borrowing here: `&*self.test()`
|
|
||||||
|
|
|
|
||||||
= note: expected reference `&T`
|
= note: expected reference `&T`
|
||||||
found type parameter `T`
|
found type parameter `T`
|
||||||
|
help: consider removing deref here
|
||||||
|
|
|
||||||
|
LL - *self.test()
|
||||||
|
LL + self.test()
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
28
tests/ui/suggestions/suggest-remove-deref.fixed
Normal file
28
tests/ui/suggestions/suggest-remove-deref.fixed
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// run-rustfix
|
||||||
|
|
||||||
|
//issue #106496
|
||||||
|
|
||||||
|
struct S;
|
||||||
|
|
||||||
|
trait X {}
|
||||||
|
impl X for S {}
|
||||||
|
|
||||||
|
fn foo<T: X>(_: &T) {}
|
||||||
|
fn test_foo() {
|
||||||
|
let hello = &S;
|
||||||
|
foo(hello);
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bar(_: &String) {}
|
||||||
|
fn test_bar() {
|
||||||
|
let v = String::from("hello");
|
||||||
|
let s = &v;
|
||||||
|
bar(s);
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
test_foo();
|
||||||
|
test_bar();
|
||||||
|
}
|
28
tests/ui/suggestions/suggest-remove-deref.rs
Normal file
28
tests/ui/suggestions/suggest-remove-deref.rs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// run-rustfix
|
||||||
|
|
||||||
|
//issue #106496
|
||||||
|
|
||||||
|
struct S;
|
||||||
|
|
||||||
|
trait X {}
|
||||||
|
impl X for S {}
|
||||||
|
|
||||||
|
fn foo<T: X>(_: &T) {}
|
||||||
|
fn test_foo() {
|
||||||
|
let hello = &S;
|
||||||
|
foo(*hello);
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bar(_: &String) {}
|
||||||
|
fn test_bar() {
|
||||||
|
let v = String::from("hello");
|
||||||
|
let s = &v;
|
||||||
|
bar(*s);
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
test_foo();
|
||||||
|
test_bar();
|
||||||
|
}
|
43
tests/ui/suggestions/suggest-remove-deref.stderr
Normal file
43
tests/ui/suggestions/suggest-remove-deref.stderr
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/suggest-remove-deref.rs:13:9
|
||||||
|
|
|
||||||
|
LL | foo(*hello);
|
||||||
|
| --- ^^^^^^ expected reference, found struct `S`
|
||||||
|
| |
|
||||||
|
| arguments to this function are incorrect
|
||||||
|
|
|
||||||
|
= note: expected reference `&_`
|
||||||
|
found struct `S`
|
||||||
|
note: function defined here
|
||||||
|
--> $DIR/suggest-remove-deref.rs:10:4
|
||||||
|
|
|
||||||
|
LL | fn foo<T: X>(_: &T) {}
|
||||||
|
| ^^^ -----
|
||||||
|
help: consider removing deref here
|
||||||
|
|
|
||||||
|
LL - foo(*hello);
|
||||||
|
LL + foo(hello);
|
||||||
|
|
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/suggest-remove-deref.rs:21:9
|
||||||
|
|
|
||||||
|
LL | bar(*s);
|
||||||
|
| --- ^^ expected `&String`, found struct `String`
|
||||||
|
| |
|
||||||
|
| arguments to this function are incorrect
|
||||||
|
|
|
||||||
|
note: function defined here
|
||||||
|
--> $DIR/suggest-remove-deref.rs:17:4
|
||||||
|
|
|
||||||
|
LL | fn bar(_: &String) {}
|
||||||
|
| ^^^ ----------
|
||||||
|
help: consider removing deref here
|
||||||
|
|
|
||||||
|
LL - bar(*s);
|
||||||
|
LL + bar(s);
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
Loading…
Add table
Add a link
Reference in a new issue