diff options
Diffstat (limited to 'src/librustc/middle/intrinsicck.rs')
| -rw-r--r-- | src/librustc/middle/intrinsicck.rs | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/librustc/middle/intrinsicck.rs b/src/librustc/middle/intrinsicck.rs index 6669147b0dc..be587c25574 100644 --- a/src/librustc/middle/intrinsicck.rs +++ b/src/librustc/middle/intrinsicck.rs @@ -73,9 +73,13 @@ struct IntrinsicCheckingVisitor<'a> { impl<'a> IntrinsicCheckingVisitor<'a> { fn def_id_is_transmute(&self, def_id: DefId) -> bool { + let intrinsic = match ty::get(ty::lookup_item_type(self.tcx, def_id).ty).sty { + ty::ty_bare_fn(ref bfty) => bfty.abi == RustIntrinsic, + _ => return false + }; if def_id.krate == ast::LOCAL_CRATE { match self.tcx.map.get(def_id.node) { - NodeForeignItem(ref item) => { + NodeForeignItem(ref item) if intrinsic => { token::get_ident(item.ident) == token::intern_and_get_ident("transmute") } @@ -83,16 +87,16 @@ impl<'a> IntrinsicCheckingVisitor<'a> { } } else { match csearch::get_item_path(self.tcx, def_id).last() { - None => false, - Some(ref last) => { + Some(ref last) if intrinsic => { token::get_name(last.name()) == token::intern_and_get_ident("transmute") } + _ => false, } } } - fn check_transmute(&self, span: Span, from: ty::t, to: ty::t) { + fn check_transmute(&self, span: Span, from: ty::t, to: ty::t, id: ast::NodeId) { if type_size_is_affected_by_type_parameters(self.tcx, from) { span_err!(self.tcx.sess, span, E0139, "cannot transmute from a type that contains type parameters"); @@ -106,6 +110,7 @@ impl<'a> IntrinsicCheckingVisitor<'a> { span: span, from: from, to: to, + id: id, }; self.tcx.transmute_restrictions.borrow_mut().push(restriction); } @@ -123,7 +128,7 @@ impl<'a> Visitor<()> for IntrinsicCheckingVisitor<'a> { if bare_fn_ty.abi == RustIntrinsic => { let from = *bare_fn_ty.sig.inputs.get(0); let to = bare_fn_ty.sig.output; - self.check_transmute(expr.span, from, to); + self.check_transmute(expr.span, from, to, expr.id); } _ => { self.tcx |
