Rustup
diff --git a/Cargo.lock b/Cargo.lock
index d4ce1aa..a255b5a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -9,8 +9,8 @@
  "quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
  "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -61,8 +61,8 @@
 version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "serde 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_json 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -82,8 +82,8 @@
  "duct 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -289,22 +289,22 @@
 
 [[package]]
 name = "serde"
-version = "1.0.12"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "serde_derive"
-version = "1.0.12"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive_internals 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive_internals 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "serde_derive_internals"
-version = "0.15.1"
+version = "0.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -319,7 +319,7 @@
  "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -364,7 +364,7 @@
 version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "serde 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -442,9 +442,9 @@
 "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
 "checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537"
 "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
-"checksum serde 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "7f61b753dd58ec5d4c735f794dbddde1f28b977f652afbcde89d75bc77902216"
-"checksum serde_derive 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "2a169fa5384d751ada1da9f3992b81830151a03c875e40dcb37c9fb31aafc68f"
-"checksum serde_derive_internals 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37aee4e0da52d801acfbc0cc219eb1eda7142112339726e427926a6f6ee65d3a"
+"checksum serde 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb6a7637a47663ee073391a139ed07851f27ed2532c2abc88c6bf27a16cdf34"
+"checksum serde_derive 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "812ff66056fd9a9a5b7c119714243b0862cf98340e7d4b5ee05a932c40d5ea6c"
+"checksum serde_derive_internals 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd381f6d01a6616cdba8530492d453b7761b456ba974e98768a18cad2cd76f58"
 "checksum serde_json 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d243424e06f9f9c39e3cd36147470fd340db785825e367625f79298a6ac6b7ac"
 "checksum shared_child 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "099b38928dbe4a0a01fcd8c233183072f14a7d126a34bed05880869be66e14cc"
 "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
diff --git a/clippy_lints/src/attrs.rs b/clippy_lints/src/attrs.rs
index 12339c0..83ec326 100644
--- a/clippy_lints/src/attrs.rs
+++ b/clippy_lints/src/attrs.rs
@@ -7,7 +7,7 @@
 use semver::Version;
 use syntax::ast::{Attribute, Lit, LitKind, MetaItemKind, NestedMetaItem, NestedMetaItemKind};
 use syntax::codemap::Span;
-use utils::{in_macro, match_def_path, paths, snippet_opt, span_lint, span_lint_and_then};
+use utils::{in_macro, match_def_path, paths, snippet_opt, span_lint, span_lint_and_then, opt_def_id};
 
 /// **What it does:** Checks for items annotated with `#[inline(always)]`,
 /// unless the annotated function is empty or simply panics.
@@ -211,8 +211,11 @@
         ExprRet(Some(ref e)) => is_relevant_expr(tcx, tables, e),
         ExprRet(None) | ExprBreak(_, None) => false,
         ExprCall(ref path_expr, _) => if let ExprPath(ref qpath) = path_expr.node {
-            let fun_id = tables.qpath_def(qpath, path_expr.hir_id).def_id();
-            !match_def_path(tcx, fun_id, &paths::BEGIN_PANIC)
+            if let Some(fun_id) = opt_def_id(tables.qpath_def(qpath, path_expr.hir_id)) {
+                !match_def_path(tcx, fun_id, &paths::BEGIN_PANIC)
+            } else {
+                true
+            }
         } else {
             true
         },
diff --git a/clippy_lints/src/drop_forget_ref.rs b/clippy_lints/src/drop_forget_ref.rs
index 6ca04d4..46b228e 100644
--- a/clippy_lints/src/drop_forget_ref.rs
+++ b/clippy_lints/src/drop_forget_ref.rs
@@ -1,7 +1,7 @@
 use rustc::lint::*;
 use rustc::ty;
 use rustc::hir::*;
-use utils::{is_copy, match_def_path, paths, span_note_and_lint};
+use utils::{is_copy, match_def_path, paths, span_note_and_lint, opt_def_id};
 
 /// **What it does:** Checks for calls to `std::mem::drop` with a reference
 /// instead of an owned value.
@@ -119,8 +119,8 @@
             let ExprCall(ref path, ref args) = expr.node,
             let ExprPath(ref qpath) = path.node,
             args.len() == 1,
+            let Some(def_id) = opt_def_id(cx.tables.qpath_def(qpath, path.hir_id)),
         ], {
-            let def_id = cx.tables.qpath_def(qpath, path.hir_id).def_id();
             let lint;
             let msg;
             let arg = &args[0];
diff --git a/clippy_lints/src/eval_order_dependence.rs b/clippy_lints/src/eval_order_dependence.rs
index 621438b..42af597 100644
--- a/clippy_lints/src/eval_order_dependence.rs
+++ b/clippy_lints/src/eval_order_dependence.rs
@@ -1,8 +1,8 @@
-use rustc::hir::def_id::DefId;
 use rustc::hir::intravisit::{walk_expr, NestedVisitorMap, Visitor};
 use rustc::hir::*;
 use rustc::ty;
 use rustc::lint::*;
+use syntax::ast;
 use utils::{get_parent_expr, span_lint, span_note_and_lint};
 
 /// **What it does:** Checks for a read and a write to the same variable where
@@ -65,14 +65,15 @@
             ExprAssign(ref lhs, _) | ExprAssignOp(_, ref lhs, _) => if let ExprPath(ref qpath) = lhs.node {
                 if let QPath::Resolved(_, ref path) = *qpath {
                     if path.segments.len() == 1 {
-                        let var = cx.tables.qpath_def(qpath, lhs.hir_id).def_id();
-                        let mut visitor = ReadVisitor {
-                            cx: cx,
-                            var: var,
-                            write_expr: expr,
-                            last_expr: expr,
-                        };
-                        check_for_unsequenced_reads(&mut visitor);
+                        if let def::Def::Local(var) = cx.tables.qpath_def(qpath, lhs.hir_id) {
+                            let mut visitor = ReadVisitor {
+                                cx: cx,
+                                var: var,
+                                write_expr: expr,
+                                last_expr: expr,
+                            };
+                            check_for_unsequenced_reads(&mut visitor);
+                        }
                     }
                 }
             },
@@ -280,7 +281,7 @@
 struct ReadVisitor<'a, 'tcx: 'a> {
     cx: &'a LateContext<'a, 'tcx>,
     /// The id of the variable we're looking for.
-    var: DefId,
+    var: ast::NodeId,
     /// The expressions where the write to the variable occurred (for reporting
     /// in the lint).
     write_expr: &'tcx Expr,
@@ -297,22 +298,23 @@
 
         match expr.node {
             ExprPath(ref qpath) => {
-                if let QPath::Resolved(None, ref path) = *qpath {
-                    if path.segments.len() == 1 && self.cx.tables.qpath_def(qpath, expr.hir_id).def_id() == self.var {
-                        if is_in_assignment_position(self.cx, expr) {
-                            // This is a write, not a read.
-                        } else {
-                            span_note_and_lint(
-                                self.cx,
-                                EVAL_ORDER_DEPENDENCE,
-                                expr.span,
-                                "unsequenced read of a variable",
-                                self.write_expr.span,
-                                "whether read occurs before this write depends on evaluation order"
-                            );
-                        }
-                    }
-                }
+                if_let_chain! {[
+                    let QPath::Resolved(None, ref path) = *qpath,
+                    path.segments.len() == 1,
+                    let def::Def::Local(local_id) = self.cx.tables.qpath_def(qpath, expr.hir_id),
+                    local_id == self.var,
+                    // Check that this is a read, not a write.
+                    !is_in_assignment_position(self.cx, expr),
+                ], {
+                    span_note_and_lint(
+                        self.cx,
+                        EVAL_ORDER_DEPENDENCE,
+                        expr.span,
+                        "unsequenced read of a variable",
+                        self.write_expr.span,
+                        "whether read occurs before this write depends on evaluation order"
+                    );
+                }}
             }
             // We're about to descend a closure. Since we don't know when (or
             // if) the closure will be evaluated, any reads in it might not
diff --git a/clippy_lints/src/format.rs b/clippy_lints/src/format.rs
index 2577e29..f1a450e 100644
--- a/clippy_lints/src/format.rs
+++ b/clippy_lints/src/format.rs
@@ -5,7 +5,7 @@
 use syntax::ast::LitKind;
 use syntax::symbol::InternedString;
 use utils::paths;
-use utils::{is_expn_of, match_def_path, match_type, resolve_node, span_lint, walk_ptrs_ty};
+use utils::{is_expn_of, match_def_path, match_type, resolve_node, span_lint, walk_ptrs_ty, opt_def_id};
 
 /// **What it does:** Checks for the use of `format!("string literal with no
 /// argument")` and `format!("{}", foo)` where `foo` is a string.
@@ -47,7 +47,8 @@
                     if_let_chain!{[
                         let ExprPath(ref qpath) = fun.node,
                         args.len() == 2,
-                        match_def_path(cx.tcx, resolve_node(cx, qpath, fun.hir_id).def_id(), &paths::FMT_ARGUMENTS_NEWV1),
+                        let Some(fun_def_id) = opt_def_id(resolve_node(cx, qpath, fun.hir_id)),
+                        match_def_path(cx.tcx, fun_def_id, &paths::FMT_ARGUMENTS_NEWV1),
                         // ensure the format string is `"{..}"` with only one argument and no text
                         check_static_str(cx, &args[0]),
                         // ensure the format argument is `{}` ie. Display with no fancy option
@@ -128,7 +129,8 @@
         let ExprCall(_, ref args) = exprs[0].node,
         args.len() == 2,
         let ExprPath(ref qpath) = args[1].node,
-        match_def_path(cx.tcx, resolve_node(cx, qpath, args[1].hir_id).def_id(), &paths::DISPLAY_FMT_METHOD),
+        let Some(fun_def_id) = opt_def_id(resolve_node(cx, qpath, args[1].hir_id)),
+        match_def_path(cx.tcx, fun_def_id, &paths::DISPLAY_FMT_METHOD),
     ], {
         let ty = walk_ptrs_ty(cx.tables.pat_ty(&pat[0]));
 
diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs
index 869e621..def357c 100644
--- a/clippy_lints/src/functions.rs
+++ b/clippy_lints/src/functions.rs
@@ -2,6 +2,7 @@
 use rustc::hir;
 use rustc::lint::*;
 use rustc::ty;
+use rustc::hir::def::Def;
 use std::collections::HashSet;
 use syntax::ast;
 use syntax::abi::Abi;
@@ -166,9 +167,9 @@
     }
 }
 
-fn raw_ptr_arg(arg: &hir::Arg, ty: &hir::Ty) -> Option<hir::def_id::DefId> {
-    if let (&hir::PatKind::Binding(_, def_id, _, _), &hir::TyPtr(_)) = (&arg.pat.node, &ty.node) {
-        Some(def_id)
+fn raw_ptr_arg(arg: &hir::Arg, ty: &hir::Ty) -> Option<ast::NodeId> {
+    if let (&hir::PatKind::Binding(_, id, _, _), &hir::TyPtr(_)) = (&arg.pat.node, &ty.node) {
+        Some(id)
     } else {
         None
     }
@@ -176,7 +177,7 @@
 
 struct DerefVisitor<'a, 'tcx: 'a> {
     cx: &'a LateContext<'a, 'tcx>,
-    ptrs: HashSet<hir::def_id::DefId>,
+    ptrs: HashSet<ast::NodeId>,
     tables: &'a ty::TypeckTables<'tcx>,
 }
 
@@ -216,14 +217,15 @@
 impl<'a, 'tcx: 'a> DerefVisitor<'a, 'tcx> {
     fn check_arg(&self, ptr: &hir::Expr) {
         if let hir::ExprPath(ref qpath) = ptr.node {
-            let def = self.cx.tables.qpath_def(qpath, ptr.hir_id);
-            if self.ptrs.contains(&def.def_id()) {
-                span_lint(
-                    self.cx,
-                    NOT_UNSAFE_PTR_ARG_DEREF,
-                    ptr.span,
-                    "this public function dereferences a raw pointer but is not marked `unsafe`",
-                );
+            if let Def::Local(id) = self.cx.tables.qpath_def(qpath, ptr.hir_id) {
+                if self.ptrs.contains(&id) {
+                    span_lint(
+                        self.cx,
+                        NOT_UNSAFE_PTR_ARG_DEREF,
+                        ptr.span,
+                        "this public function dereferences a raw pointer but is not marked `unsafe`",
+                    );
+                }
             }
         }
     }
diff --git a/clippy_lints/src/let_if_seq.rs b/clippy_lints/src/let_if_seq.rs
index 9812c75..789dee6 100644
--- a/clippy_lints/src/let_if_seq.rs
+++ b/clippy_lints/src/let_if_seq.rs
@@ -1,6 +1,8 @@
 use rustc::lint::*;
 use rustc::hir;
 use rustc::hir::BindingAnnotation;
+use rustc::hir::def::Def;
+use syntax::ast;
 use utils::{snippet, span_lint_and_then};
 
 /// **What it does:** Checks for variable declarations immediately followed by a
@@ -65,19 +67,19 @@
                 let Some(expr) = it.peek(),
                 let hir::StmtDecl(ref decl, _) = stmt.node,
                 let hir::DeclLocal(ref decl) = decl.node,
-                let hir::PatKind::Binding(mode, def_id, ref name, None) = decl.pat.node,
+                let hir::PatKind::Binding(mode, canonical_id, ref name, None) = decl.pat.node,
                 let hir::StmtExpr(ref if_, _) = expr.node,
                 let hir::ExprIf(ref cond, ref then, ref else_) = if_.node,
-                !used_in_expr(cx, def_id, cond),
+                !used_in_expr(cx, canonical_id, cond),
                 let hir::ExprBlock(ref then) = then.node,
-                let Some(value) = check_assign(cx, def_id, &*then),
-                !used_in_expr(cx, def_id, value),
+                let Some(value) = check_assign(cx, canonical_id, &*then),
+                !used_in_expr(cx, canonical_id, value),
             ], {
                 let span = stmt.span.to(if_.span);
 
                 let (default_multi_stmts, default) = if let Some(ref else_) = *else_ {
                     if let hir::ExprBlock(ref else_) = else_.node {
-                        if let Some(default) = check_assign(cx, def_id, else_) {
+                        if let Some(default) = check_assign(cx, canonical_id, else_) {
                             (else_.stmts.len() > 1, default)
                         } else if let Some(ref default) = decl.init {
                             (true, &**default)
@@ -130,7 +132,7 @@
 
 struct UsedVisitor<'a, 'tcx: 'a> {
     cx: &'a LateContext<'a, 'tcx>,
-    id: hir::def_id::DefId,
+    id: ast::NodeId,
     used: bool,
 }
 
@@ -138,7 +140,8 @@
     fn visit_expr(&mut self, expr: &'tcx hir::Expr) {
         if_let_chain! {[
             let hir::ExprPath(ref qpath) = expr.node,
-            self.id == self.cx.tables.qpath_def(qpath, expr.hir_id).def_id(),
+            let Def::Local(local_id) = self.cx.tables.qpath_def(qpath, expr.hir_id),
+            self.id == local_id,
         ], {
             self.used = true;
             return;
@@ -152,7 +155,7 @@
 
 fn check_assign<'a, 'tcx>(
     cx: &LateContext<'a, 'tcx>,
-    decl: hir::def_id::DefId,
+    decl: ast::NodeId,
     block: &'tcx hir::Block,
 ) -> Option<&'tcx hir::Expr> {
     if_let_chain! {[
@@ -161,7 +164,8 @@
         let hir::StmtSemi(ref expr, _) = expr.node,
         let hir::ExprAssign(ref var, ref value) = expr.node,
         let hir::ExprPath(ref qpath) = var.node,
-        decl == cx.tables.qpath_def(qpath, var.hir_id).def_id(),
+        let Def::Local(local_id) = cx.tables.qpath_def(qpath, var.hir_id),
+        decl == local_id,
     ], {
         let mut v = UsedVisitor {
             cx: cx,
@@ -183,7 +187,7 @@
     None
 }
 
-fn used_in_expr<'a, 'tcx: 'a>(cx: &LateContext<'a, 'tcx>, id: hir::def_id::DefId, expr: &'tcx hir::Expr) -> bool {
+fn used_in_expr<'a, 'tcx: 'a>(cx: &LateContext<'a, 'tcx>, id: ast::NodeId, expr: &'tcx hir::Expr) -> bool {
     let mut v = UsedVisitor {
         cx: cx,
         id: id,
diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs
index 4452cee..f8ed042 100644
--- a/clippy_lints/src/loops.rs
+++ b/clippy_lints/src/loops.rs
@@ -2,7 +2,6 @@
 use reexport::*;
 use rustc::hir::*;
 use rustc::hir::def::Def;
-use rustc::hir::def_id::DefId;
 use rustc::hir::intravisit::{walk_block, walk_decl, walk_expr, walk_pat, walk_stmt, NestedVisitorMap, Visitor};
 use rustc::hir::map::Node::{NodeBlock, NodeExpr, NodeStmt};
 use rustc::lint::*;
@@ -594,13 +593,14 @@
     detect_manual_memcpy(cx, pat, arg, body, expr);
 }
 
-fn same_var<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &Expr, var: DefId) -> bool {
+fn same_var<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &Expr, var: ast::NodeId) -> bool {
     if_let_chain! {[
         let ExprPath(ref qpath) = expr.node,
         let QPath::Resolved(None, ref path) = *qpath,
         path.segments.len() == 1,
+        let Def::Local(local_id) = cx.tables.qpath_def(qpath, expr.hir_id),
         // our variable!
-        cx.tables.qpath_def(qpath, expr.hir_id).def_id() == var
+        local_id == var
     ], {
         return true;
     }}
@@ -644,8 +644,8 @@
     is_slice || match_type(cx, ty, &paths::VEC) || match_type(cx, ty, &paths::VEC_DEQUE)
 }
 
-fn get_fixed_offset_var<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &Expr, var: DefId) -> Option<FixedOffsetVar> {
-    fn extract_offset<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, e: &Expr, var: DefId) -> Option<String> {
+fn get_fixed_offset_var<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &Expr, var: ast::NodeId) -> Option<FixedOffsetVar> {
+    fn extract_offset<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, e: &Expr, var: ast::NodeId) -> Option<String> {
         match e.node {
             ExprLit(ref l) => match l.node {
                 ast::LitKind::Int(x, _ty) => Some(x.to_string()),
@@ -700,12 +700,12 @@
 fn get_indexed_assignments<'a, 'tcx>(
     cx: &LateContext<'a, 'tcx>,
     body: &Expr,
-    var: DefId,
+    var: ast::NodeId,
 ) -> Vec<(FixedOffsetVar, FixedOffsetVar)> {
     fn get_assignment<'a, 'tcx>(
         cx: &LateContext<'a, 'tcx>,
         e: &Expr,
-        var: DefId,
+        var: ast::NodeId,
     ) -> Option<(FixedOffsetVar, FixedOffsetVar)> {
         if let Expr_::ExprAssign(ref lhs, ref rhs) = e.node {
             match (get_fixed_offset_var(cx, lhs, var), get_fixed_offset_var(cx, rhs, var)) {
@@ -759,7 +759,7 @@
     }) = higher::range(arg)
     {
         // the var must be a single name
-        if let PatKind::Binding(_, def_id, _, _) = pat.node {
+        if let PatKind::Binding(_, canonical_id, _, _) = pat.node {
             let print_sum = |arg1: &Offset, arg2: &Offset| -> String {
                 match (&arg1.value[..], arg1.negate, &arg2.value[..], arg2.negate) {
                     ("0", _, "0", _) => "".into(),
@@ -802,7 +802,7 @@
 
             // The only statements in the for loops can be indexed assignments from
             // indexed retrievals.
-            let manual_copies = get_indexed_assignments(cx, body, def_id);
+            let manual_copies = get_indexed_assignments(cx, body, canonical_id);
 
             let big_sugg = manual_copies
                 .into_iter()
@@ -852,10 +852,10 @@
     }) = higher::range(arg)
     {
         // the var must be a single name
-        if let PatKind::Binding(_, def_id, ref ident, _) = pat.node {
+        if let PatKind::Binding(_, canonical_id, ref ident, _) = pat.node {
             let mut visitor = VarVisitor {
                 cx: cx,
-                var: def_id,
+                var: canonical_id,
                 indexed: HashMap::new(),
                 referenced: HashSet::new(),
                 nonindex: false,
@@ -1298,15 +1298,15 @@
     }
 }
 
-struct DefIdUsedVisitor<'a, 'tcx: 'a> {
+struct LocalUsedVisitor <'a, 'tcx: 'a> {
     cx: &'a LateContext<'a, 'tcx>,
-    def_id: DefId,
+    local: ast::NodeId,
     used: bool,
 }
 
-impl<'a, 'tcx: 'a> Visitor<'tcx> for DefIdUsedVisitor<'a, 'tcx> {
+impl<'a, 'tcx: 'a> Visitor<'tcx> for LocalUsedVisitor<'a, 'tcx> {
     fn visit_expr(&mut self, expr: &'tcx Expr) {
-        if same_var(self.cx, expr, self.def_id) {
+        if same_var(self.cx, expr, self.local) {
             self.used = true;
         } else {
             walk_expr(self, expr);
@@ -1322,7 +1322,7 @@
     /// context reference
     cx: &'a LateContext<'a, 'tcx>,
     /// var name to look for as index
-    var: DefId,
+    var: ast::NodeId,
     /// indexed variables, the extend is `None` for global
     indexed: HashMap<Name, Option<region::Scope>>,
     /// Any names that are used outside an index operation.
@@ -1344,9 +1344,9 @@
             seqvar.segments.len() == 1,
         ], {
             let index_used = same_var(self.cx, idx, self.var) || {
-                let mut used_visitor = DefIdUsedVisitor {
+                let mut used_visitor = LocalUsedVisitor {
                     cx: self.cx,
-                    def_id: self.var,
+                    local: self.var,
                     used: false,
                 };
                 walk_expr(&mut used_visitor, idx);
@@ -1356,9 +1356,7 @@
             if index_used {
                 let def = self.cx.tables.qpath_def(seqpath, seqexpr.hir_id);
                 match def {
-                    Def::Local(..) | Def::Upvar(..) => {
-                        let def_id = def.def_id();
-                        let node_id = self.cx.tcx.hir.as_local_node_id(def_id).expect("local/upvar are local nodes");
+                    Def::Local(node_id) | Def::Upvar(node_id, ..) => {
                         let hir_id = self.cx.tcx.hir.node_to_hir_id(node_id);
 
                         let parent_id = self.cx.tcx.hir.get_parent(expr.id);
@@ -1381,8 +1379,9 @@
             let ExprPath(ref qpath) = expr.node,
             let QPath::Resolved(None, ref path) = *qpath,
             path.segments.len() == 1,
+            let Def::Local(local_id) = self.cx.tables.qpath_def(qpath, expr.hir_id),
         ], {
-            if self.cx.tables.qpath_def(qpath, expr.hir_id).def_id() == self.var {
+            if local_id == self.var {
                 // we are not indexing anything, record that
                 self.nonindex = true;
             } else {
@@ -1672,11 +1671,7 @@
 fn var_def_id(cx: &LateContext, expr: &Expr) -> Option<NodeId> {
     if let ExprPath(ref qpath) = expr.node {
         let path_res = cx.tables.qpath_def(qpath, expr.hir_id);
-        if let Def::Local(def_id) = path_res {
-            let node_id = cx.tcx
-                .hir
-                .as_local_node_id(def_id)
-                .expect("That DefId should be valid");
+        if let Def::Local(node_id) = path_res {
             return Some(node_id);
         }
     }
diff --git a/clippy_lints/src/mem_forget.rs b/clippy_lints/src/mem_forget.rs
index 9058d0d..43409ea 100644
--- a/clippy_lints/src/mem_forget.rs
+++ b/clippy_lints/src/mem_forget.rs
@@ -1,6 +1,6 @@
 use rustc::lint::*;
 use rustc::hir::{Expr, ExprCall, ExprPath};
-use utils::{match_def_path, paths, span_lint};
+use utils::{match_def_path, paths, span_lint, opt_def_id};
 
 /// **What it does:** Checks for usage of `std::mem::forget(t)` where `t` is
 /// `Drop`.
@@ -32,15 +32,16 @@
     fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) {
         if let ExprCall(ref path_expr, ref args) = e.node {
             if let ExprPath(ref qpath) = path_expr.node {
-                let def_id = cx.tables.qpath_def(qpath, path_expr.hir_id).def_id();
-                if match_def_path(cx.tcx, def_id, &paths::MEM_FORGET) {
-                    let forgot_ty = cx.tables.expr_ty(&args[0]);
+                if let Some(def_id) = opt_def_id(cx.tables.qpath_def(qpath, path_expr.hir_id)) {
+                    if match_def_path(cx.tcx, def_id, &paths::MEM_FORGET) {
+                        let forgot_ty = cx.tables.expr_ty(&args[0]);
 
-                    if match forgot_ty.ty_adt_def() {
-                        Some(def) => def.has_dtor(cx.tcx),
-                        _ => false,
-                    } {
-                        span_lint(cx, MEM_FORGET, e.span, "usage of mem::forget on Drop type");
+                        if match forgot_ty.ty_adt_def() {
+                            Some(def) => def.has_dtor(cx.tcx),
+                            _ => false,
+                        } {
+                            span_lint(cx, MEM_FORGET, e.span, "usage of mem::forget on Drop type");
+                        }
                     }
                 }
             }
diff --git a/clippy_lints/src/minmax.rs b/clippy_lints/src/minmax.rs
index aea9231..bcdbd73 100644
--- a/clippy_lints/src/minmax.rs
+++ b/clippy_lints/src/minmax.rs
@@ -2,7 +2,7 @@
 use rustc::lint::*;
 use rustc::hir::*;
 use std::cmp::{Ordering, PartialOrd};
-use utils::{match_def_path, paths, span_lint};
+use utils::{match_def_path, paths, span_lint, opt_def_id};
 
 /// **What it does:** Checks for expressions where `std::cmp::min` and `max` are
 /// used to clamp values, but switched so that the result is constant.
@@ -60,15 +60,15 @@
 fn min_max<'a>(cx: &LateContext, expr: &'a Expr) -> Option<(MinMax, Constant, &'a Expr)> {
     if let ExprCall(ref path, ref args) = expr.node {
         if let ExprPath(ref qpath) = path.node {
-            let def_id = cx.tables.qpath_def(qpath, path.hir_id).def_id();
-
-            if match_def_path(cx.tcx, def_id, &paths::CMP_MIN) {
-                fetch_const(cx, args, MinMax::Min)
-            } else if match_def_path(cx.tcx, def_id, &paths::CMP_MAX) {
-                fetch_const(cx, args, MinMax::Max)
-            } else {
-                None
-            }
+            opt_def_id(cx.tables.qpath_def(qpath, path.hir_id)).and_then(|def_id| {
+                if match_def_path(cx.tcx, def_id, &paths::CMP_MIN) {
+                    fetch_const(cx, args, MinMax::Min)
+                } else if match_def_path(cx.tcx, def_id, &paths::CMP_MAX) {
+                    fetch_const(cx, args, MinMax::Max)
+                } else {
+                    None
+                }
+            })
         } else {
             None
         }
diff --git a/clippy_lints/src/misc.rs b/clippy_lints/src/misc.rs
index fcb2943..2c76410 100644
--- a/clippy_lints/src/misc.rs
+++ b/clippy_lints/src/misc.rs
@@ -574,11 +574,7 @@
 /// Test whether `def` is a variable defined outside a macro.
 fn non_macro_local(cx: &LateContext, def: &def::Def) -> bool {
     match *def {
-        def::Def::Local(def_id) | def::Def::Upvar(def_id, _, _) => {
-            let id = cx.tcx
-                .hir
-                .as_local_node_id(def_id)
-                .expect("local variables should be found in the same crate");
+        def::Def::Local(id) | def::Def::Upvar(id, _, _) => {
             !in_macro(cx.tcx.hir.span(id))
         },
         _ => false,
diff --git a/clippy_lints/src/needless_pass_by_value.rs b/clippy_lints/src/needless_pass_by_value.rs
index da3bfc7..4a7a042 100644
--- a/clippy_lints/src/needless_pass_by_value.rs
+++ b/clippy_lints/src/needless_pass_by_value.rs
@@ -1,6 +1,5 @@
 use rustc::hir::*;
 use rustc::hir::intravisit::FnKind;
-use rustc::hir::def_id::DefId;
 use rustc::lint::*;
 use rustc::ty::{self, TypeFoldable};
 use rustc::traits;
@@ -129,8 +128,8 @@
                 !implements_trait(cx, ty, asref_trait, &[]),
                 !implements_borrow_trait,
 
-                let PatKind::Binding(mode, defid, ..) = arg.pat.node,
-                !moved_vars.contains(&defid),
+                let PatKind::Binding(mode, canonical_id, ..) = arg.pat.node,
+                !moved_vars.contains(&canonical_id),
             ], {
                 // Note: `toplevel_ref_arg` warns if `BindByRef`
                 if mode == BindingAnnotation::Mutable || mode == BindingAnnotation::RefMut {
@@ -139,7 +138,7 @@
 
                 // Suggestion logic
                 let sugg = |db: &mut DiagnosticBuilder| {
-                    let deref_span = spans_need_deref.get(&defid);
+                    let deref_span = spans_need_deref.get(&canonical_id);
                     if_let_chain! {[
                         match_type(cx, ty, &paths::VEC),
                         let TyPath(QPath::Resolved(_, ref path)) = input.node,
@@ -186,11 +185,11 @@
 
 struct MovedVariablesCtxt<'a, 'tcx: 'a> {
     cx: &'a LateContext<'a, 'tcx>,
-    moved_vars: HashSet<DefId>,
+    moved_vars: HashSet<NodeId>,
     /// Spans which need to be prefixed with `*` for dereferencing the
     /// suggested additional
     /// reference.
-    spans_need_deref: HashMap<DefId, HashSet<Span>>,
+    spans_need_deref: HashMap<NodeId, HashSet<Span>>,
 }
 
 impl<'a, 'tcx> MovedVariablesCtxt<'a, 'tcx> {
@@ -205,12 +204,9 @@
     fn move_common(&mut self, _consume_id: NodeId, _span: Span, cmt: mc::cmt<'tcx>) {
         let cmt = unwrap_downcast_or_interior(cmt);
 
-        if_let_chain! {[
-            let mc::Categorization::Local(vid) = cmt.cat,
-            let Some(def_id) = self.cx.tcx.hir.opt_local_def_id(vid),
-        ], {
-                self.moved_vars.insert(def_id);
-        }}
+        if let mc::Categorization::Local(vid) = cmt.cat {
+            self.moved_vars.insert(vid);
+        }
     }
 
     fn non_moving_pat(&mut self, matched_pat: &Pat, cmt: mc::cmt<'tcx>) {
@@ -218,7 +214,6 @@
 
         if_let_chain! {[
             let mc::Categorization::Local(vid) = cmt.cat,
-            let Some(def_id) = self.cx.tcx.hir.opt_local_def_id(vid),
         ], {
             let mut id = matched_pat.id;
             loop {
@@ -235,7 +230,7 @@
                             // `match` and `if let`
                             if let ExprMatch(ref c, ..) = e.node {
                                 self.spans_need_deref
-                                    .entry(def_id)
+                                    .entry(vid)
                                     .or_insert_with(HashSet::new)
                                     .insert(c.span);
                             }
@@ -248,7 +243,7 @@
                                 let DeclLocal(ref local) = decl.node,
                             ], {
                                 self.spans_need_deref
-                                    .entry(def_id)
+                                    .entry(vid)
                                     .or_insert_with(HashSet::new)
                                     .insert(local.init
                                         .as_ref()
diff --git a/clippy_lints/src/panic.rs b/clippy_lints/src/panic.rs
index a050873..f042853 100644
--- a/clippy_lints/src/panic.rs
+++ b/clippy_lints/src/panic.rs
@@ -1,7 +1,7 @@
 use rustc::hir::*;
 use rustc::lint::*;
 use syntax::ast::LitKind;
-use utils::{is_direct_expn_of, match_def_path, paths, resolve_node, span_lint};
+use utils::{is_direct_expn_of, match_def_path, paths, resolve_node, span_lint, opt_def_id};
 
 /// **What it does:** Checks for missing parameters in `panic!`.
 ///
@@ -40,7 +40,8 @@
             let ExprCall(ref fun, ref params) = ex.node,
             params.len() == 2,
             let ExprPath(ref qpath) = fun.node,
-            match_def_path(cx.tcx, resolve_node(cx, qpath, fun.hir_id).def_id(), &paths::BEGIN_PANIC),
+            let Some(fun_def_id) = opt_def_id(resolve_node(cx, qpath, fun.hir_id)),
+            match_def_path(cx.tcx, fun_def_id, &paths::BEGIN_PANIC),
             let ExprLit(ref lit) = params[0].node,
             is_direct_expn_of(expr.span, "panic").is_some(),
             let LitKind::Str(ref string, _) = lit.node,
diff --git a/clippy_lints/src/print.rs b/clippy_lints/src/print.rs
index 9aca754..1f24a7a 100644
--- a/clippy_lints/src/print.rs
+++ b/clippy_lints/src/print.rs
@@ -1,7 +1,7 @@
 use rustc::hir::*;
 use rustc::hir::map::Node::{NodeImplItem, NodeItem};
 use rustc::lint::*;
-use utils::paths;
+use utils::{paths, opt_def_id};
 use utils::{is_expn_of, match_def_path, match_path, resolve_node, span_lint};
 use format::get_argument_fmtstr_parts;
 
@@ -72,9 +72,8 @@
         if_let_chain! {[
             let ExprCall(ref fun, ref args) = expr.node,
             let ExprPath(ref qpath) = fun.node,
+            let Some(fun_id) = opt_def_id(resolve_node(cx, qpath, fun.hir_id)),
         ], {
-            let fun = resolve_node(cx, qpath, fun.hir_id);
-            let fun_id = fun.def_id();
 
             // Search for `std::io::_print(..)` which is unique in a
             // `print!` expansion.
@@ -96,9 +95,8 @@
                         args.len() == 1,
                         let ExprCall(ref args_fun, ref args_args) = args[0].node,
                         let ExprPath(ref qpath) = args_fun.node,
-                        match_def_path(cx.tcx,
-                                       resolve_node(cx, qpath, args_fun.hir_id).def_id(),
-                                       &paths::FMT_ARGUMENTS_NEWV1),
+                        let Some(const_def_id) = opt_def_id(resolve_node(cx, qpath, args_fun.hir_id)),
+                        match_def_path(cx.tcx, const_def_id, &paths::FMT_ARGUMENTS_NEWV1),
                         args_args.len() == 2,
                         let ExprAddrOf(_, ref match_expr) = args_args[1].node,
                         let ExprMatch(ref args, _, _) = match_expr.node,
@@ -125,10 +123,10 @@
             // `::std::fmt::ArgumentV1::new(__arg0, ::std::fmt::Debug::fmt)`
             else if args.len() == 2 && match_def_path(cx.tcx, fun_id, &paths::FMT_ARGUMENTV1_NEW) {
                 if let ExprPath(ref qpath) = args[1].node {
-                    let def_id = cx.tables.qpath_def(qpath, args[1].hir_id).def_id();
-                    if match_def_path(cx.tcx, def_id, &paths::DEBUG_FMT_METHOD) && !is_in_debug_impl(cx, expr) &&
-                       is_expn_of(expr.span, "panic").is_none() {
-                        span_lint(cx, USE_DEBUG, args[0].span, "use of `Debug`-based formatting");
+                    if let Some(def_id) = opt_def_id(cx.tables.qpath_def(qpath, args[1].hir_id)) {
+                        if match_def_path(cx.tcx, def_id, &paths::DEBUG_FMT_METHOD) && !is_in_debug_impl(cx, expr) && is_expn_of(expr.span, "panic").is_none() {
+                            span_lint(cx, USE_DEBUG, args[0].span, "use of `Debug`-based formatting");
+                        }
                     }
                 }
             }
diff --git a/clippy_lints/src/regex.rs b/clippy_lints/src/regex.rs
index 8b5dedf..a18bf62 100644
--- a/clippy_lints/src/regex.rs
+++ b/clippy_lints/src/regex.rs
@@ -9,7 +9,7 @@
 use syntax::ast::{LitKind, NodeId};
 use syntax::codemap::{BytePos, Span};
 use syntax::symbol::InternedString;
-use utils::{is_expn_of, match_def_path, match_type, paths, span_help_and_lint, span_lint};
+use utils::{is_expn_of, match_def_path, match_type, paths, span_help_and_lint, span_lint, opt_def_id};
 
 /// **What it does:** Checks [regex](https://crates.io/crates/regex) creation
 /// (with `Regex::new`,`RegexBuilder::new` or `RegexSet::new`) for correct
@@ -116,8 +116,8 @@
             let ExprCall(ref fun, ref args) = expr.node,
             let ExprPath(ref qpath) = fun.node,
             args.len() == 1,
+            let Some(def_id) = opt_def_id(cx.tables.qpath_def(qpath, fun.hir_id)),
         ], {
-            let def_id = cx.tables.qpath_def(qpath, fun.hir_id).def_id();
             if match_def_path(cx.tcx, def_id, &paths::REGEX_NEW) ||
                match_def_path(cx.tcx, def_id, &paths::REGEX_BUILDER_NEW) {
                 check_regex(cx, &args[0], true);
diff --git a/clippy_lints/src/transmute.rs b/clippy_lints/src/transmute.rs
index a590bf7..18b80c7 100644
--- a/clippy_lints/src/transmute.rs
+++ b/clippy_lints/src/transmute.rs
@@ -2,7 +2,7 @@
 use rustc::ty::{self, Ty};
 use rustc::hir::*;
 use utils::{last_path_segment, match_def_path, paths, snippet, span_lint, span_lint_and_then};
-use utils::sugg;
+use utils::{sugg, opt_def_id};
 
 /// **What it does:** Checks for transmutes that can't ever be correct on any
 /// architecture.
@@ -88,97 +88,98 @@
     fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) {
         if let ExprCall(ref path_expr, ref args) = e.node {
             if let ExprPath(ref qpath) = path_expr.node {
-                let def_id = cx.tables.qpath_def(qpath, path_expr.hir_id).def_id();
+                if let Some(def_id) = opt_def_id(cx.tables.qpath_def(qpath, path_expr.hir_id)) {
 
-                if match_def_path(cx.tcx, def_id, &paths::TRANSMUTE) {
-                    let from_ty = cx.tables.expr_ty(&args[0]);
-                    let to_ty = cx.tables.expr_ty(e);
+                    if match_def_path(cx.tcx, def_id, &paths::TRANSMUTE) {
+                        let from_ty = cx.tables.expr_ty(&args[0]);
+                        let to_ty = cx.tables.expr_ty(e);
 
-                    match (&from_ty.sty, &to_ty.sty) {
-                        _ if from_ty == to_ty => span_lint(
-                            cx,
-                            USELESS_TRANSMUTE,
-                            e.span,
-                            &format!("transmute from a type (`{}`) to itself", from_ty),
-                        ),
-                        (&ty::TyRef(_, rty), &ty::TyRawPtr(ptr_ty)) => span_lint_and_then(
-                            cx,
-                            USELESS_TRANSMUTE,
-                            e.span,
-                            "transmute from a reference to a pointer",
-                            |db| if let Some(arg) = sugg::Sugg::hir_opt(cx, &args[0]) {
-                                let sugg = if ptr_ty == rty {
-                                    arg.as_ty(to_ty)
-                                } else {
-                                    arg.as_ty(cx.tcx.mk_ptr(rty)).as_ty(to_ty)
-                                };
-
-                                db.span_suggestion(e.span, "try", sugg.to_string());
-                            },
-                        ),
-                        (&ty::TyInt(_), &ty::TyRawPtr(_)) | (&ty::TyUint(_), &ty::TyRawPtr(_)) => span_lint_and_then(
-                            cx,
-                            USELESS_TRANSMUTE,
-                            e.span,
-                            "transmute from an integer to a pointer",
-                            |db| if let Some(arg) = sugg::Sugg::hir_opt(cx, &args[0]) {
-                                db.span_suggestion(e.span, "try", arg.as_ty(&to_ty.to_string()).to_string());
-                            },
-                        ),
-                        (&ty::TyFloat(_), &ty::TyRef(..)) |
-                        (&ty::TyFloat(_), &ty::TyRawPtr(_)) |
-                        (&ty::TyChar, &ty::TyRef(..)) |
-                        (&ty::TyChar, &ty::TyRawPtr(_)) => span_lint(
-                            cx,
-                            WRONG_TRANSMUTE,
-                            e.span,
-                            &format!("transmute from a `{}` to a pointer", from_ty),
-                        ),
-                        (&ty::TyRawPtr(from_ptr), _) if from_ptr.ty == to_ty => span_lint(
-                            cx,
-                            CROSSPOINTER_TRANSMUTE,
-                            e.span,
-                            &format!(
-                                "transmute from a type (`{}`) to the type that it points to (`{}`)",
-                                from_ty,
-                                to_ty
+                        match (&from_ty.sty, &to_ty.sty) {
+                            _ if from_ty == to_ty => span_lint(
+                                cx,
+                                USELESS_TRANSMUTE,
+                                e.span,
+                                &format!("transmute from a type (`{}`) to itself", from_ty),
                             ),
-                        ),
-                        (_, &ty::TyRawPtr(to_ptr)) if to_ptr.ty == from_ty => span_lint(
-                            cx,
-                            CROSSPOINTER_TRANSMUTE,
-                            e.span,
-                            &format!("transmute from a type (`{}`) to a pointer to that type (`{}`)", from_ty, to_ty),
-                        ),
-                        (&ty::TyRawPtr(from_pty), &ty::TyRef(_, to_rty)) => span_lint_and_then(
-                            cx,
-                            TRANSMUTE_PTR_TO_REF,
-                            e.span,
-                            &format!(
-                                "transmute from a pointer type (`{}`) to a reference type \
-                                 (`{}`)",
-                                from_ty,
-                                to_ty
+                            (&ty::TyRef(_, rty), &ty::TyRawPtr(ptr_ty)) => span_lint_and_then(
+                                cx,
+                                USELESS_TRANSMUTE,
+                                e.span,
+                                "transmute from a reference to a pointer",
+                                |db| if let Some(arg) = sugg::Sugg::hir_opt(cx, &args[0]) {
+                                    let sugg = if ptr_ty == rty {
+                                        arg.as_ty(to_ty)
+                                    } else {
+                                        arg.as_ty(cx.tcx.mk_ptr(rty)).as_ty(to_ty)
+                                    };
+
+                                    db.span_suggestion(e.span, "try", sugg.to_string());
+                                },
                             ),
-                            |db| {
-                                let arg = sugg::Sugg::hir(cx, &args[0], "..");
-                                let (deref, cast) = if to_rty.mutbl == Mutability::MutMutable {
-                                    ("&mut *", "*mut")
-                                } else {
-                                    ("&*", "*const")
-                                };
+                            (&ty::TyInt(_), &ty::TyRawPtr(_)) | (&ty::TyUint(_), &ty::TyRawPtr(_)) => span_lint_and_then(
+                                cx,
+                                USELESS_TRANSMUTE,
+                                e.span,
+                                "transmute from an integer to a pointer",
+                                |db| if let Some(arg) = sugg::Sugg::hir_opt(cx, &args[0]) {
+                                    db.span_suggestion(e.span, "try", arg.as_ty(&to_ty.to_string()).to_string());
+                                },
+                            ),
+                            (&ty::TyFloat(_), &ty::TyRef(..)) |
+                            (&ty::TyFloat(_), &ty::TyRawPtr(_)) |
+                            (&ty::TyChar, &ty::TyRef(..)) |
+                            (&ty::TyChar, &ty::TyRawPtr(_)) => span_lint(
+                                cx,
+                                WRONG_TRANSMUTE,
+                                e.span,
+                                &format!("transmute from a `{}` to a pointer", from_ty),
+                            ),
+                            (&ty::TyRawPtr(from_ptr), _) if from_ptr.ty == to_ty => span_lint(
+                                cx,
+                                CROSSPOINTER_TRANSMUTE,
+                                e.span,
+                                &format!(
+                                    "transmute from a type (`{}`) to the type that it points to (`{}`)",
+                                    from_ty,
+                                    to_ty
+                                ),
+                            ),
+                            (_, &ty::TyRawPtr(to_ptr)) if to_ptr.ty == from_ty => span_lint(
+                                cx,
+                                CROSSPOINTER_TRANSMUTE,
+                                e.span,
+                                &format!("transmute from a type (`{}`) to a pointer to that type (`{}`)", from_ty, to_ty),
+                            ),
+                            (&ty::TyRawPtr(from_pty), &ty::TyRef(_, to_rty)) => span_lint_and_then(
+                                cx,
+                                TRANSMUTE_PTR_TO_REF,
+                                e.span,
+                                &format!(
+                                    "transmute from a pointer type (`{}`) to a reference type \
+                                    (`{}`)",
+                                    from_ty,
+                                    to_ty
+                                ),
+                                |db| {
+                                    let arg = sugg::Sugg::hir(cx, &args[0], "..");
+                                    let (deref, cast) = if to_rty.mutbl == Mutability::MutMutable {
+                                        ("&mut *", "*mut")
+                                    } else {
+                                        ("&*", "*const")
+                                    };
 
-                                let arg = if from_pty.ty == to_rty.ty {
-                                    arg
-                                } else {
-                                    arg.as_ty(&format!("{} {}", cast, get_type_snippet(cx, qpath, to_rty.ty)))
-                                };
+                                    let arg = if from_pty.ty == to_rty.ty {
+                                        arg
+                                    } else {
+                                        arg.as_ty(&format!("{} {}", cast, get_type_snippet(cx, qpath, to_rty.ty)))
+                                    };
 
-                                db.span_suggestion(e.span, "try", sugg::make_unop(deref, arg).to_string());
-                            },
-                        ),
-                        _ => return,
-                    };
+                                    db.span_suggestion(e.span, "try", sugg::make_unop(deref, arg).to_string());
+                                },
+                            ),
+                            _ => return,
+                        };
+                    }
                 }
             }
         }
diff --git a/clippy_lints/src/utils/higher.rs b/clippy_lints/src/utils/higher.rs
index 09e40ae..550eced 100644
--- a/clippy_lints/src/utils/higher.rs
+++ b/clippy_lints/src/utils/higher.rs
@@ -6,7 +6,7 @@
 use rustc::hir;
 use rustc::lint::LateContext;
 use syntax::ast;
-use utils::{is_expn_of, match_def_path, match_qpath, paths, resolve_node};
+use utils::{is_expn_of, match_def_path, match_qpath, paths, resolve_node, opt_def_id};
 
 /// Convert a hir binary operator to the corresponding `ast` type.
 pub fn binop(op: hir::BinOp_) -> ast::BinOpKind {
@@ -181,13 +181,13 @@
         let hir::ExprCall(ref fun, ref args) = expr.node,
         let hir::ExprPath(ref path) = fun.node,
         is_expn_of(fun.span, "vec").is_some(),
+        let Some(fun_def_id) = opt_def_id(resolve_node(cx, path, fun.hir_id)),
     ], {
-        let fun_def = resolve_node(cx, path, fun.hir_id);
-        return if match_def_path(cx.tcx, fun_def.def_id(), &paths::VEC_FROM_ELEM) && args.len() == 2 {
+        return if match_def_path(cx.tcx, fun_def_id, &paths::VEC_FROM_ELEM) && args.len() == 2 {
             // `vec![elem; size]` case
             Some(VecArgs::Repeat(&args[0], &args[1]))
         }
-        else if match_def_path(cx.tcx, fun_def.def_id(), &paths::SLICE_INTO_VEC) && args.len() == 1 {
+        else if match_def_path(cx.tcx, fun_def_id, &paths::SLICE_INTO_VEC) && args.len() == 1 {
             // `vec![a, b, c]` case
             if_let_chain!{[
                 let hir::ExprBox(ref boxed) = args[0].node,
diff --git a/clippy_lints/src/utils/inspector.rs b/clippy_lints/src/utils/inspector.rs
index e74f163..bf3aa3f 100644
--- a/clippy_lints/src/utils/inspector.rs
+++ b/clippy_lints/src/utils/inspector.rs
@@ -360,7 +360,8 @@
     }
     match item.node {
         hir::ItemExternCrate(ref _renamed_from) => {
-            if let Some(crate_id) = cx.tcx.extern_mod_stmt_cnum(item.hir_id) {
+            let def_id = cx.tcx.hir.local_def_id(item.id);
+            if let Some(crate_id) = cx.tcx.extern_mod_stmt_cnum(def_id) {
                 let source = cx.tcx.used_crate_source(crate_id);
                 if let Some(ref src) = source.dylib {
                     println!("extern crate dylib source: {:?}", src.0);
diff --git a/clippy_lints/src/utils/mod.rs b/clippy_lints/src/utils/mod.rs
index 8e816ff..5157d41 100644
--- a/clippy_lints/src/utils/mod.rs
+++ b/clippy_lints/src/utils/mod.rs
@@ -950,12 +950,10 @@
         Def::Method(id) |
         Def::Const(id) |
         Def::AssociatedConst(id) |
-        Def::Local(id) |
-        Def::Upvar(id, ..) |
         Def::Macro(id, ..) |
         Def::GlobalAsm(id) => Some(id),
 
-        Def::Label(..) | Def::PrimTy(..) | Def::SelfTy(..) | Def::Err => None,
+        Def::Upvar(..) | Def::Local(_) | Def::Label(..) | Def::PrimTy(..) | Def::SelfTy(..) | Def::Err => None,
     }
 }
 
@@ -991,7 +989,8 @@
             match_qpath(path, &paths::RESULT_OK[1..]),
             let PatKind::Binding(_, defid, _, None) = pat[0].node,
             let ExprPath(QPath::Resolved(None, ref path)) = arm.body.node,
-            path.def.def_id() == defid,
+            let Def::Local(lid) = path.def,
+            lid == defid,
         ], {
             return true;
         }}