File tree 4 files changed +70
-0
lines changed
compiler/rustc_typeck/src/check
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> {
359
359
{
360
360
sugg = Some ( format ! ( "&{}" , mutbl. prefix_str( ) ) ) ;
361
361
}
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
+ }
362
377
}
363
378
if let Some ( sugg) = sugg {
364
379
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