Skip to content

Commit 710da44

Browse files
committed
Auto merge of #84228 - SkiFire13:fix-84213, r=estebank
Suggest to borrow after failing to cast from T to *const/mut T Fixes #84213
2 parents 5e7beba + 791e800 commit 710da44

File tree

4 files changed

+70
-0
lines changed

4 files changed

+70
-0
lines changed

compiler/rustc_typeck/src/check/cast.rs

+15
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,21 @@ impl<'a, 'tcx> CastCheck<'tcx> {
359359
{
360360
sugg = Some(format!("&{}", mutbl.prefix_str()));
361361
}
362+
} else if let ty::RawPtr(TypeAndMut { mutbl, .. }) = *self.cast_ty.kind() {
363+
if fcx
364+
.try_coerce(
365+
self.expr,
366+
fcx.tcx.mk_ref(
367+
&ty::RegionKind::ReErased,
368+
TypeAndMut { ty: self.expr_ty, mutbl },
369+
),
370+
self.cast_ty,
371+
AllowTwoPhase::No,
372+
)
373+
.is_ok()
374+
{
375+
sugg = Some(format!("&{}", mutbl.prefix_str()));
376+
}
362377
}
363378
if let Some(sugg) = sugg {
364379
err.span_label(self.span, "invalid cast");

src/test/ui/cast/issue-84213.fixed

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// run-rustfix
2+
3+
struct Something {
4+
pub field: u32,
5+
}
6+
7+
fn main() {
8+
let mut something = Something { field: 1337 };
9+
10+
let _pointer_to_something = &something as *const Something;
11+
//~^ ERROR: non-primitive cast
12+
13+
let _mut_pointer_to_something = &mut something as *mut Something;
14+
//~^ ERROR: non-primitive cast
15+
}

src/test/ui/cast/issue-84213.rs

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// run-rustfix
2+
3+
struct Something {
4+
pub field: u32,
5+
}
6+
7+
fn main() {
8+
let mut something = Something { field: 1337 };
9+
10+
let _pointer_to_something = something as *const Something;
11+
//~^ ERROR: non-primitive cast
12+
13+
let _mut_pointer_to_something = something as *mut Something;
14+
//~^ ERROR: non-primitive cast
15+
}

src/test/ui/cast/issue-84213.stderr

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
error[E0605]: non-primitive cast: `Something` as `*const Something`
2+
--> $DIR/issue-84213.rs:10:33
3+
|
4+
LL | let _pointer_to_something = something as *const Something;
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ invalid cast
6+
|
7+
help: borrow the value for the cast to be valid
8+
|
9+
LL | let _pointer_to_something = &something as *const Something;
10+
| ^
11+
12+
error[E0605]: non-primitive cast: `Something` as `*mut Something`
13+
--> $DIR/issue-84213.rs:13:37
14+
|
15+
LL | let _mut_pointer_to_something = something as *mut Something;
16+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ invalid cast
17+
|
18+
help: borrow the value for the cast to be valid
19+
|
20+
LL | let _mut_pointer_to_something = &mut something as *mut Something;
21+
| ^^^^
22+
23+
error: aborting due to 2 previous errors
24+
25+
For more information about this error, try `rustc --explain E0605`.

0 commit comments

Comments
 (0)