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;
+}

Reply via email to