https://gcc.gnu.org/g:2d7aeae0fd0aeb54dfeb7ad59d58d19f346223e1
commit r17-1868-g2d7aeae0fd0aeb54dfeb7ad59d58d19f346223e1 Author: Arthur Cohen <[email protected]> Date: Tue Mar 24 14:34:15 2026 +0100 gccrs: nr: Properly resolve imports and modules in segments gcc/rust/ChangeLog: * resolve/rust-early-name-resolver-2.0.cc (Early::finalize_rebind_import): Insert imports as possible glob containers. * resolve/rust-name-resolution-context.cc (NameResolutionContext::map_usage): Allow multiple mappings of the same usage. * resolve/rust-name-resolution-context.hxx: Properly handle imports and modules in segments. gcc/testsuite/ChangeLog: * rust/compile/import_in_type_ns6.rs: New test. * rust/compile/import_in_type_ns7.rs: New test. Diff: --- gcc/rust/resolve/rust-early-name-resolver-2.0.cc | 11 +++++++++++ gcc/rust/resolve/rust-name-resolution-context.cc | 2 +- gcc/rust/resolve/rust-name-resolution-context.hxx | 10 +++++++--- gcc/testsuite/rust/compile/import_in_type_ns6.rs | 17 +++++++++++++++++ gcc/testsuite/rust/compile/import_in_type_ns7.rs | 22 ++++++++++++++++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) 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 4616323e6a8c..2109ab263e79 100644 --- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc @@ -534,6 +534,17 @@ Early::finalize_rebind_import (const Early::ImportPair &mapping) toplevel .insert_or_error_out (declared_name, path.get_locus (), import_id, definition.second /* TODO: This isn't clear - it would be better if it was called .ns or something */); + + // Map the import to the glob container if it exists - this is important + // for 2-stepped glob imports which refer to glob containers, e.g. + // + // enum Foo { ... } + // pub use Foo; + // use self::Foo::*; + auto &mappings = Analysis::Mappings::get (); + if (auto container + = mappings.lookup_glob_container (definition.first.get_node_id ())) + mappings.insert_glob_container (import_id, container.value ()); } } diff --git a/gcc/rust/resolve/rust-name-resolution-context.cc b/gcc/rust/resolve/rust-name-resolution-context.cc index efe746fe9d34..70c74323eaee 100644 --- a/gcc/rust/resolve/rust-name-resolution-context.cc +++ b/gcc/rust/resolve/rust-name-resolution-context.cc @@ -259,7 +259,7 @@ NameResolutionContext::map_usage (Usage usage, Definition definition) auto inserted = resolved_nodes.emplace (usage, definition).second; // is that valid? - rust_assert (inserted); + // rust_assert (inserted); } tl::optional<NodeId> diff --git a/gcc/rust/resolve/rust-name-resolution-context.hxx b/gcc/rust/resolve/rust-name-resolution-context.hxx index 28c7dcccfb7c..1492125e5c58 100644 --- a/gcc/rust/resolve/rust-name-resolution-context.hxx +++ b/gcc/rust/resolve/rust-name-resolution-context.hxx @@ -349,9 +349,12 @@ NameResolutionContext::resolve_segments ( .lookup_glob_container (rib_lookup->get_node_id ()) .has_value ()) { - child - = stack.dfs_node (stack.root, rib_lookup->get_node_id ()) - .value (); + auto leaf_module + = find_leaf_definition (rib_lookup->get_node_id ()) + .value () + .id; + + child = stack.dfs_node (stack.root, leaf_module).value (); break; } else @@ -359,6 +362,7 @@ NameResolutionContext::resolve_segments ( insert_segment_resolution (Usage (seg.node_id), Definition ( rib_lookup->get_node_id ())); + return tl::nullopt; } } diff --git a/gcc/testsuite/rust/compile/import_in_type_ns6.rs b/gcc/testsuite/rust/compile/import_in_type_ns6.rs new file mode 100644 index 000000000000..6f5c312c85d0 --- /dev/null +++ b/gcc/testsuite/rust/compile/import_in_type_ns6.rs @@ -0,0 +1,17 @@ +#![feature(no_core)] +#![no_core] + +mod inner { + mod intrinsics { + pub fn unchecked_shl() {} + pub fn unchecked_snl() {} + pub fn unchecked_adult_swim() {} + } +} + +use inner::intrinsics::{self, unchecked_snl}; + +fn foo() /* { dg-warning "never used" } */ +{ + use intrinsics::{unchecked_adult_swim, unchecked_shl}; +} diff --git a/gcc/testsuite/rust/compile/import_in_type_ns7.rs b/gcc/testsuite/rust/compile/import_in_type_ns7.rs new file mode 100644 index 000000000000..3c5aabb0ee12 --- /dev/null +++ b/gcc/testsuite/rust/compile/import_in_type_ns7.rs @@ -0,0 +1,22 @@ +#![feature(no_core)] +#![no_core] + +mod inner { + pub mod error { + pub enum IntErrorKind { + A, + B, + C, + } + } +} + +pub use inner::error::IntErrorKind; + +fn foo() /* { dg-warning "never used" } */ +{ + use self::IntErrorKind::*; + + let _ = A; + let _ = IntErrorKind::B; +}
