Skip to content

Commit d94b804

Browse files
committed
Auto merge of #51882 - varkor:check-type_dependent_defs, r=estebank
Always check type_dependent_defs Directly indexing into `type_dependent_defs` has caused multiple ICEs in the past (#46771, #49241, etc.) and is almost certainly responsible for #51798 too. This PR ensures we always check `type_dependent_defs` first, which should prevent any more of these (or at least make them easier to track down).
2 parents a1703ba + 4071adf commit d94b804

File tree

5 files changed

+28
-11
lines changed

5 files changed

+28
-11
lines changed

src/librustc/middle/dead.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,11 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
9696
}
9797

9898
fn lookup_and_handle_method(&mut self, id: hir::HirId) {
99-
self.check_def_id(self.tables.type_dependent_defs()[id].def_id());
99+
if let Some(def) = self.tables.type_dependent_defs().get(id) {
100+
self.check_def_id(def.def_id());
101+
} else {
102+
bug!("no type-dependent def for method");
103+
}
100104
}
101105

102106
fn handle_field_access(&mut self, lhs: &hir::Expr, node_id: ast::NodeId) {

src/librustc/middle/reachable.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ReachableContext<'a, 'tcx> {
120120
Some(self.tables.qpath_def(qpath, expr.hir_id))
121121
}
122122
hir::ExprMethodCall(..) => {
123-
Some(self.tables.type_dependent_defs()[expr.hir_id])
123+
self.tables.type_dependent_defs().get(expr.hir_id).cloned()
124124
}
125125
_ => None
126126
};

src/librustc_lint/builtin.rs

+9-4
Original file line numberDiff line numberDiff line change
@@ -1004,10 +1004,15 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnconditionalRecursion {
10041004
// Check for method calls and overloaded operators.
10051005
if cx.tables.is_method_call(expr) {
10061006
let hir_id = cx.tcx.hir.definitions().node_to_hir_id(id);
1007-
let def_id = cx.tables.type_dependent_defs()[hir_id].def_id();
1008-
let substs = cx.tables.node_substs(hir_id);
1009-
if method_call_refers_to_method(cx, method, def_id, substs, id) {
1010-
return true;
1007+
if let Some(def) = cx.tables.type_dependent_defs().get(hir_id) {
1008+
let def_id = def.def_id();
1009+
let substs = cx.tables.node_substs(hir_id);
1010+
if method_call_refers_to_method(cx, method, def_id, substs, id) {
1011+
return true;
1012+
}
1013+
} else {
1014+
cx.tcx.sess.delay_span_bug(expr.span,
1015+
"no type-dependent def for method call");
10111016
}
10121017
}
10131018

src/librustc_mir/hair/cx/expr.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -692,8 +692,11 @@ fn method_callee<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
692692
-> Expr<'tcx> {
693693
let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id);
694694
let (def_id, substs) = custom_callee.unwrap_or_else(|| {
695-
(cx.tables().type_dependent_defs()[expr.hir_id].def_id(),
696-
cx.tables().node_substs(expr.hir_id))
695+
if let Some(def) = cx.tables().type_dependent_defs().get(expr.hir_id) {
696+
(def.def_id(), cx.tables().node_substs(expr.hir_id))
697+
} else {
698+
span_bug!(expr.span, "no type-dependent def for method callee")
699+
}
697700
});
698701
let ty = cx.tcx().mk_fn_def(def_id, substs);
699702
Expr {

src/librustc_privacy/lib.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -795,10 +795,15 @@ impl<'a, 'tcx> Visitor<'tcx> for TypePrivacyVisitor<'a, 'tcx> {
795795
}
796796
hir::ExprMethodCall(_, span, _) => {
797797
// Method calls have to be checked specially.
798-
let def_id = self.tables.type_dependent_defs()[expr.hir_id].def_id();
799798
self.span = span;
800-
if self.tcx.type_of(def_id).visit_with(self) {
801-
return;
799+
if let Some(def) = self.tables.type_dependent_defs().get(expr.hir_id) {
800+
let def_id = def.def_id();
801+
if self.tcx.type_of(def_id).visit_with(self) {
802+
return;
803+
}
804+
} else {
805+
self.tcx.sess.delay_span_bug(expr.span,
806+
"no type-dependent def for method call");
802807
}
803808
}
804809
_ => {}

0 commit comments

Comments
 (0)