https://gcc.gnu.org/g:7c0801466908df2fd6f7aa6b60488c8902c8c982

commit r17-3124-g7c0801466908df2fd6f7aa6b60488c8902c8c982
Author: Owen Avery <[email protected]>
Date:   Wed Jul 29 08:30:08 2026 -0400

    gccrs: Generalize prelude import handling
    
    Replace some ad-hoc handling of prelude imports with a glob import in
    every module/crate.
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-default-resolver.cc
            (DefaultResolver::visit (Crate)): Call maybe_prelude_import.
            (DefaultResolver::visit (Module)): Likewise.
            * resolve/rust-default-resolver.h
            (DefaultResolver::maybe_prelude_import): New virtual member
            function.
            * resolve/rust-early-name-resolver-2.0.cc
            (Early::maybe_prelude_import): New member function definition.
            (Early::finalize_glob_import): Mark visitor as dirty when
            first setting ctx.prelude.
            * resolve/rust-early-name-resolver-2.0.h
            (Early::maybe_prelude_import): New member function declaration.
            * resolve/rust-late-name-resolver-2.0.cc
            (Late::visit (IdentifierExpr)): Remove ad-hoc prelude import
            handling.
    
    Signed-off-by: Owen Avery <[email protected]>

Diff:
---
 gcc/rust/resolve/rust-default-resolver.cc        | 11 ++++++++---
 gcc/rust/resolve/rust-default-resolver.h         |  1 +
 gcc/rust/resolve/rust-early-name-resolver-2.0.cc | 20 ++++++++++++++++++++
 gcc/rust/resolve/rust-early-name-resolver-2.0.h  |  1 +
 gcc/rust/resolve/rust-late-name-resolver-2.0.cc  | 11 -----------
 5 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/gcc/rust/resolve/rust-default-resolver.cc 
b/gcc/rust/resolve/rust-default-resolver.cc
index 9b23ab38bc23..7a54c6ee1343 100644
--- a/gcc/rust/resolve/rust-default-resolver.cc
+++ b/gcc/rust/resolve/rust-default-resolver.cc
@@ -36,7 +36,10 @@ DefaultResolver::visit (AST::Crate &crate)
   if (!visited_crates.insert (crate.get_node_id ()).second)
     return;
 
-  auto inner_fn = [this, &crate] () { AST::DefaultASTVisitor::visit (crate); };
+  auto inner_fn = [this, &crate] () {
+    maybe_prelude_import ();
+    AST::DefaultASTVisitor::visit (crate);
+  };
 
   auto &mappings = Analysis::Mappings::get ();
 
@@ -62,8 +65,10 @@ DefaultResolver::visit (AST::BlockExpr &expr)
 void
 DefaultResolver::visit (AST::Module &module)
 {
-  auto item_fn_1
-    = [this, &module] () { AST::DefaultASTVisitor::visit (module); };
+  auto item_fn_1 = [this, &module] () {
+    maybe_prelude_import ();
+    AST::DefaultASTVisitor::visit (module);
+  };
 
   auto item_fn_2 = [this, &module, &item_fn_1] () {
     ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (),
diff --git a/gcc/rust/resolve/rust-default-resolver.h 
b/gcc/rust/resolve/rust-default-resolver.h
index 2d53ff3a73bb..bd2bab9f8ca8 100644
--- a/gcc/rust/resolve/rust-default-resolver.h
+++ b/gcc/rust/resolve/rust-default-resolver.h
@@ -45,6 +45,7 @@ public:
   // these nodes create new scopes and ribs - they are often used to declare 
new
   // variables, such as a for loop's iterator, or a function's arguments
   void visit (AST::BlockExpr &) override;
+  virtual void maybe_prelude_import () {}
   void visit (AST::Module &) override;
   void visit (AST::Function &) override;
   void visit (AST::LoopExpr &expr) override;
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 12f29ceed7c2..56f91db89dcd 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
@@ -313,6 +313,22 @@ Early::visit (AST::Module &module)
     textual_scope.pop ();
 }
 
+void
+Early::maybe_prelude_import ()
+{
+  // handle prelude import
+  if (ctx.prelude)
+    {
+      auto container = Analysis::Mappings::get ().lookup_glob_container (
+       ctx.prelude.value ());
+      rust_assert (container);
+
+      GlobbingVisitor glob_visit (ctx);
+      glob_visit.go (container.value ());
+      dirty |= glob_visit.is_dirty ();
+    }
+}
+
 void
 Early::visit (AST::MacroInvocation &invoc)
 {
@@ -489,6 +505,10 @@ Early::finalize_glob_import (NameResolutionContext &ctx,
       rust_assert (container.value ()->get_glob_container_kind ()
                   == AST::GlobContainer::Kind::Module);
 
+      // TODO: catch multiple attempted prelude imports
+      if (!ctx.prelude)
+       dirty = true;
+
       ctx.prelude = mapping.data.container ().get_node_id ();
     }
 
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 7ea9e9f2ccc4..f2297d58eb8e 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.h
@@ -59,6 +59,7 @@ public:
 
   // as well as lexical scopes
   void visit (AST::BlockExpr &) override;
+  void maybe_prelude_import () override;
   void visit (AST::Module &) override;
 
   void visit (AST::MacroInvocation &) override;
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 c6ae6ffa1bf0..e910c7e3b266 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -369,17 +369,6 @@ Late::visit (AST::IdentifierExpr &expr)
          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)
        {

Reply via email to