]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: privacy: Check for pub(crate) when resolving visibility path.
authorArthur Cohen <arthur.cohen@embecosm.com>
Tue, 28 Mar 2023 12:22:21 +0000 (14:22 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:28:39 +0000 (18:28 +0100)
This causes the function to return true and the checks to pass, but it
requires more thinking - how do we deal with pub(crate) in the current system?
Should we simply treat it as a pub item in the current crate, but export it as
a private item in the metadata?

gcc/rust/ChangeLog:

* ast/rust-item.h: Fix `Visibility::has_path()` implementation.
* checks/errors/privacy/rust-visibility-resolver.cc
(VisibilityResolver::resolve_module_path): Check if we are dealing with pub(crate) properly.

gcc/testsuite/ChangeLog:

* rust/compile/privacy8.rs: New test.

gcc/rust/ast/rust-item.h
gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
gcc/testsuite/rust/compile/privacy8.rs [new file with mode: 0644]

index 883b010ccb65e357a0dd323c523e2c873ad68278..7f177e54dbdbf0173ad2ffd5d1749cb91880c3d5 100644 (file)
@@ -642,7 +642,7 @@ public:
   }
 
   // Returns whether a visibility has a path
-  bool has_path () const { return !(is_error ()) && vis_type == PUB_IN_PATH; }
+  bool has_path () const { return !is_error () && vis_type >= PUB_CRATE; }
 
   // Returns whether visibility is public or not.
   bool is_public () const { return vis_type != PRIV && !is_error (); }
index e970375d2dbc8387490cdfbb2f4ef31e751b2d80..49524222c8658eda2a3eec0973976b72c461b7b5 100644 (file)
@@ -74,6 +74,16 @@ VisibilityResolver::resolve_module_path (const HIR::SimplePath &restriction,
   HirId ref;
   rust_assert (mappings.lookup_node_to_hir (ref_node_id, &ref));
 
+  auto crate = mappings.get_ast_crate (mappings.get_current_crate ());
+
+  // we may be dealing with pub(crate)
+  if (ref_node_id == crate.get_node_id ())
+    // FIXME: What do we do here? There isn't a DefId for the Crate, so can we
+    // actually do anything?
+    // We basically want to return true always but just when exporting export
+    // these items as private?
+    return true;
+
   auto module = mappings.lookup_module (ref);
   if (!module)
     {
diff --git a/gcc/testsuite/rust/compile/privacy8.rs b/gcc/testsuite/rust/compile/privacy8.rs
new file mode 100644 (file)
index 0000000..6cf8f5b
--- /dev/null
@@ -0,0 +1 @@
+pub(crate) struct Foo; // { dg-warning "struct is never constructed" }