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.
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`
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)
{
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",