Skip to content

Commit

Permalink
Fix suggestion to convert dereference of raw pointer to ref
Browse files Browse the repository at this point in the history
  • Loading branch information
samueltardieu committed Jan 16, 2025
1 parent d8a6409 commit 8d59545
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 0 deletions.
1 change: 1 addition & 0 deletions compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 `*`.
Expand Down
19 changes: 19 additions & 0 deletions tests/ui/suggestions/raw-to-ref.fixed
Original file line number Diff line number Diff line change
@@ -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
}
19 changes: 19 additions & 0 deletions tests/ui/suggestions/raw-to-ref.rs
Original file line number Diff line number Diff line change
@@ -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
}
25 changes: 25 additions & 0 deletions tests/ui/suggestions/raw-to-ref.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 8d59545

Please sign in to comment.