[gcc r16-6836] gccrs: forever-stack: Add extra path resolution from a known NodeId.
Arthur Cohen
cohenarthur@gcc.gnu.org
Fri Jan 16 16:30:03 GMT 2026
https://gcc.gnu.org/g:c9593a06449f5030dab77a752cf8338693532519
commit r16-6836-gc9593a06449f5030dab77a752cf8338693532519
Author: Arthur Cohen <arthur.cohen@embecosm.com>
Date: Wed Sep 10 09:39:18 2025 +0200
gccrs: forever-stack: Add extra path resolution from a known NodeId.
gcc/rust/ChangeLog:
* resolve/rust-forever-stack.h: Add new resolve_path function.
* resolve/rust-forever-stack.hxx: Implement it.
Diff:
---
gcc/rust/resolve/rust-forever-stack.h | 18 ++++++++++++++++-
gcc/rust/resolve/rust-forever-stack.hxx | 35 ++++++++++++++++++++++++++++++++-
2 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/gcc/rust/resolve/rust-forever-stack.h b/gcc/rust/resolve/rust-forever-stack.h
index fb265582ad17..2a88df7b9e0b 100644
--- a/gcc/rust/resolve/rust-forever-stack.h
+++ b/gcc/rust/resolve/rust-forever-stack.h
@@ -682,6 +682,11 @@ public:
const std::vector<S> &segments, ResolutionMode mode,
std::function<void (const S &, NodeId)> insert_segment_resolution,
std::vector<Error> &collect_errors);
+ template <typename S>
+ tl::optional<Rib::Definition> resolve_path (
+ const std::vector<S> &segments, ResolutionMode mode,
+ std::function<void (const S &, NodeId)> insert_segment_resolution,
+ std::vector<Error> &collect_errors, NodeId starting_point_id);
// FIXME: Documentation
tl::optional<Rib &> to_rib (NodeId rib_id);
@@ -743,9 +748,19 @@ private:
tl::optional<Node &> parent; // `None` only if the node is a root
};
- // private overload which allows specifying a starting point
+ /**
+ * Private overloads which allow specifying a starting point
+ */
+
tl::optional<Rib::Definition> get (Node &start, const Identifier &name);
+ template <typename S>
+ tl::optional<Rib::Definition> resolve_path (
+ const std::vector<S> &segments, ResolutionMode mode,
+ std::function<void (const S &, NodeId)> insert_segment_resolution,
+ std::vector<Error> &collect_errors,
+ std::reference_wrapper<Node> starting_point);
+
/* Should we keep going upon seeing a Rib? */
enum class KeepGoing
{
@@ -777,6 +792,7 @@ private:
* resolution
*/
Node lang_prelude;
+
/*
* The extern prelude, used for resolving external crates
*/
diff --git a/gcc/rust/resolve/rust-forever-stack.hxx b/gcc/rust/resolve/rust-forever-stack.hxx
index cd13af0158df..bd35d6c4e4a7 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -647,6 +647,25 @@ ForeverStack<N>::resolve_final_segment (Node &final_node, std::string &seg_name,
return final_node.rib.get (seg_name);
}
+template <Namespace N>
+template <typename S>
+tl::optional<Rib::Definition>
+ForeverStack<N>::resolve_path (
+ const std::vector<S> &segments, ResolutionMode mode,
+ std::function<void (const S &, NodeId)> insert_segment_resolution,
+ std::vector<Error> &collect_errors, NodeId starting_point_id)
+{
+ auto starting_point = dfs_node (root, starting_point_id);
+
+ // We may have a prelude, but haven't visited it yet and thus it's not in our
+ // nodes
+ if (!starting_point)
+ return tl::nullopt;
+
+ return resolve_path (segments, mode, insert_segment_resolution,
+ collect_errors, *starting_point);
+}
+
template <Namespace N>
template <typename S>
tl::optional<Rib::Definition>
@@ -654,10 +673,24 @@ ForeverStack<N>::resolve_path (
const std::vector<S> &segments, ResolutionMode mode,
std::function<void (const S &, NodeId)> insert_segment_resolution,
std::vector<Error> &collect_errors)
+{
+ std::reference_wrapper<Node> starting_point = cursor ();
+
+ return resolve_path (segments, mode, insert_segment_resolution,
+ collect_errors, starting_point);
+}
+
+template <Namespace N>
+template <typename S>
+tl::optional<Rib::Definition>
+ForeverStack<N>::resolve_path (
+ const std::vector<S> &segments, ResolutionMode mode,
+ std::function<void (const S &, NodeId)> insert_segment_resolution,
+ std::vector<Error> &collect_errors,
+ std::reference_wrapper<Node> starting_point)
{
rust_assert (!segments.empty ());
- std::reference_wrapper<Node> starting_point = cursor ();
switch (mode)
{
case ResolutionMode::Normal:
More information about the Gcc-cvs
mailing list