Skip to content

Commit 88a2da9

Browse files
committed
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.
1 parent aa7435e commit 88a2da9

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

gcc/rust/resolve/rust-forever-stack.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,8 @@ template <Namespace N> class ForeverStack
668668
tl::optional<Rib::Definition> get (const Identifier &name);
669669
tl::optional<Rib::Definition> get_lang_prelude (const Identifier &name);
670670
tl::optional<Rib::Definition> get_lang_prelude (const std::string &name);
671+
tl::optional<Rib::Definition> get_from_prelude (NodeId prelude,
672+
const Identifier &name);
671673

672674
/**
673675
* Resolve a path to its definition in the current `ForeverStack`

gcc/rust/resolve/rust-forever-stack.hxx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,17 @@ ForeverStack<N>::get_lang_prelude (const std::string &name)
343343
return lang_prelude.rib.get (name);
344344
}
345345

346+
template <Namespace N>
347+
tl::optional<Rib::Definition>
348+
ForeverStack<N>::get_from_prelude (NodeId prelude, const Identifier &name)
349+
{
350+
auto starting_point = dfs_node (root, prelude);
351+
if (!starting_point)
352+
return tl::nullopt;
353+
354+
return get (*starting_point, name);
355+
}
356+
346357
template <>
347358
tl::optional<Rib::Definition> inline ForeverStack<Namespace::Labels>::get (
348359
const Identifier &name)

gcc/rust/resolve/rust-late-name-resolver-2.0.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,17 @@ Late::visit (AST::IdentifierExpr &expr)
348348
{
349349
resolved = type;
350350
}
351-
else
351+
else if (!resolved && ctx.prelude)
352+
{
353+
resolved
354+
= ctx.values.get_from_prelude (*ctx.prelude, expr.get_ident ());
355+
356+
if (!resolved)
357+
resolved
358+
= ctx.types.get_from_prelude (*ctx.prelude, expr.get_ident ());
359+
}
360+
361+
if (!resolved)
352362
{
353363
rust_error_at (expr.get_locus (), ErrorCode::E0425,
354364
"cannot find value %qs in this scope",

0 commit comments

Comments
 (0)