diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index caa912c7c8bafde6fd3588d05be5f77bc40d141e..e7dd7ea1217dc9acaf2755e6ce4ab8cc6158f9eb 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -62,7 +62,7 @@ use hir::def_id::{CrateNum, DefId}; use hir::map::DefPathHash; -use hir::HirId; +use hir::{HirId, ItemLocalId}; use ich::Fingerprint; use ty::{TyCtxt, Instance, InstanceDef}; @@ -682,6 +682,25 @@ fn to_debug_str(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> String { } } +impl<'a, 'gcx: 'tcx + 'a, 'tcx: 'a> DepNodeParams<'a, 'gcx, 'tcx> for (HirId,) { + const CAN_RECONSTRUCT_QUERY_KEY: bool = false; + + // We actually would not need to specialize the implementation of this + // method but it's faster to combine the hashes than to instantiate a full + // hashing context and stable-hashing state. + fn to_fingerprint(&self, tcx: TyCtxt) -> Fingerprint { + let (HirId { + owner, + local_id: ItemLocalId(local_id), + },) = *self; + + let def_path_hash = tcx.def_path_hash(DefId::local(owner)); + let local_id = Fingerprint::from_smaller_hash(local_id as u64); + + def_path_hash.0.combine(local_id) + } +} + /// A "work product" corresponds to a `.o` (or other) file that we /// save in between runs. These ids do not have a DefId but rather /// some independent path or string that persists between runs without