From: Pierre-Emmanuel Patry <[email protected]>

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]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/5cddae14bae5341593ddae88679b1b92c619cedb

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4758

 gcc/rust/resolve/rust-forever-stack.hxx       | 10 ++++-----
 .../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 741a86fd8..6a1bd93dd 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 cc24439c8..d6f4a3ac1 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
-- 
2.55.0

Reply via email to