From d96234bed72e1935d8ab9a0c7a7e70027c86ad77 Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Sun, 29 Aug 2021 19:02:47 -0700 Subject: [PATCH] Retrieve `DefKind` from HIR map to reduce chance of cycles `tcx.def_kind()` could theoretically invoke another query, which could cause an infinite query loop. Accessing the HIR map directly makes that less likely to happen. I also changed it to use `as_local()` (`tcx.def_kind()` seems to implicitly call `expect_local()`) and `opt_def_kind()` to reduce the chance of panicking on valid code. --- compiler/rustc_query_impl/src/plumbing.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_query_impl/src/plumbing.rs b/compiler/rustc_query_impl/src/plumbing.rs index 476085c8725..90a6ba474b4 100644 --- a/compiler/rustc_query_impl/src/plumbing.rs +++ b/compiler/rustc_query_impl/src/plumbing.rs @@ -338,10 +338,12 @@ macro_rules! define_queries { Some(key.default_span(*tcx)) }; let def_id = key.key_as_def_id(); - let def_kind = def_id.map(|def_id| { - let def_kind = tcx.def_kind(def_id); - $crate::util::def_kind_to_simple_def_kind(def_kind) - }); + let def_kind = def_id + .and_then(|def_id| def_id.as_local()) + // Use `tcx.hir().opt_def_kind()` to reduce the chance of + // accidentally triggering an infinite query loop. + .and_then(|def_id| tcx.hir().opt_def_kind(def_id)) + .map(|def_kind| $crate::util::def_kind_to_simple_def_kind(def_kind)); let hash = || { let mut hcx = tcx.create_stable_hashing_context(); let mut hasher = StableHasher::new();