From: Arthur Cohen <[email protected]>

And improve code factoring to reduce the complexity of the 
check_for_privacy_violation function.

gcc/rust/ChangeLog:

        * checks/errors/privacy/rust-privacy-reporter.cc
        (PrivacyReporter::check_for_privacy_violation): Add new overload for 
two namespaces.
        (PrivacyReporter::visit): Call it.
        (PrivacyReporter::check_violation_inner): New function.
        * checks/errors/privacy/rust-privacy-reporter.h: Declare it.
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/3c36a62710bbb3629bf7fa4f5db23cd126260c94

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4551

 .../errors/privacy/rust-privacy-reporter.cc   | 57 +++++++++++++------
 .../errors/privacy/rust-privacy-reporter.h    |  7 +++
 2 files changed, 48 insertions(+), 16 deletions(-)

diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc 
b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
index 5d3c50ae3..9e2238f79 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
@@ -17,6 +17,7 @@
 // <http://www.gnu.org/licenses/>.
 
 #include "rust-privacy-reporter.h"
+#include "rust-hir-map.h"
 #include "rust-rib.h"
 #include "rust-session-manager.h"
 #include "rust-hir-expr.h"
@@ -92,21 +93,10 @@ PrivacyReporter::go (HIR::Crate &crate)
     }
 }
 
-// FIXME: This function needs a lot of refactoring
 void
-PrivacyReporter::check_for_privacy_violation (const NodeId &use_id,
-                                             const location_t locus,
-                                             Resolver2_0::Namespace ns)
+PrivacyReporter::check_violation_inner (NodeId ref_node_id,
+                                       const location_t locus)
 {
-  NodeId ref_node_id;
-
-  // FIXME: Assert here. For now, we return since this causes issues when
-  // checking inferred types (#1260)
-  if (auto id = resolver.lookup (use_id, ns))
-    ref_node_id = *id;
-  else
-    return;
-
   auto vis = mappings.lookup_visibility (ref_node_id);
 
   // FIXME: Can we really return here if the item has no visibility?
@@ -157,6 +147,41 @@ PrivacyReporter::check_for_privacy_violation (const NodeId 
&use_id,
     }
 }
 
+void
+PrivacyReporter::check_for_privacy_violation (const NodeId &use_id,
+                                             const location_t locus,
+                                             Resolver2_0::Namespace ns)
+{
+  NodeId ref_node_id;
+
+  // FIXME: Assert here. For now, we return since this causes issues when
+  // checking inferred types (#1260)
+  if (auto id = resolver.lookup (use_id, ns))
+    ref_node_id = *id;
+  else
+    return;
+
+  check_violation_inner (ref_node_id, locus);
+}
+
+void
+PrivacyReporter::check_for_privacy_violation (const NodeId &use_id,
+                                             const location_t locus,
+                                             Resolver2_0::Namespace ns1,
+                                             Resolver2_0::Namespace ns2)
+{
+  NodeId ref_node_id;
+
+  // FIXME: Assert here. For now, we return since this causes issues when
+  // checking inferred types (#1260)
+  if (auto resolved = resolver.lookup (use_id, ns1, ns2))
+    ref_node_id = resolved->id;
+  else
+    return;
+
+  check_violation_inner (ref_node_id, locus);
+}
+
 void
 PrivacyReporter::check_base_type_privacy (Analysis::NodeMapping &node_mappings,
                                          const TyTy::BaseType *ty,
@@ -298,9 +323,9 @@ PrivacyReporter::visit (HIR::TypePath &path)
 void
 PrivacyReporter::visit (HIR::QualifiedPathInExpression &path)
 {
-  check_for_privacy_violation (
-    path.get_mappings ().get_nodeid (), path.get_locus (),
-    Resolver2_0::Namespace::Types /* FIXME: Is that correct? */);
+  check_for_privacy_violation (path.get_mappings ().get_nodeid (),
+                              path.get_locus (),
+                              Resolver2_0::Namespace::Values);
 }
 
 void
diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h 
b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
index c735aa44a..07627b1d6 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
@@ -57,10 +57,17 @@ private:
    * @param use_id NodeId of the expression/statement referencing an item with
    *           a visibility
    * @param locus Location of said expression/statement
+   * @param ns1, ns2 Namespaces in which to check for visibility
    */
   void check_for_privacy_violation (const NodeId &use_id,
                                    const location_t locus,
                                    Resolver2_0::Namespace ns);
+  void check_for_privacy_violation (const NodeId &use_id,
+                                   const location_t locus,
+                                   Resolver2_0::Namespace ns1,
+                                   Resolver2_0::Namespace ns2);
+
+  void check_violation_inner (NodeId ref_node_id, const location_t inner);
 
   /**
    * Internal function used by `check_type_privacy` when dealing with complex
-- 
2.54.0

Reply via email to