[gcc r16-6837] gccrs: nr: Do prelude resolution for Identifiers

Arthur Cohen cohenarthur@gcc.gnu.org
Fri Jan 16 16:30:08 GMT 2026


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

commit r16-6837-g30e3760e63f10bc511e0976247d44487e514d3ce
Author: Arthur Cohen <arthur.cohen@embecosm.com>
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",


More information about the Gcc-cvs mailing list