From abdac0332a5593f1ea15f0dd9280efb76c65d83b Mon Sep 17 00:00:00 2001 From: Owen Avery Date: Thu, 29 May 2025 17:04:46 -0400 Subject: [PATCH] gccrs: nr2.0: Adjust resolution of modules This prioritizes resolution in the language prelude over resolution as a module. gcc/rust/ChangeLog: * resolve/rust-forever-stack.hxx (ForeverStack::resolve_path): Resolve final segments which point to modules. * resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit): Avoid inserting module names into ribs in the type namespace. gcc/testsuite/ChangeLog: * rust/compile/nr2/exclude: Remove issue-3315-2.rs. Signed-off-by: Owen Avery --- gcc/rust/resolve/rust-forever-stack.hxx | 42 ++++++++++++++++++- .../rust-toplevel-name-resolver-2.0.cc | 2 - gcc/testsuite/rust/compile/nr2/exclude | 1 - 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/gcc/rust/resolve/rust-forever-stack.hxx b/gcc/rust/resolve/rust-forever-stack.hxx index 582e53b1602..1ed87b3d55b 100644 --- a/gcc/rust/resolve/rust-forever-stack.hxx +++ b/gcc/rust/resolve/rust-forever-stack.hxx @@ -687,7 +687,7 @@ ForeverStack::resolve_path ( if (!res) res = get_lang_prelude (seg.as_string ()); - if (!res && N == Namespace::Types) + if (N == Namespace::Types && !res) { if (seg.is_crate_path_seg ()) { @@ -719,6 +719,26 @@ ForeverStack::resolve_path ( // TODO: does NonShadowable matter? return Rib::Definition::NonShadowable (id); } + else + { + // HACK: check for a module after we check the language prelude + for (auto &kv : + find_closest_module (starting_point.get ()).children) + { + auto &link = kv.first; + + if (link.path.map_or ( + [&seg] (Identifier path) { + auto &path_str = path.as_string (); + return path_str == seg.as_string (); + }, + false)) + { + insert_segment_resolution (outer_seg, kv.second.id); + return Rib::Definition::NonShadowable (kv.second.id); + } + } + } } if (res && !res->is_ambiguous ()) @@ -751,6 +771,26 @@ ForeverStack::resolve_path ( if (!res) res = get_lang_prelude (seg_name); + if (N == Namespace::Types && !res) + { + // HACK: check for a module after we check the language prelude + for (auto &kv : final_node.children) + { + auto &link = kv.first; + + if (link.path.map_or ( + [&seg_name] (Identifier path) { + auto &path_str = path.as_string (); + return path_str == seg_name; + }, + false)) + { + insert_segment_resolution (segments.back (), kv.second.id); + return Rib::Definition::NonShadowable (kv.second.id); + } + } + } + if (res && !res->is_ambiguous ()) insert_segment_resolution (segments.back (), res->get_node_id ()); 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 8ec31c0351f..a7b442d5b44 100644 --- a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc @@ -101,8 +101,6 @@ TopLevel::go (AST::Crate &crate) void TopLevel::visit (AST::Module &module) { - insert_or_error_out (module.get_name (), module, Namespace::Types); - // Parse the module's items if they haven't been expanded and the file // should be parsed (i.e isn't hidden behind an untrue or impossible cfg // directive diff --git a/gcc/testsuite/rust/compile/nr2/exclude b/gcc/testsuite/rust/compile/nr2/exclude index 43d7a0dc911..b8eaa81dbf7 100644 --- a/gcc/testsuite/rust/compile/nr2/exclude +++ b/gcc/testsuite/rust/compile/nr2/exclude @@ -1,2 +1 @@ -issue-3315-2.rs # please don't delete the trailing newline -- 2.47.2