[libcxx-commits] [clang] [libcxx] [clang] Enable GNU __attribute__((init_priority(...))) on z/OS. (PR #199573)
Zibi Sarbinowski via libcxx-commits
libcxx-commits at lists.llvm.org
Wed May 27 05:44:31 PDT 2026
https://github.com/zibi2 updated https://github.com/llvm/llvm-project/pull/199573
>From b741afed58a69460bbe4d9979f8143993fd801cf Mon Sep 17 00:00:00 2001
From: Zibi Sarbinowski <zibi at ca.ibm.com>
Date: Mon, 25 May 2026 16:08:25 -0400
Subject: [PATCH 1/4] Revert "Guard init_priority attribute within libc++"
This reverts commit 2c7e24c4b6893a93ddb2b2cca91eaf5bf7956965.
Conflicts:
clang/include/clang/Basic/Attr.td
clang/test/SemaCXX/init-priority-attr.cpp
libcxx/include/__config
libcxx/src/experimental/memory_resource.cpp
libcxx/src/iostream.cpp
---
clang/include/clang/Basic/Attr.td | 6 +----
clang/include/clang/Basic/AttrDocs.td | 2 +-
clang/test/SemaCXX/init-priority-attr.cpp | 32 +++++------------------
libcxx/src/iostream_init.h | 2 +-
4 files changed, 9 insertions(+), 33 deletions(-)
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
index 70b5773f95b08..32f72e8da960e 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -535,10 +535,6 @@ def TargetWindowsArm64EC : TargetSpec {
let CustomCode = [{ Target.getTriple().isWindowsArm64EC() }];
}
-def TargetSupportsInitPriority : TargetSpec {
- let CustomCode = [{ !Target.getTriple().isOSzOS() }];
-}
-
class TargetSpecificSpelling<TargetSpec target, list<Spelling> spellings> {
TargetSpec Target = target;
list<Spelling> Spellings = spellings;
@@ -3323,7 +3319,7 @@ def WorkGroupSizeHint : InheritableAttr {
let Documentation = [Undocumented];
}
-def InitPriority : InheritableAttr, TargetSpecificAttr<TargetSupportsInitPriority> {
+def InitPriority : InheritableAttr {
let Spellings = [GCC<"init_priority", /*AllowInC*/0>];
let Args = [UnsignedArgument<"Priority">];
let Subjects = SubjectList<[Var], ErrorDiag>;
diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td
index 87b9053be7cb6..6eae86b7f7f16 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -158,7 +158,7 @@ On MachO platforms, this attribute also does not control the order of initializa
across translation units, where it only affects the order within a single TU.
This attribute is only supported for C++ and Objective-C++ and is ignored in
-other language modes. Currently, this attribute is not implemented on z/OS.
+other language modes.
}];
}
diff --git a/clang/test/SemaCXX/init-priority-attr.cpp b/clang/test/SemaCXX/init-priority-attr.cpp
index c5fab7b42502e..9d574e0fb8654 100644
--- a/clang/test/SemaCXX/init-priority-attr.cpp
+++ b/clang/test/SemaCXX/init-priority-attr.cpp
@@ -1,8 +1,5 @@
-// RUN: %clang_cc1 -triple=x86_64-unknown-unknown -fsyntax-only -verify %s
-// RUN: %clang_cc1 -triple=x86_64-unknown-unknown -fsyntax-only -DSYSTEM -verify %s
-// RUN: %clang_cc1 -triple=x86_64-unknown-unknown -fsyntax-only -DNOERROR -Wno-error=init-priority-reserved -verify %s
-// RUN: %clang_cc1 -triple=s390x-none-zos -fsyntax-only -verify=unknown %s
-// RUN: %clang_cc1 -triple=s390x-none-zos -fsyntax-only -DSYSTEM -verify=unknown-system %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -DSYSTEM -verify %s
#if defined(SYSTEM)
#5 "init-priority-attr.cpp" 3 // system header
@@ -28,42 +25,25 @@ extern Two koo[];
// unknown-system-no-diagnostics
Two foo __attribute__((init_priority(101))) ( 5, 6 );
-// unknown-warning at -1 {{unknown attribute 'init_priority' ignored}}
-
-Two loo __attribute__((init_priority(65535))) ( 5, 6 );
-// unknown-warning at -1 {{unknown attribute 'init_priority' ignored}}
Two goo __attribute__((init_priority(2,3))) ( 5, 6 ); // expected-error {{'init_priority' attribute takes one argument}}
-// unknown-warning at -1 {{unknown attribute 'init_priority' ignored}}
Two coo[2] __attribute__((init_priority(100)));
#if !defined(SYSTEM)
-#if !defined(NOERROR)
- // expected-error at -3 {{requested 'init_priority' 100 is reserved for internal use}}
-#else // defined(NOERROR)
- // expected-warning at -5 {{requested 'init_priority' 100 is reserved for internal use}}
-#endif // !defined(NOERROR)
- // unknown-warning at -7 {{unknown attribute 'init_priority' ignored}}
-#endif // !defined(SYSTEM)
-
-Two zoo[2] __attribute__((init_priority(-1))); // expected-error {{'init_priority' attribute requires integer constant between 0 and 65535 inclusive}}
-// unknown-warning at -1 {{unknown attribute 'init_priority' ignored}}
+// expected-error at -2 {{'init_priority' 100 is reserved for internal use}}
+#endif
-Two boo[2] __attribute__((init_priority(65536))); // expected-error {{'init_priority' attribute requires integer constant between 0 and 65535 inclusive}}
-// unknown-warning at -1 {{unknown attribute 'init_priority' ignored}}
+Two boo[2] __attribute__((init_priority(65536)));
+// expected-error at -1 {{'init_priority' attribute requires integer constant between 0 and 65535 inclusive}}
Two koo[4] __attribute__((init_priority(1.13))); // expected-error {{'init_priority' attribute requires an integer constant}}
-// unknown-warning at -1 {{unknown attribute 'init_priority' ignored}}
Two func() __attribute__((init_priority(1001))); // expected-error {{'init_priority' attribute only applies to variables}}
-// unknown-warning at -1 {{unknown attribute 'init_priority' ignored}}
int i __attribute__((init_priority(1001))); // expected-error {{can only use 'init_priority' attribute on file-scope definitions of objects of class type}}
-// unknown-warning at -1 {{unknown attribute 'init_priority' ignored}}
int main() {
Two foo __attribute__((init_priority(1001))); // expected-error {{can only use 'init_priority' attribute on file-scope definitions of objects of class type}}
-// unknown-warning at -1 {{unknown attribute 'init_priority' ignored}}
}
struct S1 {} s1;
diff --git a/libcxx/src/iostream_init.h b/libcxx/src/iostream_init.h
index 7d1bb5c2d7d87..ac1961edab9e1 100644
--- a/libcxx/src/iostream_init.h
+++ b/libcxx/src/iostream_init.h
@@ -1,2 +1,2 @@
#pragma GCC system_header
-_LIBCPP_HIDDEN ios_base::Init __start_std_streams _LIBCPP_INIT_PRIORITY_MAX;
+_LIBCPP_HIDDEN ios_base::Init __start_std_streams __attribute__((init_priority(101)));
>From 429b563b8ff4a289b716da3edccbfc363aadd48f Mon Sep 17 00:00:00 2001
From: Zibi Sarbinowski <zibi at ca.ibm.com>
Date: Tue, 26 May 2026 09:33:34 -0400
Subject: [PATCH 2/4] Using _LIBCPP_INIT_PRIORITY_MAX macro is preferable
---
libcxx/src/iostream_init.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libcxx/src/iostream_init.h b/libcxx/src/iostream_init.h
index ac1961edab9e1..7d1bb5c2d7d87 100644
--- a/libcxx/src/iostream_init.h
+++ b/libcxx/src/iostream_init.h
@@ -1,2 +1,2 @@
#pragma GCC system_header
-_LIBCPP_HIDDEN ios_base::Init __start_std_streams __attribute__((init_priority(101)));
+_LIBCPP_HIDDEN ios_base::Init __start_std_streams _LIBCPP_INIT_PRIORITY_MAX;
>From 8ddc4864ab4628c8382e18737ac6d5ef8781caf9 Mon Sep 17 00:00:00 2001
From: Zibi Sarbinowski <zibi at ca.ibm.com>
Date: Tue, 26 May 2026 13:49:03 -0400
Subject: [PATCH 3/4] Add a deleted variation of the lit back
---
clang/test/SemaCXX/init-priority-attr.cpp | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/clang/test/SemaCXX/init-priority-attr.cpp b/clang/test/SemaCXX/init-priority-attr.cpp
index 9d574e0fb8654..585b4cb70fcc3 100644
--- a/clang/test/SemaCXX/init-priority-attr.cpp
+++ b/clang/test/SemaCXX/init-priority-attr.cpp
@@ -1,5 +1,6 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
// RUN: %clang_cc1 -fsyntax-only -DSYSTEM -verify %s
+// RUN: %clang_cc1 -fsyntax-only -DNOERROR -Wno-error=init-priority-reserved -verify %s
#if defined(SYSTEM)
#5 "init-priority-attr.cpp" 3 // system header
@@ -29,8 +30,10 @@ Two foo __attribute__((init_priority(101))) ( 5, 6 );
Two goo __attribute__((init_priority(2,3))) ( 5, 6 ); // expected-error {{'init_priority' attribute takes one argument}}
Two coo[2] __attribute__((init_priority(100)));
-#if !defined(SYSTEM)
-// expected-error at -2 {{'init_priority' 100 is reserved for internal use}}
+#if defined(NOERROR)
+// expected-warning at -2 {{requested 'init_priority' 100 is reserved for internal use}}
+#elif !defined(SYSTEM)
+// expected-error at -4 {{requested 'init_priority' 100 is reserved for internal use}}
#endif
Two boo[2] __attribute__((init_priority(65536)));
>From e70cd8b793c48bc3cd289c7eb2aedc769b939010 Mon Sep 17 00:00:00 2001
From: Zibi Sarbinowski <zibi at ca.ibm.com>
Date: Wed, 27 May 2026 08:44:11 -0400
Subject: [PATCH 4/4] Make the diff smaller
---
clang/test/SemaCXX/init-priority-attr.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/test/SemaCXX/init-priority-attr.cpp b/clang/test/SemaCXX/init-priority-attr.cpp
index 585b4cb70fcc3..a51bf4be4ac26 100644
--- a/clang/test/SemaCXX/init-priority-attr.cpp
+++ b/clang/test/SemaCXX/init-priority-attr.cpp
@@ -35,9 +35,9 @@ Two coo[2] __attribute__((init_priority(100)));
#elif !defined(SYSTEM)
// expected-error at -4 {{requested 'init_priority' 100 is reserved for internal use}}
#endif
+Two zoo[2] __attribute__((init_priority(-1))); // expected-error {{'init_priority' attribute requires integer constant between 0 and 65535 inclusive}}
-Two boo[2] __attribute__((init_priority(65536)));
-// expected-error at -1 {{'init_priority' attribute requires integer constant between 0 and 65535 inclusive}}
+Two boo[2] __attribute__((init_priority(65536))); // expected-error {{'init_priority' attribute requires integer constant between 0 and 65535 inclusive}}
Two koo[4] __attribute__((init_priority(1.13))); // expected-error {{'init_priority' attribute requires an integer constant}}
More information about the libcxx-commits
mailing list