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