]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: nr: Do prelude resolution for Identifiers
authorArthur Cohen <arthur.cohen@embecosm.com>
Fri, 12 Sep 2025 14:11:15 +0000 (16:11 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Fri, 16 Jan 2026 16:32:06 +0000 (17:32 +0100)
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.

gcc/rust/resolve/rust-forever-stack.h
gcc/rust/resolve/rust-forever-stack.hxx
gcc/rust/resolve/rust-late-name-resolver-2.0.cc

index 2a88df7b9e0b9097593bec7ba0c07b8523ee0f46..cca98b55c2a9f6d9a058d5790ceecbcc7ebf2df3 100644 (file)
@@ -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`
index bd35d6c4e4a7921435045a2f87ef7cc66d86e5c8..1093646eb4f8586f77c1b95b613659711f0ae8db 100644 (file)
@@ -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)
index 0da8c38b63e0809c163c973064df563bdefcb5fa..9a7c2f8a0b66a01844ded161dba112ecf65d22a0 100644 (file)
@@ -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",