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.
This commit is contained in:
Noah Lev 2021-08-29 19:02:47 -07:00
parent c3df832824
commit d96234bed7

View File

@ -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();