https://gcc.gnu.org/g:9753ae307b89cc1e6934ecc16736abe2158a7333

commit r15-8430-g9753ae307b89cc1e6934ecc16736abe2158a7333
Author: Owen Avery <powerboat9.ga...@gmail.com>
Date:   Tue Oct 15 15:35:21 2024 -0400

    gccrs: Use name resolver 2.0 during pattern typechecking
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-hir-type-check-pattern.cc: Add includes.
            (TypeCheckPattern::visit): Use name resolver 2.0 if enabled.
    
            * resolve/rust-name-resolution-context.cc
            (NameResolutionContext::lookup): Make const qualified.
            * resolve/rust-name-resolution-context.h
            (NameResolutionContext::lookup): Likewise.
    
    Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>

Diff:
---
 gcc/rust/resolve/rust-name-resolution-context.cc  |  2 +-
 gcc/rust/resolve/rust-name-resolution-context.h   |  2 +-
 gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 30 ++++++++++++++++++-----
 3 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/gcc/rust/resolve/rust-name-resolution-context.cc 
b/gcc/rust/resolve/rust-name-resolution-context.cc
index d79f7b5f222a..9bfaa094abe1 100644
--- a/gcc/rust/resolve/rust-name-resolution-context.cc
+++ b/gcc/rust/resolve/rust-name-resolution-context.cc
@@ -92,7 +92,7 @@ NameResolutionContext::map_usage (Usage usage, Definition 
definition)
 }
 
 tl::optional<NodeId>
-NameResolutionContext::lookup (NodeId usage)
+NameResolutionContext::lookup (NodeId usage) const
 {
   auto it = resolved_nodes.find (Usage (usage));
 
diff --git a/gcc/rust/resolve/rust-name-resolution-context.h 
b/gcc/rust/resolve/rust-name-resolution-context.h
index e2652dc3b9eb..cd6fa931be51 100644
--- a/gcc/rust/resolve/rust-name-resolution-context.h
+++ b/gcc/rust/resolve/rust-name-resolution-context.h
@@ -213,7 +213,7 @@ public:
   // TODO: Use newtype pattern for Usage and Definition
   void map_usage (Usage usage, Definition definition);
 
-  tl::optional<NodeId> lookup (NodeId usage);
+  tl::optional<NodeId> lookup (NodeId usage) const;
 
 private:
   /* Map of "usage" nodes which have been resolved to a "definition" node */
diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc 
b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index 53196369202c..88e4d32f6bc2 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -20,6 +20,10 @@
 #include "rust-hir-pattern.h"
 #include "rust-hir-type-check-expr.h"
 #include "rust-type-util.h"
+#include "rust-immutable-name-resolution-context.h"
+
+// for flag_name_resolution_2_0
+#include "options.h"
 
 namespace Rust {
 namespace Resolver {
@@ -49,12 +53,26 @@ TypeCheckPattern::visit (HIR::PathInExpression &pattern)
 
   NodeId ref_node_id = UNKNOWN_NODEID;
   bool maybe_item = false;
-  maybe_item
-    |= resolver->lookup_resolved_name (pattern.get_mappings ().get_nodeid (),
-                                      &ref_node_id);
-  maybe_item
-    |= resolver->lookup_resolved_type (pattern.get_mappings ().get_nodeid (),
-                                      &ref_node_id);
+
+  if (flag_name_resolution_2_0)
+    {
+      auto &nr_ctx
+       = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+
+      if (auto id = nr_ctx.lookup (pattern.get_mappings ().get_nodeid ()))
+       {
+         ref_node_id = *id;
+         maybe_item = true;
+       }
+    }
+  else
+    {
+      maybe_item |= resolver->lookup_resolved_name (
+       pattern.get_mappings ().get_nodeid (), &ref_node_id);
+      maybe_item |= resolver->lookup_resolved_type (
+       pattern.get_mappings ().get_nodeid (), &ref_node_id);
+    }
+
   bool path_is_const_item = false;
 
   if (maybe_item)

Reply via email to