1+ use hir:: HirId ;
12use rustc_ast:: InlineAsmTemplatePiece ;
23use rustc_data_structures:: fx:: FxHashSet ;
34use rustc_errors:: struct_span_err;
@@ -6,7 +7,7 @@ use rustc_index::vec::Idx;
67use rustc_middle:: ty:: layout:: { LayoutError , SizeSkeleton } ;
78use rustc_middle:: ty:: { self , Article , FloatTy , IntTy , Ty , TyCtxt , TypeVisitable , UintTy } ;
89use rustc_session:: lint;
9- use rustc_span:: { Span , Symbol , DUMMY_SP } ;
10+ use rustc_span:: { Symbol , DUMMY_SP } ;
1011use rustc_target:: abi:: { Pointer , VariantIdx } ;
1112use rustc_target:: asm:: { InlineAsmReg , InlineAsmRegClass , InlineAsmRegOrRegClass , InlineAsmType } ;
1213
@@ -40,11 +41,13 @@ fn unpack_option_like<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> {
4041}
4142
4243impl < ' 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) ;
4447 let convert = |ty : Ty < ' tcx > | {
4548 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)
4851 } ;
4952 let ( sk_from, from) = convert ( from) ;
5053 let ( sk_to, to) = convert ( to) ;
@@ -57,9 +60,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
5760
5861 // Special-case transmuting from `typeof(function)` and
5962 // `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" )
6366 . note ( & format ! ( "source type: {from}" ) )
6467 . note ( & format ! ( "target type: {to}" ) )
6568 . help ( "cast with `as` to a pointer instead" )
@@ -83,7 +86,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
8386 } ;
8487
8588 let mut err = struct_span_err ! (
86- self . tcx. sess,
89+ tcx. sess,
8790 span,
8891 E0512 ,
8992 "cannot transmute between types of different sizes, \
0 commit comments