Fix suggestion to convert dereference of raw pointer to ref

This commit is contained in:
Samuel Tardieu 2025-01-15 20:50:51 +01:00
parent d8a64098c9
commit 8d59545daa
4 changed files with 64 additions and 0 deletions

View file

@ -2682,6 +2682,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if let hir::ExprKind::Unary(hir::UnOp::Deref, inner) = expr.kind
&& let Some(1) = self.deref_steps_for_suggestion(expected, checked_ty)
&& self.typeck_results.borrow().expr_ty(inner).is_ref()
{
// We have `*&T`, check if what was expected was `&T`.
// If so, we may want to suggest removing a `*`.

View file

@ -0,0 +1,19 @@
//@ run-rustfix
// Regression test for #135580: check that we do not suggest to simply drop
// the `*` to make the types match when the source is a raw pointer while
// the target type is a reference.
struct S;
fn main() {
let mut s = S;
let x = &raw const s;
let _: &S = unsafe { &*x };
//~^ ERROR mismatched types
//~| HELP consider borrowing here
let x = &raw mut s;
let _: &mut S = unsafe { &mut *x };
//~^ ERROR mismatched types
//~| HELP consider mutably borrowing here
}

View file

@ -0,0 +1,19 @@
//@ run-rustfix
// Regression test for #135580: check that we do not suggest to simply drop
// the `*` to make the types match when the source is a raw pointer while
// the target type is a reference.
struct S;
fn main() {
let mut s = S;
let x = &raw const s;
let _: &S = unsafe { *x };
//~^ ERROR mismatched types
//~| HELP consider borrowing here
let x = &raw mut s;
let _: &mut S = unsafe { *x };
//~^ ERROR mismatched types
//~| HELP consider mutably borrowing here
}

View file

@ -0,0 +1,25 @@
error[E0308]: mismatched types
--> $DIR/raw-to-ref.rs:11:26
|
LL | let _: &S = unsafe { *x };
| ^^ expected `&S`, found `S`
|
help: consider borrowing here
|
LL | let _: &S = unsafe { &*x };
| +
error[E0308]: mismatched types
--> $DIR/raw-to-ref.rs:16:30
|
LL | let _: &mut S = unsafe { *x };
| ^^ expected `&mut S`, found `S`
|
help: consider mutably borrowing here
|
LL | let _: &mut S = unsafe { &mut *x };
| ++++
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0308`.