https://gcc.gnu.org/g:ad5edb94ca8f880b4461b3416d4e0cb77aea2f03

commit r17-5700-gad5edb94ca8f880b4461b3416d4e0cb77aea2f03
Author: Pierre-Emmanuel Patry <[email protected]>
Date:   Fri Oct 23 12:12:03 2026 +0200

    gccrs: Remove map and add extern crate to glob containers
    
    Map was unecessary and we should insert the extern crates within glob
    container list in order to resolve it's inner segments.
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-forever-stack.hxx: Remove useless map.
            * resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit): Add
            extern crate to glob containers.
    
    Signed-off-by: Pierre-Emmanuel Patry <[email protected]>

Diff:
---
 gcc/rust/resolve/rust-forever-stack.hxx             | 10 ++++------
 gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc | 21 +++++++++++++++++----
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/gcc/rust/resolve/rust-forever-stack.hxx 
b/gcc/rust/resolve/rust-forever-stack.hxx
index 741a86fd83fc..6a1bd93dde6e 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -205,14 +205,12 @@ ForeverStack<Namespace::Values>::insert_variant 
(Identifier name, NodeId node)
 
 template <Namespace N>
 void
-ForeverStack<N>::insert_crate_in_prelude (Identifier crate_name, NodeId id)
+ForeverStack<N>::insert_crate_in_prelude (Identifier crate_name,
+                                         NodeId extern_crate_node_id)
 {
   auto &extern_prelude_rib = extern_prelude.rib (N);
-  auto inner = insert_inner (extern_prelude_rib, crate_name,
-                            Rib::Definition::NonShadowable (id));
-
-  if (inner)
-    map_usage (Usage (inner.value ()), Definition (id));
+  auto definition = Rib::Definition::NonShadowable (extern_crate_node_id);
+  insert_inner (extern_prelude_rib, crate_name, definition);
 }
 
 template <Namespace N>
diff --git a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc 
b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
index cc24439c8779..d6f4a3ac183f 100644
--- a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
@@ -142,14 +142,27 @@ TopLevel::visit (AST::ExternCrate &crate)
 {
   auto &name = crate.has_as_clause () ? crate.get_as_clause ()
                                      : crate.get_referenced_crate ();
-  Analysis::Mappings::get ().insert_extern_crate_id (crate.get_node_id ());
+  auto &mappings = Analysis::Mappings::get ();
+  mappings.insert_extern_crate_id (crate.get_node_id ());
   insert_or_error_out (name, crate, Namespace::Types);
 
   DefaultResolver::visit (crate);
 
-  // Insert the crate within the extern prelude only after the scope has been
-  // created
-  ctx.insert_crate_in_prelude (name, crate.get_node_id ());
+  if (crate.get_referenced_crate () != Values::Keywords::SELF)
+    {
+      if (auto extern_crate_num
+         = mappings.crate.lookup_crate_name (crate.get_referenced_crate ()))
+       {
+         auto &extern_crate
+           = mappings.crate.get_ast_crate (extern_crate_num.value ());
+         if (!mappings.lookup_glob_container (extern_crate.get_node_id ()))
+           mappings.insert_glob_container (extern_crate.get_node_id (),
+                                           &extern_crate);
+         // Insert the crate within the extern prelude only after the scope has
+         // been created
+         ctx.insert_crate_in_prelude (name, extern_crate.get_node_id ());
+       }
+    }
 }
 
 void

Reply via email to