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