diff options
| author | marmeladema <xademax@gmail.com> | 2020-04-13 17:40:06 +0100 |
|---|---|---|
| committer | marmeladema <xademax@gmail.com> | 2020-04-14 08:46:07 +0100 |
| commit | b9161ab880cb4f58b2b2e74b7a8bed2514f8a753 (patch) | |
| tree | b87c79e819c84e61709d76a9881c824f0006d19d /src/librustc_middle | |
| parent | 513a6473d69b3af34e6cdaa4efb288fe5283c3e9 (diff) | |
| download | rust-b9161ab880cb4f58b2b2e74b7a8bed2514f8a753.tar.gz rust-b9161ab880cb4f58b2b2e74b7a8bed2514f8a753.zip | |
Do not use `DUMMY_HIR_ID` as placeholder value in node_id_to_hir_id table
Some helpers functions have been introduced to deal with (buggy) cases where either a `NodeId` or a `DefId` do not have a corresponding `HirId`. Those cases are tracked in issue #71104.
Diffstat (limited to 'src/librustc_middle')
| -rw-r--r-- | src/librustc_middle/hir/map/mod.rs | 10 | ||||
| -rw-r--r-- | src/librustc_middle/ty/context.rs | 17 |
2 files changed, 20 insertions, 7 deletions
diff --git a/src/librustc_middle/hir/map/mod.rs b/src/librustc_middle/hir/map/mod.rs index 3eaacb54d5b..ead8529fad8 100644 --- a/src/librustc_middle/hir/map/mod.rs +++ b/src/librustc_middle/hir/map/mod.rs @@ -215,10 +215,20 @@ impl<'hir> Map<'hir> { } #[inline] + pub fn opt_node_id_to_hir_id(&self, node_id: NodeId) -> Option<HirId> { + self.tcx.definitions.opt_node_id_to_hir_id(node_id) + } + + #[inline] pub fn local_def_id_to_hir_id(&self, def_id: LocalDefId) -> HirId { self.tcx.definitions.local_def_id_to_hir_id(def_id) } + #[inline] + pub fn opt_local_def_id_to_hir_id(&self, def_id: LocalDefId) -> Option<HirId> { + self.tcx.definitions.opt_local_def_id_to_hir_id(def_id) + } + pub fn def_kind(&self, hir_id: HirId) -> Option<DefKind> { let node = self.find(hir_id)?; diff --git a/src/librustc_middle/ty/context.rs b/src/librustc_middle/ty/context.rs index 9fa25a43637..a49dc105498 100644 --- a/src/librustc_middle/ty/context.rs +++ b/src/librustc_middle/ty/context.rs @@ -1126,13 +1126,16 @@ impl<'tcx> TyCtxt<'tcx> { let mut trait_map: FxHashMap<_, FxHashMap<_, _>> = FxHashMap::default(); for (k, v) in resolutions.trait_map { - let hir_id = definitions.node_id_to_hir_id(k); - let map = trait_map.entry(hir_id.owner).or_default(); - let v = v - .into_iter() - .map(|tc| tc.map_import_ids(|id| definitions.node_id_to_hir_id(id))) - .collect(); - map.insert(hir_id.local_id, StableVec::new(v)); + // FIXME(#71104) Should really be using just `node_id_to_hir_id` but + // some `NodeId` do not seem to have a corresponding HirId. + if let Some(hir_id) = definitions.opt_node_id_to_hir_id(k) { + let map = trait_map.entry(hir_id.owner).or_default(); + let v = v + .into_iter() + .map(|tc| tc.map_import_ids(|id| definitions.node_id_to_hir_id(id))) + .collect(); + map.insert(hir_id.local_id, StableVec::new(v)); + } } GlobalCtxt { |
