1
+ use hir:: HirId ;
1
2
use rustc_ast:: InlineAsmTemplatePiece ;
2
3
use rustc_data_structures:: fx:: FxHashSet ;
3
4
use rustc_errors:: struct_span_err;
@@ -6,7 +7,7 @@ use rustc_index::vec::Idx;
6
7
use rustc_middle:: ty:: layout:: { LayoutError , SizeSkeleton } ;
7
8
use rustc_middle:: ty:: { self , Article , FloatTy , IntTy , Ty , TyCtxt , TypeVisitable , UintTy } ;
8
9
use rustc_session:: lint;
9
- use rustc_span:: { Span , Symbol , DUMMY_SP } ;
10
+ use rustc_span:: { Symbol , DUMMY_SP } ;
10
11
use rustc_target:: abi:: { Pointer , VariantIdx } ;
11
12
use rustc_target:: asm:: { InlineAsmReg , InlineAsmRegClass , InlineAsmRegOrRegClass , InlineAsmType } ;
12
13
@@ -40,11 +41,13 @@ fn unpack_option_like<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> {
40
41
}
41
42
42
43
impl < ' a , ' tcx > FnCtxt < ' a , ' tcx > {
43
- pub fn check_transmute ( & self , span : Span , from : Ty < ' tcx > , to : Ty < ' tcx > ) {
44
+ pub fn check_transmute ( & self , from : Ty < ' tcx > , to : Ty < ' tcx > , hir_id : HirId ) {
45
+ let tcx = self . tcx ;
46
+ let span = tcx. hir ( ) . span ( hir_id) ;
44
47
let convert = |ty : Ty < ' tcx > | {
45
48
let ty = self . resolve_vars_if_possible ( ty) ;
46
- let ty = self . tcx . normalize_erasing_regions ( self . param_env , ty) ;
47
- ( SizeSkeleton :: compute ( ty, self . tcx , self . param_env ) , ty)
49
+ let ty = tcx. normalize_erasing_regions ( self . param_env , ty) ;
50
+ ( SizeSkeleton :: compute ( ty, tcx, self . param_env ) , ty)
48
51
} ;
49
52
let ( sk_from, from) = convert ( from) ;
50
53
let ( sk_to, to) = convert ( to) ;
@@ -57,9 +60,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
57
60
58
61
// Special-case transmuting from `typeof(function)` and
59
62
// `Option<typeof(function)>` to present a clearer error.
60
- let from = unpack_option_like ( self . tcx , from) ;
61
- if let ( & ty:: FnDef ( ..) , SizeSkeleton :: Known ( size_to) ) = ( from. kind ( ) , sk_to) && size_to == Pointer . size ( & self . tcx ) {
62
- struct_span_err ! ( self . tcx. sess, span, E0591 , "can't transmute zero-sized type" )
63
+ let from = unpack_option_like ( tcx, from) ;
64
+ if let ( & ty:: FnDef ( ..) , SizeSkeleton :: Known ( size_to) ) = ( from. kind ( ) , sk_to) && size_to == Pointer . size ( & tcx) {
65
+ struct_span_err ! ( tcx. sess, span, E0591 , "can't transmute zero-sized type" )
63
66
. note ( & format ! ( "source type: {from}" ) )
64
67
. note ( & format ! ( "target type: {to}" ) )
65
68
. help ( "cast with `as` to a pointer instead" )
@@ -83,7 +86,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
83
86
} ;
84
87
85
88
let mut err = struct_span_err ! (
86
- self . tcx. sess,
89
+ tcx. sess,
87
90
span,
88
91
E0512 ,
89
92
"cannot transmute between types of different sizes, \
0 commit comments