When switching g++ to the default Solaris 11.4 compilation environment,
XPG7 + extensions, the rust frontend fails to compile:

<sys/mman.h> defines

#define PRIVATE         0x20

for the benefit of the Solaris-specific memcntl(2).  This was previously
hidden since g++ defined _XOPEN_SOURCE=600.

However, the issue has always been present for C:

#include <sys/mman.h>

enum vis
{
  PRIVATE
};

mp.c:5:3: error: expected identifier before numeric constant
    5 |   PRIVATE
      |   ^~~~~~~

While I'm the first to admit that such a generic identifier is highly
unfortunate, this is also true for the Rust front end.  The interface
goes all the way back to Solaris 1.0/SunOS 4, thus isn't going to
change.

Fixed by renaming PRIVATE to HIR_VIS_PRIVATE.  Same for the rest of enum
VisType.

Bootstrapped without regressions on amd64-pc-solaris2.11.

Ok for trunk?

        Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


2026-05-17  Rainer Orth  <[email protected]>

        gcc/rust:
        * hir/tree/rust-hir-visibility.h (enum VisType): Rename PRIVATE
        etc. to HIR_VIS_PRIVATE.
        * backend/rust-compile-base.cc, backend/rust-compile-implitem.cc:
        *checks/errors/privacy/rust-visibility-resolver.cc,
        hir/rust-ast-lower.cc, hir/tree/rust-hir-visibility.h,
        hir/tree/rust-hir.cc, metadata/rust-export-metadata.cc,
        util/rust-hir-map.cc: Adapt users.

# HG changeset patch
# Parent  a266e9811317ff598c969693d4fde55ae63e231b
rust: Avoid generic PRIVATE etc. identifiers to fix Solaris build

diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -62,7 +62,7 @@ HIRCompileBase::setup_fndecl (tree fndec
 {
   // if its the main fn or pub visibility mark its as DECL_PUBLIC
   // please see https://github.com/Rust-GCC/gccrs/pull/137
-  bool is_pub = visibility.get_vis_type () == HIR::Visibility::VisType::PUBLIC;
+  bool is_pub = visibility.get_vis_type () == HIR::Visibility::VisType::HIR_VIS_PUBLIC;
   if (is_main_entry_point || (is_pub && !is_generic_fn))
     {
       TREE_PUBLIC (fndecl) = 1;
diff --git a/gcc/rust/backend/rust-compile-implitem.cc b/gcc/rust/backend/rust-compile-implitem.cc
--- a/gcc/rust/backend/rust-compile-implitem.cc
+++ b/gcc/rust/backend/rust-compile-implitem.cc
@@ -96,7 +96,7 @@ CompileTraitItem::visit (HIR::TraitItemF
     = nr_ctx.to_canonical_path (func.get_mappings ().get_nodeid ());
 
   // FIXME: How do we get the proper visibility here?
-  auto vis = HIR::Visibility (HIR::Visibility::VisType::PUBLIC);
+  auto vis = HIR::Visibility (HIR::Visibility::VisType::HIR_VIS_PUBLIC);
   HIR::TraitFunctionDecl &function = func.get_decl ();
   tree fndecl
     = compile_function (false, function.get_function_name ().as_string (),
diff --git a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
--- a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
+++ b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
@@ -108,13 +108,13 @@ VisibilityResolver::resolve_visibility (
 {
   switch (visibility.get_vis_type ())
     {
-    case HIR::Visibility::PRIVATE:
+    case HIR::Visibility::HIR_VIS_PRIVATE:
       to_resolve = ModuleVisibility::create_restricted (current_module);
       return true;
-    case HIR::Visibility::PUBLIC:
+    case HIR::Visibility::HIR_VIS_PUBLIC:
       to_resolve = ModuleVisibility::create_public ();
       return true;
-    case HIR::Visibility::RESTRICTED:
+    case HIR::Visibility::HIR_VIS_RESTRICTED:
       {
 	// FIXME: We also need to handle 2015 vs 2018 edition conflicts
 	auto id = UNKNOWN_DEFID;
diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -42,14 +42,14 @@ translate_visibility (const AST::Visibil
   switch (vis.get_vis_type ())
     {
     case AST::Visibility::PUB:
-      return Visibility (Visibility::VisType::PUBLIC);
+      return Visibility (Visibility::VisType::HIR_VIS_PUBLIC);
     case AST::Visibility::PRIV:
     case AST::Visibility::PUB_SELF:
-      return Visibility (Visibility::VisType::PRIVATE);
+      return Visibility (Visibility::VisType::HIR_VIS_PRIVATE);
     case AST::Visibility::PUB_CRATE:
     case AST::Visibility::PUB_SUPER:
     case AST::Visibility::PUB_IN_PATH:
-      return Visibility (Visibility::VisType::RESTRICTED,
+      return Visibility (Visibility::VisType::HIR_VIS_RESTRICTED,
 			 ASTLoweringSimplePath::translate (vis.get_path ()),
 			 vis.get_locus ());
       break;
diff --git a/gcc/rust/hir/tree/rust-hir-visibility.h b/gcc/rust/hir/tree/rust-hir-visibility.h
--- a/gcc/rust/hir/tree/rust-hir-visibility.h
+++ b/gcc/rust/hir/tree/rust-hir-visibility.h
@@ -29,10 +29,10 @@ struct Visibility
 public:
   enum VisType
   {
-    PRIVATE,
-    PUBLIC,
-    RESTRICTED,
-    ERROR,
+    HIR_VIS_PRIVATE,
+    HIR_VIS_PUBLIC,
+    HIR_VIS_RESTRICTED,
+    HIR_VIS_ERROR,
   };
 
 private:
@@ -50,18 +50,18 @@ public:
   {}
 
   // Returns whether visibility is in an error state.
-  bool is_error () const { return vis_type == ERROR; }
+  bool is_error () const { return vis_type == HIR_VIS_ERROR; }
 
   // Does the current visibility refer to a simple `pub <item>` entirely public
-  bool is_public () const { return vis_type == PUBLIC; }
+  bool is_public () const { return vis_type == HIR_VIS_PUBLIC; }
 
   // Is the current visibility public restricted to a certain path
-  bool is_restricted () const { return vis_type == RESTRICTED; }
+  bool is_restricted () const { return vis_type == HIR_VIS_RESTRICTED; }
 
   // Creates an error visibility.
   static Visibility create_error ()
   {
-    return Visibility (ERROR, HIR::SimplePath::create_empty ());
+    return Visibility (HIR_VIS_ERROR, HIR::SimplePath::create_empty ());
   }
 
   VisType get_vis_type () const { return vis_type; }
diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc
--- a/gcc/rust/hir/tree/rust-hir.cc
+++ b/gcc/rust/hir/tree/rust-hir.cc
@@ -164,11 +164,11 @@ Visibility::to_string () const
 {
   switch (vis_type)
     {
-    case PRIVATE:
+    case HIR_VIS_PRIVATE:
       return std::string ("private");
-    case PUBLIC:
+    case HIR_VIS_PUBLIC:
       return std::string ("pub");
-    case RESTRICTED:
+    case HIR_VIS_RESTRICTED:
       return std::string ("pub(in ") + path.get_mappings ().as_string ()
 	     + std::string (")");
     default:
diff --git a/gcc/rust/metadata/rust-export-metadata.cc b/gcc/rust/metadata/rust-export-metadata.cc
--- a/gcc/rust/metadata/rust-export-metadata.cc
+++ b/gcc/rust/metadata/rust-export-metadata.cc
@@ -344,7 +344,7 @@ PublicInterface::is_crate_public (const 
   const HIR::Visibility &visibility = item.get_visibility ();
 
   bool is_public
-    = visibility.get_vis_type () == HIR::Visibility::VisType::PUBLIC;
+    = visibility.get_vis_type () == HIR::Visibility::VisType::HIR_VIS_PUBLIC;
   bool has_path = !visibility.get_path ().is_error ();
 
   // FIXME this might be pub(crate)
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -105,7 +105,7 @@ Mappings::Mappings ()
   builtinMarker
     = new HIR::ImplBlock (node, {}, {}, nullptr, nullptr, HIR::WhereClause ({}),
 			  BoundPolarity::RegularBound,
-			  HIR::Visibility (HIR::Visibility::VisType::PUBLIC),
+			  HIR::Visibility (HIR::Visibility::VisType::HIR_VIS_PUBLIC),
 			  {}, {}, UNDEF_LOCATION);
 }
 

Reply via email to