diff --git a/src/librustc/middle/dead.rs b/src/librustc/middle/dead.rs index caf73096ebf5e..c846b627d8926 100644 --- a/src/librustc/middle/dead.rs +++ b/src/librustc/middle/dead.rs @@ -96,7 +96,11 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> { } fn lookup_and_handle_method(&mut self, id: hir::HirId) { - self.check_def_id(self.tables.type_dependent_defs()[id].def_id()); + if let Some(def) = self.tables.type_dependent_defs().get(id) { + self.check_def_id(def.def_id()); + } else { + bug!("no type-dependent def for method"); + } } fn handle_field_access(&mut self, lhs: &hir::Expr, node_id: ast::NodeId) { diff --git a/src/librustc/middle/reachable.rs b/src/librustc/middle/reachable.rs index 95829346ede8f..476f3f5799daf 100644 --- a/src/librustc/middle/reachable.rs +++ b/src/librustc/middle/reachable.rs @@ -120,7 +120,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ReachableContext<'a, 'tcx> { Some(self.tables.qpath_def(qpath, expr.hir_id)) } hir::ExprMethodCall(..) => { - Some(self.tables.type_dependent_defs()[expr.hir_id]) + self.tables.type_dependent_defs().get(expr.hir_id).cloned() } _ => None }; diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index b4dc5f9c85b0b..05aa57d8cc5d7 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -1004,10 +1004,15 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnconditionalRecursion { // Check for method calls and overloaded operators. if cx.tables.is_method_call(expr) { let hir_id = cx.tcx.hir.definitions().node_to_hir_id(id); - let def_id = cx.tables.type_dependent_defs()[hir_id].def_id(); - let substs = cx.tables.node_substs(hir_id); - if method_call_refers_to_method(cx, method, def_id, substs, id) { - return true; + if let Some(def) = cx.tables.type_dependent_defs().get(hir_id) { + let def_id = def.def_id(); + let substs = cx.tables.node_substs(hir_id); + if method_call_refers_to_method(cx, method, def_id, substs, id) { + return true; + } + } else { + cx.tcx.sess.delay_span_bug(expr.span, + "no type-dependent def for method call"); } } diff --git a/src/librustc_mir/hair/cx/expr.rs b/src/librustc_mir/hair/cx/expr.rs index 9c6c35a340e2f..8c73771e57b22 100644 --- a/src/librustc_mir/hair/cx/expr.rs +++ b/src/librustc_mir/hair/cx/expr.rs @@ -692,8 +692,11 @@ fn method_callee<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>, -> Expr<'tcx> { let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); let (def_id, substs) = custom_callee.unwrap_or_else(|| { - (cx.tables().type_dependent_defs()[expr.hir_id].def_id(), - cx.tables().node_substs(expr.hir_id)) + if let Some(def) = cx.tables().type_dependent_defs().get(expr.hir_id) { + (def.def_id(), cx.tables().node_substs(expr.hir_id)) + } else { + span_bug!(expr.span, "no type-dependent def for method callee") + } }); let ty = cx.tcx().mk_fn_def(def_id, substs); Expr { diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 2aecbf32ec5a1..157da5ee6d5ee 100644 --- a/src/librustc_privacy/lib.rs +++ b/src/librustc_privacy/lib.rs @@ -795,10 +795,15 @@ impl<'a, 'tcx> Visitor<'tcx> for TypePrivacyVisitor<'a, 'tcx> { } hir::ExprMethodCall(_, span, _) => { // Method calls have to be checked specially. - let def_id = self.tables.type_dependent_defs()[expr.hir_id].def_id(); self.span = span; - if self.tcx.type_of(def_id).visit_with(self) { - return; + if let Some(def) = self.tables.type_dependent_defs().get(expr.hir_id) { + let def_id = def.def_id(); + if self.tcx.type_of(def_id).visit_with(self) { + return; + } + } else { + self.tcx.sess.delay_span_bug(expr.span, + "no type-dependent def for method call"); } } _ => {}