https://gcc.gnu.org/g:30e3760e63f10bc511e0976247d44487e514d3ce

commit r16-6837-g30e3760e63f10bc511e0976247d44487e514d3ce
Author: Arthur Cohen <[email protected]>
Date:   Fri Sep 12 16:11:15 2025 +0200

    gccrs: nr: Do prelude resolution for Identifiers
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-forever-stack.h: New function.
            * resolve/rust-forever-stack.hxx: Implement it.
            * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Call it if 
the prelude exists
            and we have an unresolved Identifier Call it if the prelude exists 
and we have
            an unresolved Identifier.

Diff:
---
 gcc/rust/resolve/rust-forever-stack.h           |  2 ++
 gcc/rust/resolve/rust-forever-stack.hxx         | 11 +++++++++++
 gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 12 +++++++++++-
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/gcc/rust/resolve/rust-forever-stack.h 
b/gcc/rust/resolve/rust-forever-stack.h
index 2a88df7b9e0b..cca98b55c2a9 100644
--- a/gcc/rust/resolve/rust-forever-stack.h
+++ b/gcc/rust/resolve/rust-forever-stack.h
@@ -668,6 +668,8 @@ public:
   tl::optional<Rib::Definition> get (const Identifier &name);
   tl::optional<Rib::Definition> get_lang_prelude (const Identifier &name);
   tl::optional<Rib::Definition> get_lang_prelude (const std::string &name);
+  tl::optional<Rib::Definition> get_from_prelude (NodeId prelude,
+                                                 const Identifier &name);
 
   /**
    * Resolve a path to its definition in the current `ForeverStack`
diff --git a/gcc/rust/resolve/rust-forever-stack.hxx 
b/gcc/rust/resolve/rust-forever-stack.hxx
index bd35d6c4e4a7..1093646eb4f8 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -343,6 +343,17 @@ ForeverStack<N>::get_lang_prelude (const std::string &name)
   return lang_prelude.rib.get (name);
 }
 
+template <Namespace N>
+tl::optional<Rib::Definition>
+ForeverStack<N>::get_from_prelude (NodeId prelude, const Identifier &name)
+{
+  auto starting_point = dfs_node (root, prelude);
+  if (!starting_point)
+    return tl::nullopt;
+
+  return get (*starting_point, name);
+}
+
 template <>
 tl::optional<Rib::Definition> inline ForeverStack<Namespace::Labels>::get (
   const Identifier &name)
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 0da8c38b63e0..9a7c2f8a0b66 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -346,7 +346,17 @@ Late::visit (AST::IdentifierExpr &expr)
        {
          resolved = type;
        }
-      else
+      else if (!resolved && ctx.prelude)
+       {
+         resolved
+           = ctx.values.get_from_prelude (*ctx.prelude, expr.get_ident ());
+
+         if (!resolved)
+           resolved
+             = ctx.types.get_from_prelude (*ctx.prelude, expr.get_ident ());
+       }
+
+      if (!resolved)
        {
          rust_error_at (expr.get_locus (), ErrorCode::E0425,
                         "cannot find value %qs in this scope",

Reply via email to