Fix suggestion to convert dereference of raw pointer to ref
This commit is contained in:
parent
d8a64098c9
commit
8d59545daa
4 changed files with 64 additions and 0 deletions
|
|
@ -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 `*`.
|
||||
|
|
|
|||
19
tests/ui/suggestions/raw-to-ref.fixed
Normal file
19
tests/ui/suggestions/raw-to-ref.fixed
Normal 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
|
||||
}
|
||||
19
tests/ui/suggestions/raw-to-ref.rs
Normal file
19
tests/ui/suggestions/raw-to-ref.rs
Normal 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
|
||||
}
|
||||
25
tests/ui/suggestions/raw-to-ref.stderr
Normal file
25
tests/ui/suggestions/raw-to-ref.stderr
Normal 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`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue