https://gcc.gnu.org/g:15a8fbd52b0c1c742b353e90de01b4fe6c76946a

commit r17-1897-g15a8fbd52b0c1c742b353e90de01b4fe6c76946a
Author: Yap Zhi Heng <[email protected]>
Date:   Sat Jun 6 10:56:19 2026 +0800

    gccrs: Search lang_prelude when reaching module boundary during name 
resolution
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-name-resolution-context.h (NameResolutionContext): 
Add new function
            definition for `should_search_prelude`.
            * resolve/rust-name-resolution-context.hxx 
(NameResolutionContext::should_search_prelude):
            Add implementation.
            (NameResolutionContext::resolve_segments): Update the check to 
trigger lang_prelude search
            during name resolution in modules.
    
    Signed-off-by: Yap Zhi Heng <[email protected]>

Diff:
---
 gcc/rust/resolve/rust-name-resolution-context.h   |  6 ++++++
 gcc/rust/resolve/rust-name-resolution-context.hxx | 23 ++++++++++++++++++++++-
 gcc/testsuite/rust/compile/name_resolution28.rs   | 11 +++++++++++
 3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/gcc/rust/resolve/rust-name-resolution-context.h 
b/gcc/rust/resolve/rust-name-resolution-context.h
index 6cbcfbb7655e..3bda8178a835 100644
--- a/gcc/rust/resolve/rust-name-resolution-context.h
+++ b/gcc/rust/resolve/rust-name-resolution-context.h
@@ -872,6 +872,12 @@ public:
   tl::optional<NodeId> prelude;
 
 private:
+  template <Namespace N>
+  bool
+  should_search_prelude (const typename ForeverStack<N>::Node *current_node,
+                        const typename ForeverStack<N>::SegIterator &iterator,
+                        const std::vector<ResolutionPath::Segment> &segments);
+
   /**
    * Resolve a path to its definition
    *
diff --git a/gcc/rust/resolve/rust-name-resolution-context.hxx 
b/gcc/rust/resolve/rust-name-resolution-context.hxx
index 359dd9c65e5b..7a8f24ac5150 100644
--- a/gcc/rust/resolve/rust-name-resolution-context.hxx
+++ b/gcc/rust/resolve/rust-name-resolution-context.hxx
@@ -28,6 +28,26 @@
 namespace Rust {
 namespace Resolver2_0 {
 
+template <Namespace N>
+bool
+NameResolutionContext::should_search_prelude (
+  const typename ForeverStack<N>::Node *current_node,
+  const typename ForeverStack<N>::SegIterator &iterator,
+  const std::vector<ResolutionPath::Segment> &segments)
+{
+  // Check whether the current_node is a root node
+  if (current_node->is_root ())
+    return true;
+
+  // Check whether we're at the start of a module (we can't travel elsewhere
+  // from the start of a module)
+  if (is_start (iterator, segments)
+      && current_node->rib.kind == Rib::Kind::Module)
+    return true;
+
+  return false;
+}
+
 template <Namespace N>
 tl::optional<Rib::Definition>
 NameResolutionContext::resolve_path (
@@ -383,7 +403,8 @@ NameResolutionContext::resolve_segments (
                }
            }
 
-         if (current_node->is_root () && !searched_prelude)
+         if (!searched_prelude
+             && should_search_prelude<N> (current_node, iterator, segments))
            {
              searched_prelude = true;
              current_node = &stack.lang_prelude;
diff --git a/gcc/testsuite/rust/compile/name_resolution28.rs 
b/gcc/testsuite/rust/compile/name_resolution28.rs
new file mode 100644
index 000000000000..d2400aed4bd0
--- /dev/null
+++ b/gcc/testsuite/rust/compile/name_resolution28.rs
@@ -0,0 +1,11 @@
+#![feature(no_core, lang_items)]
+#![no_core]
+
+pub mod lateresolve {
+    #![lang = "f32"]
+    impl f32 {
+        pub const RADIX: u32 = 2;
+    }
+
+    pub const _: u32 = f32::RADIX;
+}

Reply via email to