From: Arthur Cohen <[email protected]>

This fundamentally changes the way that NR works for later pipeline - instead 
of having one
singular Usage -> Definition map like it was before, the consumers of finalized 
NRCtx need to
specify in which namespace(s) they expect usages to be looked-up. We now have 
one usage map
for each namespace, and add new APIs for looking up usages in one or multiple 
namespaces.

gcc/rust/ChangeLog:

        * backend/rust-compile-implitem.cc (CompileTraitItem::visit): Adapt for 
new NR APIs.
        * backend/rust-compile-item.cc (CompileItem::visit): Likewise.
        * backend/rust-compile-resolve-path.cc (ResolvePathRef::resolve): 
Likewise.
        * checks/errors/borrowck/rust-bir-builder-internal.h: Likewise.
        * checks/errors/privacy/rust-privacy-reporter.cc
        (PrivacyReporter::check_for_privacy_violation): Likewise.
        (PrivacyReporter::check_base_type_privacy): Likewise.
        (PrivacyReporter::visit): Likewise.
        * checks/errors/privacy/rust-privacy-reporter.h: Likewise.
        * checks/errors/privacy/rust-visibility-resolver.cc
        (VisibilityResolver::resolve_module_path): Likewise.
        * checks/errors/rust-const-checker.cc (ConstChecker::visit): Likewise.
        * checks/errors/rust-hir-pattern-analysis.cc (PatternChecker::visit): 
Likewise.
        * checks/errors/rust-readonly-check.cc (ReadonlyChecker::visit): 
Likewise.
        * checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): Likewise.
        * checks/lints/rust-lint-marklive.cc (MarkLive::visit): Likewise.
        (MarkLive::visit_path_segment): Likewise.
        (MarkLive::find_ref_node_id): Likewise.
        (MarkLive::find_value_definition): Likewise.
        * checks/lints/rust-lint-marklive.h: Likewise.
        * checks/lints/unused/rust-unused-checker.cc (UnusedChecker::visit): 
Likewise.
        * checks/lints/unused/rust-unused-collector.cc 
(UnusedCollector::visit): Likewise.
        * checks/lints/unused/rust-unused-collector.h: Likewise.
        * resolve/rust-early-name-resolver-2.0.cc (Early::resolve_glob_import): 
Likewise.
        (Early::resolve_rebind_import): Likewise.
        (Early::visit): Likewise.
        (Early::visit_derive_attribute): Likewise.
        (Early::visit_non_builtin_attribute): Likewise.
        (Early::finalize_simple_import): Likewise.
        (Early::finalize_rebind_import): Likewise.
        * resolve/rust-early-name-resolver-2.0.h: Likewise.
        * resolve/rust-finalized-name-resolution-context.cc
        (FinalizedNameResolutionContext::map_usage): Likewise.
        (FinalizedNameResolutionContext::lookup): Likewise.
        (FinalizedNameResolutionContext::to_canonical_path): Likewise.
        * resolve/rust-finalized-name-resolution-context.h: Likewise.
        * resolve/rust-forever-stack.h: Likewise.
        * resolve/rust-late-name-resolver-2.0.cc (visit_identifier_as_pattern): 
Likewise.
        (Late::visit): Likewise.
        (Late::resolve_label): Likewise.
        (resolve_type_path_like): Likewise.
        * resolve/rust-name-resolution-context.cc
        (CanonicalPathRecordCrateRoot::as_path): Likewise.
        (CanonicalPathRecordNormal::as_path): Likewise.
        (CanonicalPathRecordLookup::as_path): Likewise.
        (CanonicalPathRecordImpl::as_path): Likewise.
        (CanonicalPathRecordTraitImpl::as_path): Likewise.
        (NameResolutionContext::map_usage): Likewise.
        (NameResolutionContext::lookup): Likewise.
        * resolve/rust-name-resolution-context.h: Likewise.
        * typecheck/rust-hir-trait-resolve.cc 
(TraitResolver::resolve_path_to_trait): Likewise.
        * typecheck/rust-hir-type-check-enumitem.cc (TypeCheckEnumItem::visit): 
Likewise.
        * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): 
Likewise.
        (TypeCheckExpr::resolve_fn_trait_call): Likewise.
        * typecheck/rust-hir-type-check-implitem.cc (TypeCheckImplItem::visit): 
Likewise.
        * typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): 
Likewise.
        * typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit): 
Likewise.
        (TypeCheckExpr::resolve_root_path): Likewise.
        (TypeCheckExpr::resolve_segments): Likewise.
        * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): 
Likewise.
        * typecheck/rust-hir-type-check-type.cc 
(TypeCheckType::resolve_root_path): Likewise.
        (ResolveWhereClauseItem::visit): Likewise.
        * typecheck/rust-hir-type-check.cc 
(TraitItemReference::get_type_from_fn): Likewise.
        * typecheck/rust-type-util.cc (query_type): Likewise.
        * backend/rust-compile-expr.h (CompileExpr::resolve_nodeid): Likewise.
        * backend/rust-compile-expr.cc (CompileExpr::visit): Likewise.
        (CompileExpr::lookup_label): Likewise.
        (CompileExpr::lookup_temp_var): Likewise.
        (CompileExpr::resolve_NodeId): Likewise, and rename to...
        (CompileExpr::resolve_nodeid): ...this.
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/6d5bd65cbc9fefc2fce18d547f8cd60e0a94cdf0

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4551

 gcc/rust/backend/rust-compile-expr.cc         |  18 +-
 gcc/rust/backend/rust-compile-expr.h          |   3 +-
 gcc/rust/backend/rust-compile-implitem.cc     |   7 +-
 gcc/rust/backend/rust-compile-item.cc         |  10 +-
 gcc/rust/backend/rust-compile-resolve-path.cc |   5 +-
 .../borrowck/rust-bir-builder-internal.h      |  10 +-
 .../errors/privacy/rust-privacy-reporter.cc   |  23 ++-
 .../errors/privacy/rust-privacy-reporter.h    |   4 +-
 .../privacy/rust-visibility-resolver.cc       |   3 +-
 gcc/rust/checks/errors/rust-const-checker.cc  |   3 +-
 .../errors/rust-hir-pattern-analysis.cc       |   3 +-
 gcc/rust/checks/errors/rust-readonly-check.cc |   3 +-
 gcc/rust/checks/errors/rust-unsafe-checker.cc |   7 +-
 gcc/rust/checks/lints/rust-lint-marklive.cc   |  15 +-
 gcc/rust/checks/lints/rust-lint-marklive.h    |   2 +-
 .../lints/unused/rust-unused-checker.cc       |   4 +-
 .../lints/unused/rust-unused-collector.cc     |   3 +-
 .../lints/unused/rust-unused-collector.h      |  10 +-
 .../resolve/rust-early-name-resolver-2.0.cc   |  69 ++++----
 .../resolve/rust-early-name-resolver-2.0.h    |  37 ++--
 .../rust-finalized-name-resolution-context.cc |  14 +-
 .../rust-finalized-name-resolution-context.h  |   8 +-
 gcc/rust/resolve/rust-forever-stack.h         |  21 +++
 .../resolve/rust-late-name-resolver-2.0.cc    |  56 ++++--
 .../resolve/rust-name-resolution-context.cc   |  86 +++++++---
 .../resolve/rust-name-resolution-context.h    | 159 +++++++++++-------
 gcc/rust/typecheck/rust-hir-trait-resolve.cc  |   4 +-
 .../typecheck/rust-hir-type-check-enumitem.cc |  13 +-
 .../typecheck/rust-hir-type-check-expr.cc     |  16 +-
 .../typecheck/rust-hir-type-check-implitem.cc |   8 +-
 .../typecheck/rust-hir-type-check-item.cc     |  16 +-
 .../typecheck/rust-hir-type-check-path.cc     |   9 +-
 .../typecheck/rust-hir-type-check-pattern.cc  |   7 +-
 .../typecheck/rust-hir-type-check-type.cc     |   8 +-
 gcc/rust/typecheck/rust-hir-type-check.cc     |   4 +-
 gcc/rust/typecheck/rust-type-util.cc          |   6 +-
 36 files changed, 440 insertions(+), 234 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-expr.cc 
b/gcc/rust/backend/rust-compile-expr.cc
index 57d401fd6..5dac2439c 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -27,6 +27,7 @@
 #include "rust-compile-implitem.h"
 #include "rust-constexpr.h"
 #include "rust-compile-type.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-gcc.h"
 #include "rust-compile-asm.h"
 #include "fold-const.h"
@@ -35,6 +36,7 @@
 #include "print-tree.h"
 #include "rust-hir-bound.h"
 #include "rust-hir-expr.h"
+#include "rust-rib.h"
 #include "rust-system.h"
 #include "rust-tree.h"
 #include "rust-tyty.h"
@@ -901,7 +903,8 @@ CompileExpr::visit (HIR::BreakExpr &expr)
 
       NodeId resolved_node_id;
       if (auto id
-         = nr_ctx.lookup (expr.get_label ().get_mappings ().get_nodeid ()))
+         = nr_ctx.lookup (expr.get_label ().get_mappings ().get_nodeid (),
+                          Resolver2_0::Namespace::Labels))
        {
          resolved_node_id = *id;
        }
@@ -956,7 +959,8 @@ CompileExpr::visit (HIR::ContinueExpr &expr)
 
       NodeId resolved_node_id;
       if (auto id
-         = nr_ctx.lookup (expr.get_label ().get_mappings ().get_nodeid ()))
+         = nr_ctx.lookup (expr.get_label ().get_mappings ().get_nodeid (),
+                          Resolver2_0::Namespace::Labels))
        {
          resolved_node_id = *id;
        }
@@ -2799,7 +2803,7 @@ CompileExpr::construct_block_label (HIR::BlockExpr &expr)
 tree
 CompileExpr::lookup_label (NodeId to_be_resolved)
 {
-  HirId ref = resolve_NodeId (to_be_resolved);
+  HirId ref = resolve_nodeid (to_be_resolved, Resolver2_0::Namespace::Labels);
   tree label = NULL_TREE;
   rust_assert (ctx->lookup_label_decl (ref, &label)
               && "failed to lookup a label");
@@ -2809,7 +2813,9 @@ CompileExpr::lookup_label (NodeId to_be_resolved)
 Bvariable *
 CompileExpr::lookup_temp_var (NodeId to_be_resolved)
 {
-  HirId ref = resolve_NodeId (to_be_resolved);
+  // TODO: Not sure that this temp var should have been inserted in the Labels
+  // namespace? Why not values?
+  HirId ref = resolve_nodeid (to_be_resolved, Resolver2_0::Namespace::Labels);
   Bvariable *ltemp = nullptr;
   rust_assert (ctx->lookup_var_decl (ref, &ltemp)
               && "failed to lookup a temp var");
@@ -2817,12 +2823,12 @@ CompileExpr::lookup_temp_var (NodeId to_be_resolved)
 }
 
 HirId
-CompileExpr::resolve_NodeId (NodeId to_be_resolved)
+CompileExpr::resolve_nodeid (NodeId to_be_resolved, Resolver2_0::Namespace ns)
 {
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   NodeId resolved_node_id;
-  resolved_node_id = nr_ctx.lookup (to_be_resolved).value ();
+  resolved_node_id = nr_ctx.lookup (to_be_resolved, ns).value ();
 
   HirId ref
     = ctx->get_mappings ().lookup_node_to_hir (resolved_node_id).value ();
diff --git a/gcc/rust/backend/rust-compile-expr.h 
b/gcc/rust/backend/rust-compile-expr.h
index 7764448d8..9d1238e12 100644
--- a/gcc/rust/backend/rust-compile-expr.h
+++ b/gcc/rust/backend/rust-compile-expr.h
@@ -23,6 +23,7 @@
 #include "rust-gcc.h"
 #include "rust-hir-expr.h"
 #include "rust-hir-visitor.h"
+#include "rust-rib.h"
 
 namespace Rust {
 namespace Compile {
@@ -156,7 +157,7 @@ protected:
   tree construct_block_label (HIR::BlockExpr &expr);
   tree lookup_label (NodeId to_be_resolved);
   Bvariable *lookup_temp_var (NodeId to_be_resolved);
-  HirId resolve_NodeId (NodeId to_be_resolved);
+  HirId resolve_nodeid (NodeId to_be_resolved, Resolver2_0::Namespace ns);
 
 private:
   CompileExpr (Context *ctx);
diff --git a/gcc/rust/backend/rust-compile-implitem.cc 
b/gcc/rust/backend/rust-compile-implitem.cc
index df5726661..ba17184e6 100644
--- a/gcc/rust/backend/rust-compile-implitem.cc
+++ b/gcc/rust/backend/rust-compile-implitem.cc
@@ -17,6 +17,7 @@
 // <http://www.gnu.org/licenses/>.
 
 #include "rust-compile-implitem.h"
+#include "rust-rib.h"
 
 namespace Rust {
 namespace Compile {
@@ -30,7 +31,8 @@ CompileTraitItem::visit (HIR::TraitItemConst &constant)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   Resolver::CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (constant.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (constant.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Values);
 
   HIR::Expr &const_value_expr = constant.get_expr ();
   TyTy::BaseType *expr_type = nullptr;
@@ -91,7 +93,8 @@ CompileTraitItem::visit (HIR::TraitItemFunc &func)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   Resolver::CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (func.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (func.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Values);
 
   // FIXME: How do we get the proper visibility here?
   auto vis = HIR::Visibility (HIR::Visibility::VisType::Public);
diff --git a/gcc/rust/backend/rust-compile-item.cc 
b/gcc/rust/backend/rust-compile-item.cc
index 788373fb9..37b0dd75d 100644
--- a/gcc/rust/backend/rust-compile-item.cc
+++ b/gcc/rust/backend/rust-compile-item.cc
@@ -19,6 +19,7 @@
 #include "rust-compile-item.h"
 #include "rust-compile-implitem.h"
 #include "rust-compile-extern.h"
+#include "rust-rib.h"
 #include "rust-substitution-mapper.h"
 #include "rust-type-util.h"
 #include "rust-finalized-name-resolution-context.h"
@@ -53,7 +54,8 @@ CompileItem::visit (HIR::StaticItem &var)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   Resolver::CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (var.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (var.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Values);
 
   ctx->push_const_context ();
   tree value
@@ -106,7 +108,8 @@ CompileItem::visit (HIR::ConstantItem &constant)
 
   // canonical path
   Resolver::CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (mappings.get_nodeid ());
+    = nr_ctx.to_canonical_path (mappings.get_nodeid (),
+                               Resolver2_0::Namespace::Values);
   if (constant_type->is<const TyTy::FnType> ())
     {
       if (concrete == nullptr)
@@ -201,7 +204,8 @@ CompileItem::visit (HIR::Function &function)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   Resolver::CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (function.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (function.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Values);
 
   const std::string asm_name = ctx->mangle_item (fntype, canonical_path);
 
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc 
b/gcc/rust/backend/rust-compile-resolve-path.cc
index 747ab98fa..2cfdca5de 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -27,6 +27,7 @@
 #include "rust-hir-path-probe.h"
 #include "rust-compile-extern.h"
 #include "rust-constexpr.h"
+#include "rust-rib.h"
 #include "rust-tyty.h"
 
 namespace Rust {
@@ -233,7 +234,9 @@ ResolvePathRef::resolve (const HIR::PathIdentSegment 
&final_segment,
   // in that case the caller should attempt ResolvePathType::Compile
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
-  auto resolved = nr_ctx.lookup (mappings.get_nodeid ());
+  // TODO: Is Values the correct NS here?
+  auto resolved
+    = nr_ctx.lookup (mappings.get_nodeid (), Resolver2_0::Namespace::Values);
 
   if (!resolved)
     return attempt_constructor_expression_lookup (lookup, ctx, mappings,
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h
index 0f68c1b73..85f6c6300 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h
@@ -28,6 +28,7 @@
 #include "rust-bir-free-region.h"
 #include "rust-finalized-name-resolution-context.h"
 #include "options.h"
+#include "rust-rib.h"
 
 namespace Rust {
 
@@ -402,14 +403,16 @@ protected: // HIR resolution helpers
 
   template <typename T> NodeId resolve_label (T &expr)
   {
-    auto res = ctx.resolver.lookup (expr.get_mappings ().get_nodeid ());
+    auto res = ctx.resolver.lookup (expr.get_mappings ().get_nodeid (),
+                                   Resolver2_0::Namespace::Labels);
     rust_assert (res.has_value ());
     return res.value ();
   }
 
   template <typename T> PlaceId resolve_variable (T &variable)
   {
-    auto res = ctx.resolver.lookup (variable.get_mappings ().get_nodeid ());
+    auto res = ctx.resolver.lookup (variable.get_mappings ().get_nodeid (),
+                                   Resolver2_0::Namespace::Values);
     rust_assert (res.has_value ());
     return ctx.place_db.lookup_variable (res.value ());
   }
@@ -424,7 +427,8 @@ protected: // HIR resolution helpers
     if (ty->is<TyTy::FnType> ())
       return ctx.place_db.get_constant (ty);
 
-    auto res = ctx.resolver.lookup (variable.get_mappings ().get_nodeid ());
+    auto res = ctx.resolver.lookup (variable.get_mappings ().get_nodeid (),
+                                   Resolver2_0::Namespace::Values);
     rust_assert (res.has_value ());
     return ctx.place_db.lookup_or_add_variable (res.value (), ty);
   }
diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc 
b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
index c102bf6e9..5d3c50ae3 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
@@ -17,6 +17,7 @@
 // <http://www.gnu.org/licenses/>.
 
 #include "rust-privacy-reporter.h"
+#include "rust-rib.h"
 #include "rust-session-manager.h"
 #include "rust-hir-expr.h"
 #include "rust-hir-stmt.h"
@@ -94,13 +95,14 @@ PrivacyReporter::go (HIR::Crate &crate)
 // FIXME: This function needs a lot of refactoring
 void
 PrivacyReporter::check_for_privacy_violation (const NodeId &use_id,
-                                             const location_t locus)
+                                             const location_t locus,
+                                             Resolver2_0::Namespace ns)
 {
   NodeId ref_node_id;
 
   // FIXME: Assert here. For now, we return since this causes issues when
   // checking inferred types (#1260)
-  if (auto id = resolver.lookup (use_id))
+  if (auto id = resolver.lookup (use_id, ns))
     ref_node_id = *id;
   else
     return;
@@ -182,7 +184,8 @@ PrivacyReporter::check_base_type_privacy 
(Analysis::NodeMapping &node_mappings,
       {
        auto ref_id = ty->get_ref ();
        if (auto lookup_id = mappings.lookup_hir_to_node (ref_id))
-         return check_for_privacy_violation (*lookup_id, locus);
+         return check_for_privacy_violation (*lookup_id, locus,
+                                             Resolver2_0::Namespace::Types);
       }
       break;
 
@@ -260,7 +263,8 @@ void
 PrivacyReporter::visit (HIR::PathInExpression &path)
 {
   check_for_privacy_violation (path.get_mappings ().get_nodeid (),
-                              path.get_locus ());
+                              path.get_locus (),
+                              Resolver2_0::Namespace::Values);
 }
 
 void
@@ -287,21 +291,24 @@ void
 PrivacyReporter::visit (HIR::TypePath &path)
 {
   check_for_privacy_violation (path.get_mappings ().get_nodeid (),
-                              path.get_locus ());
+                              path.get_locus (),
+                              Resolver2_0::Namespace::Types);
 }
 
 void
 PrivacyReporter::visit (HIR::QualifiedPathInExpression &path)
 {
-  check_for_privacy_violation (path.get_mappings ().get_nodeid (),
-                              path.get_locus ());
+  check_for_privacy_violation (
+    path.get_mappings ().get_nodeid (), path.get_locus (),
+    Resolver2_0::Namespace::Types /* FIXME: Is that correct? */);
 }
 
 void
 PrivacyReporter::visit (HIR::QualifiedPathInType &path)
 {
   check_for_privacy_violation (path.get_mappings ().get_nodeid (),
-                              path.get_locus ());
+                              path.get_locus (),
+                              Resolver2_0::Namespace::Types);
 }
 
 void
diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h 
b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
index 3d827dfc3..c735aa44a 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
@@ -25,6 +25,7 @@
 #include "rust-hir-type-check.h"
 #include "rust-mapping-common.h"
 #include "rust-finalized-name-resolution-context.h"
+#include "rust-rib.h"
 
 namespace Rust {
 namespace Privacy {
@@ -58,7 +59,8 @@ private:
    * @param locus Location of said expression/statement
    */
   void check_for_privacy_violation (const NodeId &use_id,
-                                   const location_t locus);
+                                   const location_t locus,
+                                   Resolver2_0::Namespace ns);
 
   /**
    * Internal function used by `check_type_privacy` when dealing with complex
diff --git a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc 
b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
index 9240a6847..c24f0657e 100644
--- a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
+++ b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
@@ -21,6 +21,7 @@
 #include "rust-hir.h"
 #include "rust-hir-item.h"
 #include "rust-finalized-name-resolution-context.h"
+#include "rust-rib.h"
 
 namespace Rust {
 namespace Privacy {
@@ -63,7 +64,7 @@ VisibilityResolver::resolve_module_path (const 
HIR::SimplePath &restriction,
             "cannot use non-module path as privacy restrictor");
 
   NodeId ref_node_id;
-  if (auto id = resolver.lookup (ast_node_id))
+  if (auto id = resolver.lookup (ast_node_id, Resolver2_0::Namespace::Types))
     {
       ref_node_id = *id;
     }
diff --git a/gcc/rust/checks/errors/rust-const-checker.cc 
b/gcc/rust/checks/errors/rust-const-checker.cc
index 7796b71f9..39dd70956 100644
--- a/gcc/rust/checks/errors/rust-const-checker.cc
+++ b/gcc/rust/checks/errors/rust-const-checker.cc
@@ -21,6 +21,7 @@
 #include "rust-hir-expr.h"
 #include "rust-hir-stmt.h"
 #include "rust-hir-item.h"
+#include "rust-rib.h"
 #include "rust-system.h"
 #include "rust-finalized-name-resolution-context.h"
 
@@ -355,7 +356,7 @@ ConstChecker::visit (CallExpr &expr)
   NodeId ast_node_id = expr.get_fnexpr ().get_mappings ().get_nodeid ();
   NodeId ref_node_id;
 
-  if (auto id = resolver.lookup (ast_node_id))
+  if (auto id = resolver.lookup (ast_node_id, Resolver2_0::Namespace::Values))
     ref_node_id = *id;
   else
     return;
diff --git a/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc 
b/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
index a9a5b6422..460ded1b2 100644
--- a/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
+++ b/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
@@ -16,6 +16,7 @@
 // along with GCC; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+#include "rust-rib.h"
 #include "rust-system.h"
 #include "rust-hir-pattern-analysis.h"
 #include "rust-diagnostics.h"
@@ -235,7 +236,7 @@ PatternChecker::visit (CallExpr &expr)
 
   NodeId ast_node_id = expr.get_fnexpr ().get_mappings ().get_nodeid ();
   NodeId ref_node_id;
-  if (auto id = resolver.lookup (ast_node_id))
+  if (auto id = resolver.lookup (ast_node_id, Resolver2_0::Namespace::Values))
     ref_node_id = *id;
   else
     return;
diff --git a/gcc/rust/checks/errors/rust-readonly-check.cc 
b/gcc/rust/checks/errors/rust-readonly-check.cc
index 734c766b5..b7e75a7d5 100644
--- a/gcc/rust/checks/errors/rust-readonly-check.cc
+++ b/gcc/rust/checks/errors/rust-readonly-check.cc
@@ -23,6 +23,7 @@
 #include "rust-hir-map.h"
 #include "rust-hir-pattern.h"
 #include "rust-mapping-common.h"
+#include "rust-rib.h"
 #include "rust-system.h"
 #include "rust-finalized-name-resolution-context.h"
 #include "rust-tyty.h"
@@ -64,7 +65,7 @@ ReadonlyChecker::visit (PathInExpression &expr)
   NodeId def_id;
 
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
-  if (auto id = nr_ctx.lookup (ast_node_id))
+  if (auto id = nr_ctx.lookup (ast_node_id, Resolver2_0::Namespace::Values))
     def_id = *id;
   else
     return;
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.cc 
b/gcc/rust/checks/errors/rust-unsafe-checker.cc
index 848505632..da4530ab2 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.cc
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc
@@ -22,6 +22,7 @@
 #include "rust-hir-stmt.h"
 #include "rust-hir-item.h"
 #include "rust-attribute-values.h"
+#include "rust-rib.h"
 #include "rust-system.h"
 #include "rust-finalized-name-resolution-context.h"
 #include "rust-intrinsic-values.h"
@@ -220,7 +221,8 @@ UnsafeChecker::visit (PathInExpression &path)
   NodeId ast_node_id = path.get_mappings ().get_nodeid ();
   NodeId ref_node_id;
 
-  if (auto resolved = resolver.lookup (ast_node_id))
+  if (auto resolved
+      = resolver.lookup (ast_node_id, Resolver2_0::Namespace::Values))
     ref_node_id = resolved.value ();
   else
     return;
@@ -421,7 +423,8 @@ UnsafeChecker::visit (CallExpr &expr)
   NodeId ast_node_id = expr.get_fnexpr ().get_mappings ().get_nodeid ();
   NodeId ref_node_id;
 
-  if (auto resolved = resolver.lookup (ast_node_id))
+  if (auto resolved
+      = resolver.lookup (ast_node_id, Resolver2_0::Namespace::Values))
     ref_node_id = resolved.value ();
   else
     return;
diff --git a/gcc/rust/checks/lints/rust-lint-marklive.cc 
b/gcc/rust/checks/lints/rust-lint-marklive.cc
index 0d76e5f87..1ef35f328 100644
--- a/gcc/rust/checks/lints/rust-lint-marklive.cc
+++ b/gcc/rust/checks/lints/rust-lint-marklive.cc
@@ -26,6 +26,7 @@
 #include "rust-hir-path.h"
 #include "rust-name-resolver.h"
 #include "rust-finalized-name-resolution-context.h"
+#include "rust-rib.h"
 #include "rust-system.h"
 
 namespace Rust {
@@ -115,7 +116,7 @@ MarkLive::visit (HIR::PathInExpression &expr)
     ref_node_id
       = Analysis::Mappings::get ().get_lang_item_node (expr.get_lang_item ());
   else
-    find_ref_node_id (ast_node_id, ref_node_id);
+    find_value_definition (ast_node_id, ref_node_id);
 
   // node back to HIR
   tl::optional<HirId> hid = mappings.lookup_node_to_hir (ref_node_id);
@@ -140,7 +141,7 @@ MarkLive::visit (HIR::MethodCallExpr &expr)
   // Trying to find the method definition and mark it alive.
   NodeId ast_node_id = expr.get_mappings ().get_nodeid ();
   NodeId ref_node_id = UNKNOWN_NODEID;
-  find_ref_node_id (ast_node_id, ref_node_id);
+  find_value_definition (ast_node_id, ref_node_id);
 
   // node back to HIR
   if (auto hid = mappings.lookup_node_to_hir (ref_node_id))
@@ -163,7 +164,8 @@ MarkLive::visit_path_segment (HIR::PathExprSegment seg)
   //
   // We should mark them alive all and ignoring other kind of segments.
   // If the segment we dont care then just return false is fine
-  if (auto id = resolver.lookup (ast_node_id))
+  // TODO: Should we look that up in all namespaces?
+  if (auto id = resolver.lookup (ast_node_id, Resolver2_0::Namespace::Values))
     ref_node_id = *id;
   else
     return false;
@@ -242,7 +244,8 @@ MarkLive::visit (HIR::TypeAlias &alias)
   NodeId ast_node_id;
 
   if (auto id = resolver.lookup (
-       alias.get_type_aliased ().get_mappings ().get_nodeid ()))
+       alias.get_type_aliased ().get_mappings ().get_nodeid (),
+       Resolver2_0::Namespace::Types))
     ast_node_id = *id;
   else
     rust_unreachable ();
@@ -264,9 +267,9 @@ MarkLive::mark_hir_id (HirId id)
 }
 
 void
-MarkLive::find_ref_node_id (NodeId ast_node_id, NodeId &ref_node_id)
+MarkLive::find_value_definition (NodeId ast_node_id, NodeId &ref_node_id)
 {
-  auto resolved = resolver.lookup (ast_node_id);
+  auto resolved = resolver.lookup (ast_node_id, 
Resolver2_0::Namespace::Values);
   rust_assert (resolved.has_value ());
   ref_node_id = resolved.value ();
 }
diff --git a/gcc/rust/checks/lints/rust-lint-marklive.h 
b/gcc/rust/checks/lints/rust-lint-marklive.h
index c651d2876..562104f67 100644
--- a/gcc/rust/checks/lints/rust-lint-marklive.h
+++ b/gcc/rust/checks/lints/rust-lint-marklive.h
@@ -287,7 +287,7 @@ private:
 
   void mark_hir_id (HirId);
   bool visit_path_segment (HIR::PathExprSegment);
-  void find_ref_node_id (NodeId ast_node_id, NodeId &ref_node_id);
+  void find_value_definition (NodeId ast_node_id, NodeId &ref_node_id);
 };
 
 } // namespace Analysis
diff --git a/gcc/rust/checks/lints/unused/rust-unused-checker.cc 
b/gcc/rust/checks/lints/unused/rust-unused-checker.cc
index 542908c63..06bbfd446 100644
--- a/gcc/rust/checks/lints/unused/rust-unused-checker.cc
+++ b/gcc/rust/checks/lints/unused/rust-unused-checker.cc
@@ -23,6 +23,7 @@
 
 #include "options.h"
 #include "rust-keyword-values.h"
+#include "rust-rib.h"
 
 namespace Rust {
 namespace Analysis {
@@ -112,7 +113,8 @@ UnusedChecker::visit (HIR::AssignmentExpr &expr)
   const auto &lhs = expr.get_lhs ();
   auto var_name = lhs.to_string ();
   NodeId ast_node_id = lhs.get_mappings ().get_nodeid ();
-  NodeId def_id = nr_context.lookup (ast_node_id).value ();
+  NodeId def_id
+    = nr_context.lookup (ast_node_id, Resolver2_0::Namespace::Values).value ();
   HirId id = mappings.lookup_node_to_hir (def_id).value ();
   if (unused_context.is_variable_assigned (id, lhs.get_mappings ().get_hirid 
())
       && var_name[0] != '_')
diff --git a/gcc/rust/checks/lints/unused/rust-unused-collector.cc 
b/gcc/rust/checks/lints/unused/rust-unused-collector.cc
index 542bab0a6..5596dd97a 100644
--- a/gcc/rust/checks/lints/unused/rust-unused-collector.cc
+++ b/gcc/rust/checks/lints/unused/rust-unused-collector.cc
@@ -23,6 +23,7 @@
 #include "rust-hir-path.h"
 #include "rust-hir-pattern.h"
 #include "rust-finalized-name-resolution-context.h"
+#include "rust-rib.h"
 
 namespace Rust {
 namespace Analysis {
@@ -61,7 +62,7 @@ UnusedCollector::visit (HIR::StructExprFieldIdentifier &ident)
 void
 UnusedCollector::visit (HIR::AssignmentExpr &expr)
 {
-  auto def_id = get_def_id (expr.get_lhs ());
+  auto def_id = get_def_id (expr.get_lhs (), Resolver2_0::Namespace::Values);
   HirId id = expr.get_lhs ().get_mappings ().get_hirid ();
   unused_context.remove_mut (def_id);
   unused_context.add_assign (def_id, id);
diff --git a/gcc/rust/checks/lints/unused/rust-unused-collector.h 
b/gcc/rust/checks/lints/unused/rust-unused-collector.h
index 581a9fcbd..5059f7689 100644
--- a/gcc/rust/checks/lints/unused/rust-unused-collector.h
+++ b/gcc/rust/checks/lints/unused/rust-unused-collector.h
@@ -22,6 +22,7 @@
 #include "rust-hir-visitor.h"
 #include "rust-mapping-common.h"
 #include "rust-finalized-name-resolution-context.h"
+#include "rust-rib.h"
 #include "rust-unused-context.h"
 
 namespace Rust {
@@ -55,24 +56,25 @@ private:
   virtual void visit (HIR::BreakExpr &expr) override;
   virtual void visit (HIR::ContinueExpr &expr) override;
 
-  template <typename T> HirId get_def_id (T &path_expr)
+  template <typename T>
+  HirId get_def_id (T &path_expr, Resolver2_0::Namespace ns)
   {
     NodeId ast_node_id = path_expr.get_mappings ().get_nodeid ();
-    NodeId id = nr_context.lookup (ast_node_id).value ();
+    NodeId id = nr_context.lookup (ast_node_id, ns).value ();
     HirId def_id = mappings.lookup_node_to_hir (id).value ();
     return def_id;
   }
 
   template <typename T> void mark_path_used (T &path_expr)
   {
-    auto def_id = get_def_id (path_expr);
+    auto def_id = get_def_id (path_expr, Resolver2_0::Namespace::Values);
     unused_context.add_variable (def_id);
     unused_context.remove_assign (def_id);
   }
 
   template <typename T> void mark_label_used (T &path_expr)
   {
-    auto def_id = get_def_id (path_expr);
+    auto def_id = get_def_id (path_expr, Resolver2_0::Namespace::Labels);
     unused_context.add_label (def_id);
   }
 };
diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc 
b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
index 8ba452d66..de68bf52e 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
@@ -23,6 +23,8 @@
 #include "rust-diagnostics.h"
 #include "rust-hir-map.h"
 #include "rust-item.h"
+#include "rust-name-resolution-context.h"
+#include "rust-rib.h"
 #include "rust-toplevel-name-resolver-2.0.h"
 #include "rust-attributes.h"
 #include "rust-finalize-imports-2.0.h"
@@ -91,7 +93,7 @@ Early::resolve_glob_import (NodeId use_dec_id, 
TopLevel::ImportKind &&glob)
     return false;
 
   auto result = Analysis::Mappings::get ().lookup_glob_container (
-    resolved->get_node_id ());
+    resolved->definition.get_node_id ());
 
   if (!result)
     return false;
@@ -99,10 +101,11 @@ Early::resolve_glob_import (NodeId use_dec_id, 
TopLevel::ImportKind &&glob)
   // here, we insert the module's NodeId into the import_mappings and will look
   // up the module proper in `FinalizeImports`
   // The namespace does not matter here since we are dealing with a glob
+  // FIXME: Does the namespace not matter? Is that valid?
   // TODO: Ugly
   import_mappings.insert (use_dec_id,
                          ImportPair (std::move (glob),
-                                     ImportData::Glob (*resolved)));
+                                     ImportData::Glob (resolved->definition)));
 
   return true;
 }
@@ -160,7 +163,7 @@ Early::resolve_rebind_import (NodeId use_dec_id,
       break;
     }
 
-  if (ctx.lookup (import_id))
+  if (ctx.lookup (import_id, Namespace::Types))
     return true;
 
   auto definitions = resolve_path_in_all_ns (rebind_import.to_resolve);
@@ -170,7 +173,7 @@ Early::resolve_rebind_import (NodeId use_dec_id,
     return false;
   for (const auto &def : definitions)
     {
-      if (def.first.is_ambiguous ())
+      if (def.definition.is_ambiguous ())
        {
          rich_location rich_locus (line_table,
                                    rebind_import.to_resolve.get_locus ());
@@ -330,20 +333,23 @@ Early::visit (AST::MacroInvocation &invoc)
 
   // 
https://doc.rust-lang.org/reference/macros-by-example.html#path-based-scope
 
-  tl::optional<Rib::Definition> definition = tl::nullopt;
+  tl::optional<NameResolutionContext::NamespacedDefinition> ns_def
+    = tl::nullopt;
   if (path.get_segments ().size () == 1)
-    definition
-      = textual_scope.get (path.get_final_segment ().as_string ())
-         .map ([] (NodeId id) { return Rib::Definition::NonShadowable (id); });
+    ns_def = textual_scope.get (path.get_final_segment ().as_string ())
+              .map ([] (NodeId id) {
+                return NameResolutionContext::NamespacedDefinition (
+                  Rib::Definition::NonShadowable (id), Namespace::Macros);
+              });
 
   // we won't have changed `definition` from `nullopt` if there are more
   // than one segments in our path
-  if (!definition.has_value ())
-    definition = ctx.resolve_path (path, Namespace::Macros);
+  if (!ns_def.has_value ())
+    ns_def = ctx.resolve_path (path, Namespace::Macros);
 
   // if the definition still does not have a value, then it's an error - unless
   // we should automatically resolve offset_of!() calls
-  if (!definition.has_value ())
+  if (!ns_def.has_value ())
     {
       if (!resolve_offset_of)
        collect_error (Error (invoc.get_locus (), ErrorCode::E0433,
@@ -352,12 +358,13 @@ Early::visit (AST::MacroInvocation &invoc)
       return;
     }
 
-  try_insert_once (invoc, definition->get_node_id ());
+  try_insert_once (invoc, ns_def->definition.get_node_id ());
 
   // now do we need to keep mappings or something? or insert "uses" into our
   // ForeverStack? can we do that? are mappings simpler?
   auto &mappings = Analysis::Mappings::get ();
-  auto rules_def = mappings.lookup_macro_def (definition->get_node_id ());
+  auto rules_def
+    = mappings.lookup_macro_def (ns_def->definition.get_node_id ());
 
   // Macro definition not found, maybe it is not expanded yet.
   if (!rules_def)
@@ -376,8 +383,8 @@ Early::visit_derive_attribute (AST::Attribute &attr,
   auto traits = attr.get_traits_to_derive ();
   for (auto &trait : traits)
     {
-      auto definition = ctx.resolve_path (trait.get (), Namespace::Macros);
-      if (!definition.has_value ())
+      auto ns_def = ctx.resolve_path (trait.get (), Namespace::Macros);
+      if (!ns_def.has_value ())
        {
          // FIXME: Change to proper error message
          collect_error (Error (trait.get ().get_locus (),
@@ -386,8 +393,8 @@ Early::visit_derive_attribute (AST::Attribute &attr,
          continue;
        }
 
-      auto pm_def
-       = mappings.lookup_derive_proc_macro_def (definition->get_node_id ());
+      auto pm_def = mappings.lookup_derive_proc_macro_def (
+       ns_def->definition.get_node_id ());
 
       if (pm_def.has_value ())
        mappings.insert_derive_proc_macro_invocation (trait, pm_def.value ());
@@ -399,8 +406,8 @@ Early::visit_non_builtin_attribute (AST::Attribute &attr,
                                    Analysis::Mappings &mappings,
                                    std::string &name)
 {
-  auto definition = ctx.resolve_path (attr.get_path (), Namespace::Macros);
-  if (!definition.has_value ())
+  auto ns_def = ctx.resolve_path (attr.get_path (), Namespace::Macros);
+  if (!ns_def.has_value ())
     {
       // FIXME: Change to proper error message
       collect_error (Error (attr.get_locus (),
@@ -408,8 +415,8 @@ Early::visit_non_builtin_attribute (AST::Attribute &attr,
                            name.c_str ()));
       return;
     }
-  auto pm_def
-    = mappings.lookup_attribute_proc_macro_def (definition->get_node_id ());
+  auto pm_def = mappings.lookup_attribute_proc_macro_def (
+    ns_def->definition.get_node_id ());
 
   if (!pm_def.has_value ())
     return;
@@ -457,11 +464,11 @@ Early::finalize_simple_import (const Early::ImportPair 
&mapping)
       // dirty = true;
 
       ctx.map_usage (Usage (import_id),
-                    Definition (definition.first.get_node_id ()));
+                    Definition (definition.definition.get_node_id ()),
+                    definition.ns);
 
-      toplevel
-       .insert_or_error_out (identifier,
-                             import.get_locus (), import_id, definition.second 
/* TODO: This isn't clear - it would be better if it was called .ns or 
something */);
+      toplevel.insert_or_error_out (identifier, import.get_locus (), import_id,
+                                   definition.ns);
 
       dirty = dirty || toplevel.is_dirty ();
     }
@@ -538,11 +545,11 @@ Early::finalize_rebind_import (const Early::ImportPair 
&mapping)
       // dirty = true;
 
       ctx.map_usage (Usage (import_id),
-                    Definition (definition.first.get_node_id ()));
+                    Definition (definition.definition.get_node_id ()),
+                    definition.ns);
 
-      toplevel
-       .insert_or_error_out (declared_name,
-                             path.get_locus (), import_id, definition.second 
/* TODO: This isn't clear - it would be better if it was called .ns or 
something */);
+      toplevel.insert_or_error_out (declared_name, path.get_locus (), 
import_id,
+                                   definition.ns);
 
       dirty = dirty || toplevel.is_dirty ();
 
@@ -553,8 +560,8 @@ Early::finalize_rebind_import (const Early::ImportPair 
&mapping)
       // pub use Foo;
       // use self::Foo::*;
       auto &mappings = Analysis::Mappings::get ();
-      if (auto container
-         = mappings.lookup_glob_container (definition.first.get_node_id ()))
+      if (auto container = mappings.lookup_glob_container (
+           definition.definition.get_node_id ()))
        mappings.insert_glob_container (import_id, container.value ());
     }
 }
diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.h 
b/gcc/rust/resolve/rust-early-name-resolver-2.0.h
index ff3542ce5..7b1e37722 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.h
@@ -79,14 +79,14 @@ public:
       Rebind
     } kind;
 
-    static ImportData
-    Simple (std::vector<std::pair<Rib::Definition, Namespace>> &&definitions)
+    static ImportData Simple (
+      std::vector<NameResolutionContext::NamespacedDefinition> &&definitions)
     {
       return ImportData (Kind::Simple, std::move (definitions));
     }
 
-    static ImportData
-    Rebind (std::vector<std::pair<Rib::Definition, Namespace>> &&definitions)
+    static ImportData Rebind (
+      std::vector<NameResolutionContext::NamespacedDefinition> &&definitions)
     {
       return ImportData (Kind::Rebind, std::move (definitions));
     }
@@ -102,7 +102,8 @@ public:
       return glob_container;
     }
 
-    std::vector<std::pair<Rib::Definition, Namespace>> definitions () const
+    std::vector<NameResolutionContext::NamespacedDefinition>
+    definitions () const
     {
       rust_assert (kind != Kind::Glob);
       return std::move (resolved_definitions);
@@ -111,7 +112,7 @@ public:
   private:
     ImportData (
       Kind kind,
-      std::vector<std::pair<Rib::Definition, Namespace>> &&definitions)
+      std::vector<NameResolutionContext::NamespacedDefinition> &&definitions)
       : kind (kind), resolved_definitions (std::move (definitions))
     {}
 
@@ -122,7 +123,8 @@ public:
     // TODO: Should this be a union?
 
     // For Simple and Rebind
-    std::vector<std::pair<Rib::Definition, Namespace>> resolved_definitions;
+    std::vector<NameResolutionContext::NamespacedDefinition>
+      resolved_definitions;
 
     // For Glob
     Rib::Definition glob_container;
@@ -221,29 +223,18 @@ private:
   bool resolve_rebind_import (NodeId use_dec_id, TopLevel::ImportKind 
&&import);
 
   template <typename P>
-  std::vector<std::pair<Rib::Definition, Namespace>>
+  std::vector<NameResolutionContext::NamespacedDefinition>
   resolve_path_in_all_ns (const P &path)
   {
-    std::vector<std::pair<Rib::Definition, Namespace>> resolved;
-
-    // Pair a definition with the namespace it was found in
-    auto pair_with_ns = [&] (Namespace ns) {
-      return [&, ns] (Rib::Definition def) {
-       auto pair = std::make_pair (def, ns);
-       return resolved.emplace_back (std::move (pair));
-      };
-    };
+    std::vector<NameResolutionContext::NamespacedDefinition> resolved;
 
     std::vector<Error> value_errors;
     std::vector<Error> type_errors;
     std::vector<Error> macro_errors;
 
-    ctx.resolve_path (path, value_errors, Namespace::Values)
-      .map (pair_with_ns (Namespace::Values));
-    ctx.resolve_path (path, type_errors, Namespace::Types)
-      .map (pair_with_ns (Namespace::Types));
-    ctx.resolve_path (path, macro_errors, Namespace::Macros)
-      .map (pair_with_ns (Namespace::Macros));
+    ctx.resolve_path (path, value_errors, Namespace::Values);
+    ctx.resolve_path (path, type_errors, Namespace::Types);
+    ctx.resolve_path (path, macro_errors, Namespace::Macros);
 
     if (!value_errors.empty () && !type_errors.empty ()
        && !macro_errors.empty ())
diff --git a/gcc/rust/resolve/rust-finalized-name-resolution-context.cc 
b/gcc/rust/resolve/rust-finalized-name-resolution-context.cc
index ea60f95fb..6df72bd51 100644
--- a/gcc/rust/resolve/rust-finalized-name-resolution-context.cc
+++ b/gcc/rust/resolve/rust-finalized-name-resolution-context.cc
@@ -42,24 +42,26 @@ FinalizedNameResolutionContext::get ()
 }
 
 void
-FinalizedNameResolutionContext::map_usage (Usage usage, Definition definition)
+FinalizedNameResolutionContext::map_usage (Usage usage, Definition definition,
+                                          Namespace ns)
 {
   auto leaf_definition
     = ctx.find_leaf_definition (definition.id).value_or (definition);
 
-  ctx.map_usage (usage, leaf_definition);
+  ctx.map_usage (usage, leaf_definition, ns);
 }
 
 tl::optional<NodeId>
-FinalizedNameResolutionContext::lookup (NodeId usage) const
+FinalizedNameResolutionContext::lookup (NodeId usage, Namespace ns) const
 {
-  return ctx.lookup (usage);
+  return ctx.lookup (usage, ns);
 }
 
 Resolver::CanonicalPath
-FinalizedNameResolutionContext::to_canonical_path (NodeId id) const
+FinalizedNameResolutionContext::to_canonical_path (NodeId id,
+                                                  Namespace ns) const
 {
-  return ctx.canonical_ctx.get_path (id);
+  return ctx.canonical_ctx.get_path (id, ns);
 }
 
 FinalizedNameResolutionContext::FinalizedNameResolutionContext (
diff --git a/gcc/rust/resolve/rust-finalized-name-resolution-context.h 
b/gcc/rust/resolve/rust-finalized-name-resolution-context.h
index a896423bf..5834a70c5 100644
--- a/gcc/rust/resolve/rust-finalized-name-resolution-context.h
+++ b/gcc/rust/resolve/rust-finalized-name-resolution-context.h
@@ -20,6 +20,7 @@
 #define RUST_FINALIZED_NRCTX_H
 
 #include "rust-name-resolution-context.h"
+#include "rust-rib.h"
 
 namespace Rust {
 namespace Resolver2_0 {
@@ -45,17 +46,17 @@ public:
    * resolution stage, every import chain has been resolved, and can be 
followed
    * to an actual definition instead of an import definition
    */
-  void map_usage (Usage usage, Definition definition);
+  void map_usage (Usage usage, Definition definition, Namespace ns);
 
   /**
    * Same as NameResolutionContext::lookup
    */
-  tl::optional<NodeId> lookup (NodeId usage) const;
+  tl::optional<NodeId> lookup (NodeId usage, Namespace ns) const;
 
   /**
    * Same as NameResolutionContext::to_canonical_path
    */
-  Resolver::CanonicalPath to_canonical_path (NodeId id) const;
+  Resolver::CanonicalPath to_canonical_path (NodeId id, Namespace ns) const;
 
   /**
    * Avoid using these and prefer adding wrapper methods to this class instead.
@@ -75,6 +76,7 @@ private:
 };
 
 } // namespace Resolver2_0
+
 } // namespace Rust
 
 #endif //! RUST_FINALIZED_NRCTX_H
diff --git a/gcc/rust/resolve/rust-forever-stack.h 
b/gcc/rust/resolve/rust-forever-stack.h
index c28828fda..47e769abe 100644
--- a/gcc/rust/resolve/rust-forever-stack.h
+++ b/gcc/rust/resolve/rust-forever-stack.h
@@ -906,6 +906,27 @@ public:
     return (definition_rib
            && definition_rib.value ().kind == Rib::Kind::ForwardTypeParamBan);
   }
+
+  void map_usage (Usage usage, Definition definition)
+  {
+    auto inserted = resolved_nodes.emplace (usage, definition).second;
+
+    // is that valid?
+    rust_assert (inserted);
+  }
+
+  tl::optional<NodeId> lookup (NodeId usage) const
+  {
+    auto it = resolved_nodes.find (Usage (usage));
+
+    if (it == resolved_nodes.end ())
+      return tl::nullopt;
+
+    return it->second.id;
+  }
+
+  /* Map of "usage" nodes which have been resolved to a "definition" node */
+  std::map<Usage, Definition> resolved_nodes;
 };
 
 } // namespace Resolver2_0
diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc 
b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
index f0db82775..20d8bc8c2 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -26,6 +26,7 @@
 #include "rust-name-resolution-context.h"
 #include "rust-resolve-builtins.h"
 #include "rust-path.h"
+#include "rust-rib.h"
 #include "rust-system.h"
 #include "rust-tyty.h"
 #include "rust-hir-type-check.h"
@@ -189,7 +190,8 @@ visit_identifier_as_pattern (NameResolutionContext &ctx,
     {
       auto res = ctx.values.get (ident);
       rust_assert (res.has_value () && !res->is_ambiguous ());
-      ctx.map_usage (Usage (node_id), Definition (res->get_node_id ()));
+      ctx.map_usage (Usage (node_id), Definition (res->get_node_id ()),
+                    Namespace::Values);
     }
   else
     {
@@ -244,7 +246,8 @@ Late::visit (AST::StructPatternFieldIdent &field)
   if (auto resolved = ctx.resolve_path (path, Namespace::Types))
     {
       ctx.map_usage (Usage (field.get_node_id ()),
-                    Definition (resolved->get_node_id ()));
+                    Definition (resolved->definition.get_node_id ()),
+                    Namespace::Types);
       return;
     }
 
@@ -299,7 +302,8 @@ Late::visit (AST::BreakExpr &expr)
 void
 Late::visit (AST::LoopLabel &label)
 {
-  auto resolved = ctx.lookup (label.get_lifetime ().get_node_id ());
+  auto resolved
+    = ctx.lookup (label.get_lifetime ().get_node_id (), Namespace::Labels);
   if (resolved.has_value ())
     return;
   auto &lifetime = label.get_lifetime ();
@@ -314,7 +318,8 @@ Late::resolve_label (AST::Lifetime &lifetime)
     {
       if (resolved->get_node_id () != lifetime.get_node_id ())
        ctx.map_usage (Usage (lifetime.get_node_id ()),
-                      Definition (resolved->get_node_id ()));
+                      Definition (resolved->get_node_id ()),
+                      Namespace::Labels);
     }
   else
     rust_error_at (lifetime.get_locus (), ErrorCode::E0426,
@@ -337,14 +342,17 @@ Late::visit (AST::IdentifierExpr &expr)
   // TODO: same thing as visit(PathInExpression) here?
 
   tl::optional<Rib::Definition> resolved = tl::nullopt;
+  tl::optional<Namespace> ns = tl::nullopt;
 
   if (auto value = ctx.values.get (expr.get_ident ()))
     {
       resolved = value;
+      ns = Namespace::Values;
     }
   else if (auto type = ctx.types.get (expr.get_ident ()))
     {
       resolved = type;
+      ns = Namespace::Types;
     }
   else if (funny_error)
     {
@@ -359,15 +367,18 @@ Late::visit (AST::IdentifierExpr &expr)
       if (auto type = ctx.types.get_lang_prelude (expr.get_ident ()))
        {
          resolved = type;
+         ns = Namespace::Types;
        }
       else if (!resolved && ctx.prelude)
        {
          resolved
            = ctx.values.get_from_prelude (*ctx.prelude, expr.get_ident ());
+         ns = Namespace::Values;
 
          if (!resolved)
            resolved
              = ctx.types.get_from_prelude (*ctx.prelude, expr.get_ident ());
+         ns = Namespace::Types;
        }
 
       if (!resolved)
@@ -387,7 +398,7 @@ Late::visit (AST::IdentifierExpr &expr)
     }
 
   ctx.map_usage (Usage (expr.get_node_id ()),
-                Definition (resolved->get_node_id ()));
+                Definition (resolved->get_node_id ()), ns.value ());
 
   // For empty types, do we perform a lookup in ctx.types or should the
   // toplevel instead insert a name in ctx.values? (like it currently does)
@@ -418,7 +429,7 @@ Late::visit (AST::StructExprFieldIdentifier &expr)
     }
 
   ctx.map_usage (Usage (expr.get_node_id ()),
-                Definition (resolved->get_node_id ()));
+                Definition (resolved->get_node_id ()), Namespace::Values);
 }
 
 void
@@ -430,26 +441,30 @@ Late::visit (AST::PathInExpression &expr)
 
   DefaultResolver::visit (expr);
 
+  // TODO: do we need a namespace associated with each lang item?
   if (expr.is_lang_item ())
     {
       ctx.map_usage (Usage (expr.get_node_id ()),
                     Definition (Analysis::Mappings::get ().get_lang_item_node (
-                      expr.get_lang_item ())));
+                      expr.get_lang_item ())),
+                    Namespace::Values);
       return;
     }
 
+  // TODO: we need to know which namespace that was in actually
   auto resolved = ctx.resolve_path (expr, Namespace::Values, Namespace::Types);
 
   if (!resolved)
     {
-      if (!ctx.lookup (expr.get_segments ().front ().get_node_id ()))
+      if (!ctx.lookup (expr.get_segments ().front ().get_node_id (),
+                      Namespace::Values, Namespace::Types))
        rust_error_at (expr.get_locus (), ErrorCode::E0433,
                       "Cannot find path %qs in this scope",
                       expr.as_simple_path ().as_string ().c_str ());
       return;
     }
 
-  if (resolved->is_ambiguous ())
+  if (resolved->definition.is_ambiguous ())
     {
       rust_error_at (expr.get_locus (), ErrorCode::E0659, "%qs is ambiguous",
                     expr.as_string ().c_str ());
@@ -457,7 +472,8 @@ Late::visit (AST::PathInExpression &expr)
     }
 
   ctx.map_usage (Usage (expr.get_node_id ()),
-                Definition (resolved->get_node_id ()));
+                Definition (resolved->definition.get_node_id ()),
+                resolved->ns);
 }
 
 void
@@ -498,21 +514,22 @@ resolve_type_path_like (NameResolutionContext &ctx, bool 
block_big_self,
 
   if (!resolved.has_value ())
     {
-      if (!ctx.lookup (unwrap_segment_node_id (type.get_segments ().front ())))
+      if (!ctx.lookup (unwrap_segment_node_id (type.get_segments ().front ()),
+                      Namespace::Types))
        rust_error_at (type.get_locus (), ErrorCode::E0412,
                       "could not resolve type path %qs",
                       unwrap_segment_error_string (type).c_str ());
       return;
     }
 
-  if (resolved->is_ambiguous ())
+  if (resolved->definition.is_ambiguous ())
     {
       rust_error_at (type.get_locus (), ErrorCode::E0659, "%qs is ambiguous",
                     unwrap_segment_error_string (type).c_str ());
       return;
     }
 
-  if (ctx.types.forward_declared (resolved->get_node_id (),
+  if (ctx.types.forward_declared (resolved->definition.get_node_id (),
                                  type.get_node_id ()))
     {
       rust_error_at (type.get_locus (), ErrorCode::E0128,
@@ -521,7 +538,8 @@ resolve_type_path_like (NameResolutionContext &ctx, bool 
block_big_self,
     }
 
   ctx.map_usage (Usage (type.get_node_id ()),
-                Definition (resolved->get_node_id ()));
+                Definition (resolved->definition.get_node_id ()),
+                Namespace::Types);
 }
 
 void
@@ -578,14 +596,15 @@ Late::visit (AST::Visibility &vis)
     }
 
   // TODO: is this possible?
-  if (res->is_ambiguous ())
+  if (res->definition.is_ambiguous ())
     {
       rust_error_at (path.get_locus (), ErrorCode::E0659, "%qs is ambiguous",
                     path.as_string ().c_str ());
       return;
     }
 
-  ctx.map_usage (Usage (path.get_node_id ()), Definition (res->get_node_id 
()));
+  ctx.map_usage (Usage (path.get_node_id ()),
+                Definition (res->definition.get_node_id ()), res->ns);
 }
 
 void
@@ -596,7 +615,7 @@ Late::visit (AST::Trait &trait)
   // which is then resolved to the node id of trait
   // we set up the latter mapping here
   ctx.map_usage (Usage (trait.get_implicit_self ().get_node_id ()),
-                Definition (trait.get_node_id ()));
+                Definition (trait.get_node_id ()), Namespace::Types);
 
   DefaultResolver::visit (trait);
 }
@@ -646,7 +665,8 @@ Late::visit (AST::StructExprStructFields &s)
     }
 
   ctx.map_usage (Usage (path.get_node_id ()),
-                Definition (resolved->get_node_id ()));
+                Definition (resolved->definition.get_node_id ()),
+                Namespace::Types);
 }
 
 // needed because Late::visit (AST::GenericArg &) is non-virtual
diff --git a/gcc/rust/resolve/rust-name-resolution-context.cc 
b/gcc/rust/resolve/rust-name-resolution-context.cc
index 70c74323e..a70eccfa8 100644
--- a/gcc/rust/resolve/rust-name-resolution-context.cc
+++ b/gcc/rust/resolve/rust-name-resolution-context.cc
@@ -19,6 +19,8 @@
 #include "rust-name-resolution-context.h"
 #include "optional.h"
 #include "rust-mapping-common.h"
+#include "rust-rib.h"
+#include "rust-system.h"
 
 namespace Rust {
 namespace Resolver2_0 {
@@ -130,7 +132,8 @@ BindingLayer::get_source () const
 }
 
 Resolver::CanonicalPath
-CanonicalPathRecordCrateRoot::as_path (const NameResolutionContext &)
+CanonicalPathRecordCrateRoot::as_path (const NameResolutionContext &,
+                                      Namespace ns)
 {
   auto ret = Resolver::CanonicalPath::new_seg (node_id, seg);
   ret.set_crate_num (crate_num);
@@ -138,19 +141,23 @@ CanonicalPathRecordCrateRoot::as_path (const 
NameResolutionContext &)
 }
 
 Resolver::CanonicalPath
-CanonicalPathRecordNormal::as_path (const NameResolutionContext &ctx)
+CanonicalPathRecordNormal::as_path (const NameResolutionContext &ctx,
+                                   Namespace ns)
 {
-  auto parent_path = get_parent ().as_path (ctx);
+  auto parent_path = get_parent ().as_path (ctx, ns);
   return parent_path.append (Resolver::CanonicalPath::new_seg (node_id, seg));
 }
 
 Resolver::CanonicalPath
-CanonicalPathRecordLookup::as_path (const NameResolutionContext &ctx)
+CanonicalPathRecordLookup::as_path (const NameResolutionContext &ctx,
+                                   Namespace ns)
 {
   if (!cache)
     {
-      auto res = ctx.lookup (lookup_id).and_then (
-       [&ctx] (NodeId id) { return ctx.canonical_ctx.get_record_opt (id); });
+      // TODO: what namespace do we use here? can the caller give one?
+      auto res = ctx.lookup (lookup_id, ns).and_then ([&ctx] (NodeId id) {
+       return ctx.canonical_ctx.get_record_opt (id);
+      });
 
       if (!res)
        {
@@ -163,25 +170,29 @@ CanonicalPathRecordLookup::as_path (const 
NameResolutionContext &ctx)
 
       cache = res.value ();
     }
-  return cache->as_path (ctx);
+  return cache->as_path (ctx, ns);
 }
 
 Resolver::CanonicalPath
-CanonicalPathRecordImpl::as_path (const NameResolutionContext &ctx)
+CanonicalPathRecordImpl::as_path (const NameResolutionContext &ctx,
+                                 Namespace ns)
 {
-  auto parent_path = get_parent ().as_path (ctx);
+  auto parent_path = get_parent ().as_path (ctx, ns);
   return parent_path.append (
     Resolver::CanonicalPath::inherent_impl_seg (impl_id,
-                                               type_record.as_path (ctx)));
+                                               type_record.as_path (ctx, ns)));
 }
 
 Resolver::CanonicalPath
-CanonicalPathRecordTraitImpl::as_path (const NameResolutionContext &ctx)
+CanonicalPathRecordTraitImpl::as_path (const NameResolutionContext &ctx,
+                                      Namespace ns)
 {
-  auto parent_path = get_parent ().as_path (ctx);
+  // Maybe this doesn't need the namespace and will always be in the types NS?
+  auto parent_path = get_parent ().as_path (ctx, ns);
   return parent_path.append (
     Resolver::CanonicalPath::trait_impl_projection_seg (
-      impl_id, trait_path_record.as_path (ctx), type_record.as_path (ctx)));
+      impl_id, trait_path_record.as_path (ctx, ns),
+      type_record.as_path (ctx, ns)));
 }
 
 NameResolutionContext::NameResolutionContext ()
@@ -253,24 +264,53 @@ NameResolutionContext::insert_globbed (Identifier name, 
NodeId id, Namespace ns)
     }
 }
 
+// TODO: Maybe this should take a NamespacedDefinition as argument?
 void
-NameResolutionContext::map_usage (Usage usage, Definition definition)
+NameResolutionContext::map_usage (Usage usage, Definition definition,
+                                 Namespace ns)
 {
-  auto inserted = resolved_nodes.emplace (usage, definition).second;
-
-  // is that valid?
-  // rust_assert (inserted);
+  switch (ns)
+    {
+    case Namespace::Values:
+      values.map_usage (usage, definition);
+      break;
+    case Namespace::Types:
+      types.map_usage (usage, definition);
+      break;
+    case Namespace::Labels:
+      labels.map_usage (usage, definition);
+      break;
+    case Namespace::Macros:
+      macros.map_usage (usage, definition);
+      break;
+    }
 }
 
 tl::optional<NodeId>
-NameResolutionContext::lookup (NodeId usage) const
+NameResolutionContext::lookup (NodeId usage, Namespace ns) const
 {
-  auto it = resolved_nodes.find (Usage (usage));
+  switch (ns)
+    {
+    case Namespace::Values:
+      return values.lookup (usage);
+    case Namespace::Types:
+      return types.lookup (usage);
+    case Namespace::Labels:
+      return labels.lookup (usage);
+    case Namespace::Macros:
+      return macros.lookup (usage);
+    default:
+      rust_unreachable ();
+    }
+}
 
-  if (it == resolved_nodes.end ())
-    return tl::nullopt;
+tl::optional<NodeId>
+NameResolutionContext::lookup (NodeId usage, Namespace ns1, Namespace ns2) 
const
+{
+  if (auto result = lookup (usage, ns1))
+    return result;
 
-  return it->second.id;
+  return lookup (usage, ns2);
 }
 
 void
diff --git a/gcc/rust/resolve/rust-name-resolution-context.h 
b/gcc/rust/resolve/rust-name-resolution-context.h
index f574bec51..e2e2e3ebd 100644
--- a/gcc/rust/resolve/rust-name-resolution-context.h
+++ b/gcc/rust/resolve/rust-name-resolution-context.h
@@ -223,7 +223,9 @@ class NameResolutionContext;
 class CanonicalPathRecord
 {
 public:
-  virtual Resolver::CanonicalPath as_path (const NameResolutionContext &) = 0;
+  virtual Resolver::CanonicalPath as_path (const NameResolutionContext &,
+                                          Namespace ns)
+    = 0;
 
   virtual bool is_root () const = 0;
 
@@ -254,7 +256,8 @@ public:
     crate_num = Analysis::Mappings::get ().lookup_crate_num (node_id).value ();
   }
 
-  Resolver::CanonicalPath as_path (const NameResolutionContext &) override;
+  Resolver::CanonicalPath as_path (const NameResolutionContext &,
+                                  Namespace ns) override;
 
   bool is_root () const override final { return true; }
 
@@ -275,7 +278,8 @@ public:
     rust_assert (!Analysis::Mappings::get ().node_is_crate (node_id));
   }
 
-  Resolver::CanonicalPath as_path (const NameResolutionContext &) override;
+  Resolver::CanonicalPath as_path (const NameResolutionContext &,
+                                  Namespace ns) override;
 
 private:
   NodeId node_id;
@@ -289,7 +293,8 @@ public:
     : lookup_id (lookup_id), cache (nullptr)
   {}
 
-  Resolver::CanonicalPath as_path (const NameResolutionContext &) override;
+  Resolver::CanonicalPath as_path (const NameResolutionContext &,
+                                  Namespace ns) override;
 
   bool is_root () const override final { return true; }
 
@@ -307,7 +312,8 @@ public:
       type_record (type_id)
   {}
 
-  Resolver::CanonicalPath as_path (const NameResolutionContext &) override;
+  Resolver::CanonicalPath as_path (const NameResolutionContext &,
+                                  Namespace ns) override;
 
 private:
   NodeId impl_id;
@@ -323,7 +329,8 @@ public:
       type_record (type_id), trait_path_record (trait_path_id)
   {}
 
-  Resolver::CanonicalPath as_path (const NameResolutionContext &) override;
+  Resolver::CanonicalPath as_path (const NameResolutionContext &,
+                                  Namespace ns) override;
 
 private:
   NodeId impl_id;
@@ -338,9 +345,9 @@ public:
     : current_record (nullptr), nr_ctx (&ctx)
   {}
 
-  Resolver::CanonicalPath get_path (NodeId id) const
+  Resolver::CanonicalPath get_path (NodeId id, Namespace ns) const
   {
-    return get_record (id).as_path (*nr_ctx);
+    return get_record (id).as_path (*nr_ctx, ns);
   }
 
   CanonicalPathRecord &get_record (NodeId id) const
@@ -517,46 +524,75 @@ public:
 
   CanonicalPathCtx canonical_ctx;
 
-  // TODO: Rename
-  // TODO: Use newtype pattern for Usage and Definition
-  void map_usage (Usage usage, Definition definition);
+  void map_usage (Usage usage, Definition definition, Namespace ns);
+  tl::optional<NodeId> lookup (NodeId usage, Namespace ns) const;
+  tl::optional<NodeId> lookup (NodeId usage, Namespace ns1,
+                              Namespace ns2) const;
 
-  tl::optional<NodeId> lookup (NodeId usage) const;
-
-  Resolver::CanonicalPath to_canonical_path (NodeId id) const
+  Resolver::CanonicalPath to_canonical_path (NodeId id, Namespace ns) const
   {
-    return canonical_ctx.get_path (id);
+    return canonical_ctx.get_path (id, ns);
   }
 
-  tl::optional<Rib::Definition>
+  /**
+   * The return value when the namespace in which a definition was resolved
+   * matters
+   */
+  struct NamespacedDefinition
+  {
+    explicit NamespacedDefinition (Rib::Definition definition, Namespace ns)
+      : definition (definition), ns (ns)
+    {}
+
+    static tl::optional<NamespacedDefinition>
+    Maybe (tl::optional<Rib::Definition> definition, Namespace ns)
+    {
+      return definition.map ([ns] (Rib::Definition definition) {
+       return NamespacedDefinition (definition, ns);
+      });
+    }
+
+    Rib::Definition definition;
+    Namespace ns;
+  };
+
+  tl::optional<NamespacedDefinition>
   resolve_path (const ResolutionPath &path, ResolutionMode mode,
                std::vector<Error> &collect_errors, Namespace ns)
   {
     std::function<void (Usage, Definition)> insert_segment_resolution
-      = [this] (Usage seg_id, Definition id) {
+      = [this, ns] (Usage seg_id, Definition id) {
          if (resolved_nodes.find (seg_id) == resolved_nodes.end ())
-           map_usage (seg_id, id);
+           map_usage (seg_id, id, ns);
        };
 
-    tl::optional<Rib::Definition> resolved = tl::nullopt;
+    tl::optional<NamespacedDefinition> resolved = tl::nullopt;
 
     switch (ns)
       {
       case Namespace::Values:
-       resolved = resolve_path (values, path, mode, insert_segment_resolution,
-                                collect_errors);
+       resolved = NamespacedDefinition::Maybe (
+         resolve_path (values, path, mode, insert_segment_resolution,
+                       collect_errors),
+         ns);
        break;
       case Namespace::Types:
-       resolved = resolve_path (types, path, mode, insert_segment_resolution,
-                                collect_errors);
+       resolved = NamespacedDefinition::Maybe (
+         resolve_path (types, path, mode, insert_segment_resolution,
+                       collect_errors),
+         ns);
        break;
       case Namespace::Macros:
-       resolved = resolve_path (macros, path, mode, insert_segment_resolution,
-                                collect_errors);
+       resolved = NamespacedDefinition::Maybe (
+         resolve_path (macros, path, mode, insert_segment_resolution,
+                       collect_errors),
+         ns);
        break;
       case Namespace::Labels:
-       resolved = resolve_path (labels, path, mode, insert_segment_resolution,
-                                collect_errors);
+       resolved = NamespacedDefinition::Maybe (
+         resolve_path (labels, path, mode, insert_segment_resolution,
+                       collect_errors),
+         ns);
        break;
       default:
        rust_unreachable ();
@@ -569,17 +605,25 @@ public:
        switch (ns)
          {
          case Namespace::Values:
-           return resolve_path (values, path, mode, insert_segment_resolution,
-                                collect_errors, *prelude);
+           return NamespacedDefinition::Maybe (
+             resolve_path (values, path, mode, insert_segment_resolution,
+                           collect_errors, *prelude),
+             ns);
          case Namespace::Types:
-           return resolve_path (types, path, mode, insert_segment_resolution,
-                                collect_errors, *prelude);
+           return NamespacedDefinition::Maybe (
+             resolve_path (types, path, mode, insert_segment_resolution,
+                           collect_errors, *prelude),
+             ns);
          case Namespace::Macros:
-           return resolve_path (macros, path, mode, insert_segment_resolution,
-                                collect_errors, *prelude);
+           return NamespacedDefinition::Maybe (
+             resolve_path (macros, path, mode, insert_segment_resolution,
+                           collect_errors, *prelude),
+             ns);
          case Namespace::Labels:
-           return resolve_path (labels, path, mode, insert_segment_resolution,
-                                collect_errors, *prelude);
+           return NamespacedDefinition::Maybe (
+             resolve_path (labels, path, mode, insert_segment_resolution,
+                           collect_errors, *prelude),
+             ns);
          default:
            rust_unreachable ();
          }
@@ -651,7 +695,7 @@ public:
       this->collect_errors = collect_errors;
     }
 
-    tl::optional<Rib::Definition> resolve ()
+    tl::optional<NamespacedDefinition> resolve ()
     {
       rust_assert (has_path_set);
 
@@ -693,7 +737,7 @@ public:
   };
 
   template <typename S, typename... Args>
-  tl::optional<Rib::Definition>
+  tl::optional<NamespacedDefinition>
   resolve_path (const std::vector<S> &path_segments, ResolutionMode mode,
                tl::optional<std::vector<Error> &> collect_errors,
                Namespace ns_first, Args... ns_args)
@@ -707,7 +751,7 @@ public:
   }
 
   template <typename S, typename... Args>
-  tl::optional<Rib::Definition>
+  tl::optional<NamespacedDefinition>
   resolve_path (const std::vector<S> &path_segments,
                bool has_opening_scope_resolution,
                tl::optional<std::vector<Error> &> collect_errors,
@@ -723,7 +767,7 @@ public:
   }
 
   template <typename S, typename... Args>
-  tl::optional<Rib::Definition>
+  tl::optional<NamespacedDefinition>
   resolve_path (const std::vector<S> &path_segments,
                bool has_opening_scope_resolution, Namespace ns_first,
                Args... ns_args)
@@ -737,7 +781,7 @@ public:
   }
 
   template <typename S, typename... Args>
-  tl::optional<Rib::Definition>
+  tl::optional<NamespacedDefinition>
   resolve_path (const std::vector<S> &path_segments, ResolutionMode mode,
                Namespace ns_first, Args... ns_args)
   {
@@ -749,8 +793,8 @@ public:
   }
 
   template <typename... Args>
-  tl::optional<Rib::Definition> resolve_path (const AST::SimplePath &path,
-                                             Args &&...args)
+  tl::optional<NamespacedDefinition> resolve_path (const AST::SimplePath &path,
+                                                  Args &&...args)
   {
     return resolve_path (path.get_segments (),
                         path.has_opening_scope_resolution (),
@@ -758,16 +802,16 @@ public:
   }
 
   template <typename... Args>
-  tl::optional<Rib::Definition> resolve_path (const AST::PathInExpression 
&path,
-                                             Args &&...args)
+  tl::optional<NamespacedDefinition>
+  resolve_path (const AST::PathInExpression &path, Args &&...args)
   {
     return resolve_path (path.get_segments (), path.opening_scope_resolution 
(),
                         std::forward<Args> (args)...);
   }
 
   template <typename... Args>
-  tl::optional<Rib::Definition> resolve_path (const AST::TypePath &path,
-                                             Args &&...args)
+  tl::optional<NamespacedDefinition> resolve_path (const AST::TypePath &path,
+                                                  Args &&...args)
   {
     return resolve_path (path.get_segments (),
                         path.has_opening_scope_resolution_op (),
@@ -780,8 +824,8 @@ public:
     // This is an internal compiler error
     NoDefinition,
     // There was a loop in the map, such as an import resolving to another
-    // import which eventually resolved to the original import. Report the 
error
-    // and stop the pipeline
+    // import which eventually resolved to the original import. Report the
+    // error and stop the pipeline
     Loop,
   };
 
@@ -792,22 +836,23 @@ public:
    * We've now collected every definition and import, and errored out when
    * necessary if multiple definitions are colliding. Do a final flattening of
    * the name resolution context to make it easier to digest for the late name
-   * resolution and type-checker. This basically turns the `resolved_nodes` map
-   * from a linked-list-like map to a regular, flat hashmap.
+   * resolution and type-checker. This basically turns the `resolved_nodes`
+   * map from a linked-list-like map to a regular, flat hashmap.
    *
-   * FIXME: The documentation is wrong, this needs to also run after all usages
-   * have been *resolved* so after Late as well!!!
+   * FIXME: The documentation is wrong, this needs to also run after all
+   * usages have been *resolved* so after Late as well!!!
    *
-   * TODO: Should this return something like the FinalizedNameResolutionCtx? Or
-   * set it up at least? And instead of mutating the `resolved_nodes` map,
+   * TODO: Should this return something like the FinalizedNameResolutionCtx?
+   * Or set it up at least? And instead of mutating the `resolved_nodes` map,
    * create a new one for the FinalizedNameResolutionCtx?
    * Actually, since Late uses the NRCtx directly we should mutate this. Most
-   * later passes don't look at this map. So let's go for side-effects in a 
void
-   * function, yipee.
+   * later passes don't look at this map. So let's go for side-effects in a
+   * void function, yipee.
    */
   void flatten ();
 
-  /* If declared with #[prelude_import], the current standard library module */
+  /* If declared with #[prelude_import], the current standard library module
+   */
   tl::optional<NodeId> prelude;
 
 private:
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc 
b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
index 0d99eb7e9..357fb5997 100644
--- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc
+++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
@@ -18,6 +18,7 @@
 
 #include "rust-hir-trait-resolve.h"
 #include "rust-hir-type-check-expr.h"
+#include "rust-rib.h"
 #include "rust-substitution-mapper.h"
 #include "rust-type-util.h"
 #include "rust-finalized-name-resolution-context.h"
@@ -123,7 +124,8 @@ TraitResolver::resolve_path_to_trait (const HIR::TypePath 
&path,
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   NodeId ref;
-  if (auto ref_opt = nr_ctx.lookup (path.get_mappings ().get_nodeid ()))
+  if (auto ref_opt = nr_ctx.lookup (path.get_mappings ().get_nodeid (),
+                                   Resolver2_0::Namespace::Types))
     {
       ref = *ref_opt;
     }
diff --git a/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc 
b/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
index 8566bcd7d..f1e4c51b4 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
@@ -20,6 +20,7 @@
 #include "rust-hir-type-check-type.h"
 #include "rust-hir-type-check-expr.h"
 #include "rust-hir-type-check-enumitem.h"
+#include "rust-rib.h"
 #include "rust-type-util.h"
 #include "rust-finalized-name-resolution-context.h"
 
@@ -79,7 +80,8 @@ TypeCheckEnumItem::visit (HIR::EnumItem &item)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Types);
 
   RustIdent ident{canonical_path, item.get_locus ()};
   variant = new TyTy::VariantDef (item.get_mappings ().get_hirid (),
@@ -110,7 +112,8 @@ TypeCheckEnumItem::visit (HIR::EnumItemDiscriminant &item)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Types);
 
   RustIdent ident{canonical_path, item.get_locus ()};
   variant
@@ -159,7 +162,8 @@ TypeCheckEnumItem::visit (HIR::EnumItemTuple &item)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Types);
 
   RustIdent ident{canonical_path, item.get_locus ()};
   variant = new TyTy::VariantDef (item.get_mappings ().get_hirid (),
@@ -206,7 +210,8 @@ TypeCheckEnumItem::visit (HIR::EnumItemStruct &item)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Types);
 
   RustIdent ident{canonical_path, item.get_locus ()};
   variant = new TyTy::VariantDef (item.get_mappings ().get_hirid (),
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc 
b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
index 897057040..07ac5c4ea 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
@@ -20,6 +20,7 @@
 #include "rust-common.h"
 #include "rust-hir-expr.h"
 #include "rust-hir-map.h"
+#include "rust-rib.h"
 #include "rust-system.h"
 #include "rust-tyty-call.h"
 #include "rust-hir-type-check-struct-field.h"
@@ -1539,7 +1540,8 @@ TypeCheckExpr::visit (HIR::MethodCallExpr &expr)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   nr_ctx.map_usage (Resolver2_0::Usage (expr.get_mappings ().get_nodeid ()),
-                   Resolver2_0::Definition (resolved_node_id));
+                   Resolver2_0::Definition (resolved_node_id),
+                   Resolver2_0::Namespace::Values);
 
   // return the result of the function back
   infered = function_ret_tyty;
@@ -2182,7 +2184,8 @@ TypeCheckExpr::resolve_operator_overload (
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   nr_ctx.map_usage (Resolver2_0::Usage (expr.get_mappings ().get_nodeid ()),
-                   Resolver2_0::Definition (resolved_node_id));
+                   Resolver2_0::Definition (resolved_node_id),
+                   Resolver2_0::Namespace::Types);
 
   // return the result of the function back
   infered = function_ret_tyty;
@@ -2376,12 +2379,17 @@ TypeCheckExpr::resolve_fn_trait_call (HIR::CallExpr 
&expr,
   // set up the resolved name on the path
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
-  auto existing = nr_ctx.lookup (expr.get_mappings ().get_nodeid ());
+  // TODO: What namespace to use for inserting and looking up here? It's a 
trait
+  // call, so NS::Types is right?
+
+  auto existing = nr_ctx.lookup (expr.get_mappings ().get_nodeid (),
+                                Resolver2_0::Namespace::Types);
   if (existing)
     rust_assert (*existing == resolved_node_id);
   else
     nr_ctx.map_usage (Resolver2_0::Usage (expr.get_mappings ().get_nodeid ()),
-                     Resolver2_0::Definition (resolved_node_id));
+                     Resolver2_0::Definition (resolved_node_id),
+                     Resolver2_0::Namespace::Types);
 
   // return the result of the function back
   *result = function_ret_tyty;
diff --git a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc 
b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
index 85ccd60a4..8e07cc5f8 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
@@ -24,6 +24,7 @@
 #include "rust-hir-type-check-type.h"
 #include "rust-hir-type-check-expr.h"
 #include "rust-hir-type-check-pattern.h"
+#include "rust-rib.h"
 #include "rust-type-util.h"
 #include "rust-tyty.h"
 #include "rust-finalized-name-resolution-context.h"
@@ -342,7 +343,8 @@ TypeCheckImplItem::visit (HIR::Function &function)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (function.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (function.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Types);
 
   RustIdent ident{canonical_path, function.get_locus ()};
   auto fnType = new TyTy::FnType (
@@ -400,8 +402,10 @@ TypeCheckImplItem::visit (HIR::ConstantItem &constant)
 
   // special case when this is a generic constant
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
+  // TODO: Is Values the correct NS?
   CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (constant.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (constant.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Values);
   RustIdent ident{canonical_path, constant.get_locus ()};
   auto fnType = new TyTy::FnType (
     constant.get_mappings ().get_hirid (),
diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.cc 
b/gcc/rust/typecheck/rust-hir-type-check-item.cc
index db6682fd3..3e4e23658 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-item.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-item.cc
@@ -28,6 +28,7 @@
 #include "rust-hir-type-check-pattern.h"
 #include "rust-hir-trait-resolve.h"
 #include "rust-identifier.h"
+#include "rust-rib.h"
 #include "rust-session-manager.h"
 #include "rust-finalized-name-resolution-context.h"
 #include "rust-substitution-mapper.h"
@@ -208,7 +209,8 @@ TypeCheckItem::visit (HIR::TupleStruct &struct_decl)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath path
-    = nr_ctx.to_canonical_path (struct_decl.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (struct_decl.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Types);
 
   RustIdent ident{path, struct_decl.get_locus ()};
 
@@ -276,7 +278,8 @@ TypeCheckItem::visit (HIR::StructStruct &struct_decl)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath path
-    = nr_ctx.to_canonical_path (struct_decl.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (struct_decl.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Types);
 
   RustIdent ident{path, struct_decl.get_locus ()};
 
@@ -354,7 +357,8 @@ TypeCheckItem::visit (HIR::Enum &enum_decl)
 
   // get the path
   CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (enum_decl.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (enum_decl.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Types);
 
   RustIdent ident{canonical_path, enum_decl.get_locus ()};
 
@@ -406,7 +410,8 @@ TypeCheckItem::visit (HIR::Union &union_decl)
 
   // get the path
   CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (union_decl.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (union_decl.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Types);
 
   RustIdent ident{canonical_path, union_decl.get_locus ()};
 
@@ -569,7 +574,8 @@ TypeCheckItem::visit (HIR::Function &function)
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath path
-    = nr_ctx.to_canonical_path (function.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (function.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Values);
 
   RustIdent ident{path, function.get_locus ()};
 
diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc 
b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index f4405f37b..94830ddbd 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -23,6 +23,7 @@
 #include "rust-hir-type-check-type.h"
 #include "rust-hir-type-check-item.h"
 #include "rust-hir-trait-resolve.h"
+#include "rust-rib.h"
 #include "rust-substitution-mapper.h"
 #include "rust-hir-path-probe.h"
 #include "rust-type-util.h"
@@ -160,7 +161,8 @@ TypeCheckExpr::visit (HIR::QualifiedPathInExpression &expr)
       auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
       nr_ctx.map_usage (Resolver2_0::Usage (expr.get_mappings ().get_nodeid 
()),
-                       Resolver2_0::Definition (root_resolved_node_id));
+                       Resolver2_0::Definition (root_resolved_node_id),
+                       Resolver2_0::Namespace::Values);
       return;
     }
 
@@ -258,7 +260,7 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression 
&expr, size_t *offset,
 
       // lookup the reference_node_id
       NodeId ref_node_id;
-      if (auto res = nr_ctx.lookup (ast_node_id))
+      if (auto res = nr_ctx.lookup (ast_node_id, 
Resolver2_0::Namespace::Types))
        {
          ref_node_id = *res;
        }
@@ -545,7 +547,8 @@ TypeCheckExpr::resolve_segments (NodeId 
root_resolved_node_id,
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   nr_ctx.map_usage (Resolver2_0::Usage (expr_mappings.get_nodeid ()),
-                   Resolver2_0::Definition (resolved_node_id));
+                   Resolver2_0::Definition (resolved_node_id),
+                   Resolver2_0::Namespace::Values);
 
   infered = tyseg;
 }
diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc 
b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index 6cc14e019..8c99790f4 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -19,6 +19,7 @@
 #include "rust-hir-type-check-pattern.h"
 #include "rust-hir-pattern.h"
 #include "rust-hir-type-check-expr.h"
+#include "rust-rib.h"
 #include "rust-token.h"
 #include "rust-type-util.h"
 #include "rust-finalized-name-resolution-context.h"
@@ -48,7 +49,7 @@ TypeCheckPattern::Resolve (HIR::Pattern &pattern, 
TyTy::BaseType *parent)
 void
 TypeCheckPattern::visit (HIR::PathInExpression &pattern)
 {
-  // Pattern must be enum variants, sturcts, constants, or associated 
constansts
+  // Pattern must be enum variants, structs, constants, or associated 
constansts
   TyTy::BaseType *pattern_ty = TypeCheckExpr::Resolve (pattern);
 
   NodeId ref_node_id = UNKNOWN_NODEID;
@@ -56,7 +57,9 @@ TypeCheckPattern::visit (HIR::PathInExpression &pattern)
 
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
-  if (auto id = nr_ctx.lookup (pattern.get_mappings ().get_nodeid ()))
+  // FIXME: Not sure if this is enough to look up enum variants
+  if (auto id = nr_ctx.lookup (pattern.get_mappings ().get_nodeid (),
+                              Resolver2_0::Namespace::Values))
     {
       ref_node_id = *id;
       maybe_item = true;
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc 
b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index 4bc73ada0..451261363 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -26,6 +26,7 @@
 #include "rust-hir-type-bounds.h"
 #include "rust-finalized-name-resolution-context.h"
 #include "rust-mapping-common.h"
+#include "rust-rib.h"
 #include "rust-substitution-mapper.h"
 #include "rust-type-util.h"
 #include "rust-system.h"
@@ -346,9 +347,8 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, 
size_t *offset,
          auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
          // assign the ref_node_id if we've found something
-         nr_ctx.lookup (ast_node_id).map ([&ref_node_id] (NodeId resolved) {
-           ref_node_id = resolved;
-         });
+         nr_ctx.lookup (ast_node_id, Resolver2_0::Namespace::Types)
+           .map ([&ref_node_id] (NodeId resolved) { ref_node_id = resolved; });
        }
 
       // ref_node_id is the NodeId that the segments refers to.
@@ -1109,7 +1109,7 @@ ResolveWhereClauseItem::visit 
(HIR::TypeBoundWhereClauseItem &item)
 
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
-  if (auto id = nr_ctx.lookup (ast_node_id))
+  if (auto id = nr_ctx.lookup (ast_node_id, Resolver2_0::Namespace::Types))
     {
       ref_node_id = *id;
     }
diff --git a/gcc/rust/typecheck/rust-hir-type-check.cc 
b/gcc/rust/typecheck/rust-hir-type-check.cc
index 49f3aeb68..e0f819ea1 100644
--- a/gcc/rust/typecheck/rust-hir-type-check.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check.cc
@@ -25,6 +25,7 @@
 #include "rust-hir-type-check-pattern.h"
 #include "rust-hir-type-check-struct-field.h"
 #include "rust-finalized-name-resolution-context.h"
+#include "rust-rib.h"
 
 extern bool saw_errors (void);
 
@@ -278,7 +279,8 @@ TraitItemReference::get_type_from_fn (/*const*/ 
HIR::TraitItemFunc &fn) const
   auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
-    = nr_ctx.to_canonical_path (fn.get_mappings ().get_nodeid ());
+    = nr_ctx.to_canonical_path (fn.get_mappings ().get_nodeid (),
+                               Resolver2_0::Namespace::Types);
 
   RustIdent ident{canonical_path, fn.get_locus ()};
   auto resolved = new TyTy::FnType (
diff --git a/gcc/rust/typecheck/rust-type-util.cc 
b/gcc/rust/typecheck/rust-type-util.cc
index d59e5f0c0..76451c771 100644
--- a/gcc/rust/typecheck/rust-type-util.cc
+++ b/gcc/rust/typecheck/rust-type-util.cc
@@ -25,6 +25,7 @@
 #include "rust-hir-type-check-type.h"
 #include "rust-casts.h"
 #include "rust-mapping-common.h"
+#include "rust-rib.h"
 #include "rust-unify.h"
 #include "rust-coercion.h"
 #include "rust-hir-type-bounds.h"
@@ -106,9 +107,8 @@ query_type (HirId reference, TyTy::BaseType **result)
          auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
          // assign the ref_node_id if we've found something
-         nr_ctx.lookup (ast_node_id).map ([&ref_node_id] (NodeId resolved) {
-           ref_node_id = resolved;
-         });
+         nr_ctx.lookup (ast_node_id, Resolver2_0::Namespace::Types)
+           .map ([&ref_node_id] (NodeId resolved) { ref_node_id = resolved; });
 
          if (ref_node_id != UNKNOWN_NODEID)
            {
-- 
2.54.0

Reply via email to