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);
}