https://gcc.gnu.org/g:7c0801466908df2fd6f7aa6b60488c8902c8c982
commit r17-3124-g7c0801466908df2fd6f7aa6b60488c8902c8c982 Author: Owen Avery <[email protected]> Date: Wed Jul 29 08:30:08 2026 -0400 gccrs: Generalize prelude import handling Replace some ad-hoc handling of prelude imports with a glob import in every module/crate. gcc/rust/ChangeLog: * resolve/rust-default-resolver.cc (DefaultResolver::visit (Crate)): Call maybe_prelude_import. (DefaultResolver::visit (Module)): Likewise. * resolve/rust-default-resolver.h (DefaultResolver::maybe_prelude_import): New virtual member function. * resolve/rust-early-name-resolver-2.0.cc (Early::maybe_prelude_import): New member function definition. (Early::finalize_glob_import): Mark visitor as dirty when first setting ctx.prelude. * resolve/rust-early-name-resolver-2.0.h (Early::maybe_prelude_import): New member function declaration. * resolve/rust-late-name-resolver-2.0.cc (Late::visit (IdentifierExpr)): Remove ad-hoc prelude import handling. Signed-off-by: Owen Avery <[email protected]> Diff: --- gcc/rust/resolve/rust-default-resolver.cc | 11 ++++++++--- gcc/rust/resolve/rust-default-resolver.h | 1 + gcc/rust/resolve/rust-early-name-resolver-2.0.cc | 20 ++++++++++++++++++++ gcc/rust/resolve/rust-early-name-resolver-2.0.h | 1 + gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 11 ----------- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/gcc/rust/resolve/rust-default-resolver.cc b/gcc/rust/resolve/rust-default-resolver.cc index 9b23ab38bc23..7a54c6ee1343 100644 --- a/gcc/rust/resolve/rust-default-resolver.cc +++ b/gcc/rust/resolve/rust-default-resolver.cc @@ -36,7 +36,10 @@ DefaultResolver::visit (AST::Crate &crate) if (!visited_crates.insert (crate.get_node_id ()).second) return; - auto inner_fn = [this, &crate] () { AST::DefaultASTVisitor::visit (crate); }; + auto inner_fn = [this, &crate] () { + maybe_prelude_import (); + AST::DefaultASTVisitor::visit (crate); + }; auto &mappings = Analysis::Mappings::get (); @@ -62,8 +65,10 @@ DefaultResolver::visit (AST::BlockExpr &expr) void DefaultResolver::visit (AST::Module &module) { - auto item_fn_1 - = [this, &module] () { AST::DefaultASTVisitor::visit (module); }; + auto item_fn_1 = [this, &module] () { + maybe_prelude_import (); + AST::DefaultASTVisitor::visit (module); + }; auto item_fn_2 = [this, &module, &item_fn_1] () { ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (), diff --git a/gcc/rust/resolve/rust-default-resolver.h b/gcc/rust/resolve/rust-default-resolver.h index 2d53ff3a73bb..bd2bab9f8ca8 100644 --- a/gcc/rust/resolve/rust-default-resolver.h +++ b/gcc/rust/resolve/rust-default-resolver.h @@ -45,6 +45,7 @@ public: // these nodes create new scopes and ribs - they are often used to declare new // variables, such as a for loop's iterator, or a function's arguments void visit (AST::BlockExpr &) override; + virtual void maybe_prelude_import () {} void visit (AST::Module &) override; void visit (AST::Function &) override; void visit (AST::LoopExpr &expr) override; 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 12f29ceed7c2..56f91db89dcd 100644 --- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc @@ -313,6 +313,22 @@ Early::visit (AST::Module &module) textual_scope.pop (); } +void +Early::maybe_prelude_import () +{ + // handle prelude import + if (ctx.prelude) + { + auto container = Analysis::Mappings::get ().lookup_glob_container ( + ctx.prelude.value ()); + rust_assert (container); + + GlobbingVisitor glob_visit (ctx); + glob_visit.go (container.value ()); + dirty |= glob_visit.is_dirty (); + } +} + void Early::visit (AST::MacroInvocation &invoc) { @@ -489,6 +505,10 @@ Early::finalize_glob_import (NameResolutionContext &ctx, rust_assert (container.value ()->get_glob_container_kind () == AST::GlobContainer::Kind::Module); + // TODO: catch multiple attempted prelude imports + if (!ctx.prelude) + dirty = true; + ctx.prelude = mapping.data.container ().get_node_id (); } diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.h b/gcc/rust/resolve/rust-early-name-resolver-2.0.h index 7ea9e9f2ccc4..f2297d58eb8e 100644 --- a/gcc/rust/resolve/rust-early-name-resolver-2.0.h +++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.h @@ -59,6 +59,7 @@ public: // as well as lexical scopes void visit (AST::BlockExpr &) override; + void maybe_prelude_import () override; void visit (AST::Module &) override; void visit (AST::MacroInvocation &) override; diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc index c6ae6ffa1bf0..e910c7e3b266 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc @@ -369,17 +369,6 @@ Late::visit (AST::IdentifierExpr &expr) resolved = type; ns = Namespace::Types; } - else if (!resolved && ctx.prelude) - { - resolved - = ctx.values.get_from_prelude (*ctx.prelude, expr.get_ident ()); - ns = Namespace::Values; - - if (!resolved) - resolved - = ctx.types.get_from_prelude (*ctx.prelude, expr.get_ident ()); - ns = Namespace::Types; - } if (!resolved) {
