about summary refs log tree commit diff
path: root/src/librustc_middle
diff options
context:
space:
mode:
authormarmeladema <xademax@gmail.com>2020-04-13 17:40:06 +0100
committermarmeladema <xademax@gmail.com>2020-04-14 08:46:07 +0100
commitb9161ab880cb4f58b2b2e74b7a8bed2514f8a753 (patch)
treeb87c79e819c84e61709d76a9881c824f0006d19d /src/librustc_middle
parent513a6473d69b3af34e6cdaa4efb288fe5283c3e9 (diff)
downloadrust-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.rs10
-rw-r--r--src/librustc_middle/ty/context.rs17
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 {