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
