From: Owen Avery <powerboat9.ga...@gmail.com>

gcc/rust/ChangeLog:

        * checks/errors/privacy/rust-privacy-reporter.cc:
        Include rust-immutable-name-resolution-context.h.
        (is_child_module): Use ForeverStack::is_module_descendant if name
        resolution 2.0 is enabled.
        * resolve/rust-forever-stack.h
        (ForeverStack::is_module_descendant): Add.
        (ForeverStack::dfs_node): Add.
        * resolve/rust-forever-stack.hxx
        (ForeverStack::dfs_rib): Use ForeverStack::dfs_node.
        (ForeverStack::dfs_node): Add.
        (ForeverStack::is_module_descendant): Add.

Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>
---
 .../errors/privacy/rust-privacy-reporter.cc   |  9 ++++
 gcc/rust/resolve/rust-forever-stack.h         | 10 +++++
 gcc/rust/resolve/rust-forever-stack.hxx       | 41 +++++++++++++++----
 3 files changed, 53 insertions(+), 7 deletions(-)

diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc 
b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
index 1ee2097b383..fa2de9c3f40 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
@@ -22,6 +22,7 @@
 #include "rust-hir-stmt.h"
 #include "rust-hir-item.h"
 #include "rust-attribute-values.h"
+#include "rust-immutable-name-resolution-context.h"
 
 namespace Rust {
 namespace Privacy {
@@ -93,6 +94,14 @@ static bool
 is_child_module (Analysis::Mappings &mappings, NodeId parent,
                 NodeId possible_child)
 {
+  if (flag_name_resolution_2_0)
+    {
+      auto &nr_ctx
+       = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+
+      return nr_ctx.values.is_module_descendant (parent, possible_child);
+    }
+
   auto children = mappings.lookup_module_children (parent);
 
   if (!children)
diff --git a/gcc/rust/resolve/rust-forever-stack.h 
b/gcc/rust/resolve/rust-forever-stack.h
index 8c5e207a70d..28509259497 100644
--- a/gcc/rust/resolve/rust-forever-stack.h
+++ b/gcc/rust/resolve/rust-forever-stack.h
@@ -521,6 +521,12 @@ public:
 
   std::string as_debug_string ();
 
+  /**
+   * Used to check if a module is a descendant of another module
+   * Intended for use in the privacy checker
+   */
+  bool is_module_descendant (NodeId parent, NodeId child) const;
+
 private:
   /**
    * A link between two Nodes in our trie data structure. This class represents
@@ -635,6 +641,10 @@ private:
   tl::optional<Rib &> dfs_rib (Node &starting_point, NodeId to_find);
   tl::optional<const Rib &> dfs_rib (const Node &starting_point,
                                     NodeId to_find) const;
+  // FIXME: Documentation
+  tl::optional<Node &> dfs_node (Node &starting_point, NodeId to_find);
+  tl::optional<const Node &> dfs_node (const Node &starting_point,
+                                      NodeId to_find) const;
 };
 
 } // namespace Resolver2_0
diff --git a/gcc/rust/resolve/rust-forever-stack.hxx 
b/gcc/rust/resolve/rust-forever-stack.hxx
index 5a5a7c73f32..31f8ba498b3 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -625,13 +625,33 @@ ForeverStack<N>::to_canonical_path (NodeId id) const
 template <Namespace N>
 tl::optional<Rib &>
 ForeverStack<N>::dfs_rib (ForeverStack<N>::Node &starting_point, NodeId 
to_find)
+{
+  return dfs_node (starting_point, to_find).map ([] (Node &x) -> Rib & {
+    return x.rib;
+  });
+}
+
+template <Namespace N>
+tl::optional<const Rib &>
+ForeverStack<N>::dfs_rib (const ForeverStack<N>::Node &starting_point,
+                         NodeId to_find) const
+{
+  return dfs_node (starting_point, to_find).map ([] (Node &x) -> Rib & {
+    return x.rib;
+  });
+}
+
+template <Namespace N>
+tl::optional<typename ForeverStack<N>::Node &>
+ForeverStack<N>::dfs_node (ForeverStack<N>::Node &starting_point,
+                          NodeId to_find)
 {
   if (starting_point.id == to_find)
-    return starting_point.rib;
+    return starting_point;
 
   for (auto &child : starting_point.children)
     {
-      auto candidate = dfs_rib (child.second, to_find);
+      auto candidate = dfs_node (child.second, to_find);
 
       if (candidate.has_value ())
        return candidate;
@@ -641,16 +661,16 @@ ForeverStack<N>::dfs_rib (ForeverStack<N>::Node 
&starting_point, NodeId to_find)
 }
 
 template <Namespace N>
-tl::optional<const Rib &>
-ForeverStack<N>::dfs_rib (const ForeverStack<N>::Node &starting_point,
-                         NodeId to_find) const
+tl::optional<const typename ForeverStack<N>::Node &>
+ForeverStack<N>::dfs_node (const ForeverStack<N>::Node &starting_point,
+                          NodeId to_find) const
 {
   if (starting_point.id == to_find)
-    return starting_point.rib;
+    return starting_point;
 
   for (auto &child : starting_point.children)
     {
-      auto candidate = dfs_rib (child.second, to_find);
+      auto candidate = dfs_node (child.second, to_find);
 
       if (candidate.has_value ())
        return candidate;
@@ -737,6 +757,13 @@ ForeverStack<N>::as_debug_string ()
   return stream.str ();
 }
 
+template <Namespace N>
+bool
+ForeverStack<N>::is_module_descendant (NodeId parent, NodeId child) const
+{
+  return dfs_node (dfs_node (root, parent).value (), child).has_value ();
+}
+
 // FIXME: Can we add selftests?
 
 } // namespace Resolver2_0
-- 
2.45.2

Reply via email to