File tree Expand file tree Collapse file tree 4 files changed +70
-0
lines changed
compiler/rustc_typeck/src/check Expand file tree Collapse file tree 4 files changed +70
-0
lines changed Original file line number Diff line number Diff 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" ) ;
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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`.
You can’t perform that action at this time.
0 commit comments