Auto merge of #84228 - SkiFire13:fix-84213, r=estebank

Suggest to borrow after failing to cast from T to *const/mut T

Fixes #84213
This commit is contained in:
bors 2021-04-16 05:13:43 +00:00
commit 710da44e22
4 changed files with 70 additions and 0 deletions

View File

@ -359,6 +359,21 @@ impl<'a, 'tcx> CastCheck<'tcx> {
{ {
sugg = Some(format!("&{}", mutbl.prefix_str())); sugg = Some(format!("&{}", mutbl.prefix_str()));
} }
} else if let ty::RawPtr(TypeAndMut { mutbl, .. }) = *self.cast_ty.kind() {
if fcx
.try_coerce(
self.expr,
fcx.tcx.mk_ref(
&ty::RegionKind::ReErased,
TypeAndMut { ty: self.expr_ty, mutbl },
),
self.cast_ty,
AllowTwoPhase::No,
)
.is_ok()
{
sugg = Some(format!("&{}", mutbl.prefix_str()));
}
} }
if let Some(sugg) = sugg { if let Some(sugg) = sugg {
err.span_label(self.span, "invalid cast"); err.span_label(self.span, "invalid cast");

View File

@ -0,0 +1,15 @@
// run-rustfix
struct Something {
pub field: u32,
}
fn main() {
let mut something = Something { field: 1337 };
let _pointer_to_something = &something as *const Something;
//~^ ERROR: non-primitive cast
let _mut_pointer_to_something = &mut something as *mut Something;
//~^ ERROR: non-primitive cast
}

View File

@ -0,0 +1,15 @@
// run-rustfix
struct Something {
pub field: u32,
}
fn main() {
let mut something = Something { field: 1337 };
let _pointer_to_something = something as *const Something;
//~^ ERROR: non-primitive cast
let _mut_pointer_to_something = something as *mut Something;
//~^ ERROR: non-primitive cast
}

View File

@ -0,0 +1,25 @@
error[E0605]: non-primitive cast: `Something` as `*const Something`
--> $DIR/issue-84213.rs:10:33
|
LL | let _pointer_to_something = something as *const Something;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ invalid cast
|
help: borrow the value for the cast to be valid
|
LL | let _pointer_to_something = &something as *const Something;
| ^
error[E0605]: non-primitive cast: `Something` as `*mut Something`
--> $DIR/issue-84213.rs:13:37
|
LL | let _mut_pointer_to_something = something as *mut Something;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ invalid cast
|
help: borrow the value for the cast to be valid
|
LL | let _mut_pointer_to_something = &mut something as *mut Something;
| ^^^^
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0605`.