https://gcc.gnu.org/g:30e3760e63f10bc511e0976247d44487e514d3ce
commit r16-6837-g30e3760e63f10bc511e0976247d44487e514d3ce Author: Arthur Cohen <[email protected]> Date: Fri Sep 12 16:11:15 2025 +0200 gccrs: nr: Do prelude resolution for Identifiers gcc/rust/ChangeLog: * resolve/rust-forever-stack.h: New function. * resolve/rust-forever-stack.hxx: Implement it. * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Call it if the prelude exists and we have an unresolved Identifier Call it if the prelude exists and we have an unresolved Identifier. Diff: --- gcc/rust/resolve/rust-forever-stack.h | 2 ++ gcc/rust/resolve/rust-forever-stack.hxx | 11 +++++++++++ gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 12 +++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/gcc/rust/resolve/rust-forever-stack.h b/gcc/rust/resolve/rust-forever-stack.h index 2a88df7b9e0b..cca98b55c2a9 100644 --- a/gcc/rust/resolve/rust-forever-stack.h +++ b/gcc/rust/resolve/rust-forever-stack.h @@ -668,6 +668,8 @@ public: tl::optional<Rib::Definition> get (const Identifier &name); tl::optional<Rib::Definition> get_lang_prelude (const Identifier &name); tl::optional<Rib::Definition> get_lang_prelude (const std::string &name); + tl::optional<Rib::Definition> get_from_prelude (NodeId prelude, + const Identifier &name); /** * Resolve a path to its definition in the current `ForeverStack` diff --git a/gcc/rust/resolve/rust-forever-stack.hxx b/gcc/rust/resolve/rust-forever-stack.hxx index bd35d6c4e4a7..1093646eb4f8 100644 --- a/gcc/rust/resolve/rust-forever-stack.hxx +++ b/gcc/rust/resolve/rust-forever-stack.hxx @@ -343,6 +343,17 @@ ForeverStack<N>::get_lang_prelude (const std::string &name) return lang_prelude.rib.get (name); } +template <Namespace N> +tl::optional<Rib::Definition> +ForeverStack<N>::get_from_prelude (NodeId prelude, const Identifier &name) +{ + auto starting_point = dfs_node (root, prelude); + if (!starting_point) + return tl::nullopt; + + return get (*starting_point, name); +} + template <> tl::optional<Rib::Definition> inline ForeverStack<Namespace::Labels>::get ( const Identifier &name) 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 0da8c38b63e0..9a7c2f8a0b66 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc @@ -346,7 +346,17 @@ Late::visit (AST::IdentifierExpr &expr) { resolved = type; } - else + else if (!resolved && ctx.prelude) + { + resolved + = ctx.values.get_from_prelude (*ctx.prelude, expr.get_ident ()); + + if (!resolved) + resolved + = ctx.types.get_from_prelude (*ctx.prelude, expr.get_ident ()); + } + + if (!resolved) { rust_error_at (expr.get_locus (), ErrorCode::E0425, "cannot find value %qs in this scope",
