mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
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
@ -1233,6 +1233,22 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
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) {
|
||||
let needs_parens = match expr.kind {
|
||||
// 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 {
|
||||
type Gat<'a> where Self: 'a;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-88360.rs:13:9
|
||||
--> $DIR/issue-88360.rs:15:9
|
||||
|
|
||||
LL | trait SuperTrait<T>
|
||||
| - this type parameter
|
||||
@ -7,13 +7,15 @@ LL | trait SuperTrait<T>
|
||||
LL | fn copy(&self) -> Self::Gat<'_> where T: Copy {
|
||||
| ------------- expected `&T` because of return type
|
||||
LL | *self.test()
|
||||
| ^^^^^^^^^^^^
|
||||
| |
|
||||
| expected `&T`, found type parameter `T`
|
||||
| help: consider borrowing here: `&*self.test()`
|
||||
| ^^^^^^^^^^^^ expected `&T`, found type parameter `T`
|
||||
|
|
||||
= note: expected reference `&T`
|
||||
found type parameter `T`
|
||||
help: consider removing deref here
|
||||
|
|
||||
LL - *self.test()
|
||||
LL + self.test()
|
||||
|
|
||||
|
||||
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…
Reference in New Issue
Block a user