about summary refs log tree commit diff
path: root/src/librustc/middle/intrinsicck.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/librustc/middle/intrinsicck.rs')
-rw-r--r--src/librustc/middle/intrinsicck.rs15
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