Skip to content

Commit

Permalink
Auto merge of #84228 - SkiFire13:fix-84213, r=estebank
Browse files Browse the repository at this point in the history
Suggest to borrow after failing to cast from T to *const/mut T

Fixes #84213
  • Loading branch information
bors committed Apr 16, 2021
2 parents 5e7beba + 791e800 commit 710da44
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 0 deletions.
15 changes: 15 additions & 0 deletions compiler/rustc_typeck/src/check/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,21 @@ impl<'a, 'tcx> CastCheck<'tcx> {
{
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 {
err.span_label(self.span, "invalid cast");
Expand Down
15 changes: 15 additions & 0 deletions src/test/ui/cast/issue-84213.fixed
Original file line number Diff line number Diff line change
@@ -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
}
15 changes: 15 additions & 0 deletions src/test/ui/cast/issue-84213.rs
Original file line number Diff line number Diff line change
@@ -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
}
25 changes: 25 additions & 0 deletions src/test/ui/cast/issue-84213.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 710da44

Please sign in to comment.