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